top 10 selenium exceptions
Maneig d’excepcions de Selenium WebDriver mitjançant un marc de maneig d’excepcions: tutorial Selenium # 19
Obtenir una excepció en el codi d’automatització és molt comú. 'Excepció', tal com indica la paraula, és un cas especial o poc freqüent.
L'execució del codi d'automatització normalment no es pot dur a terme com s'esperava a causa de molts factors implicats en l'execució, com ara problemes d'estabilitat de xarxa, problemes d'Internet, estabilitat del servidor, etc. Podríem obtenir excepcions a causa d'un temps d'espera insuficient o de sintaxis, paràmetres incorrectes, etc.
A l’últim tutorial de WebDriver, vam aprendre sobre 3 tipus diferents d’elements web importants com ara Taules web, marcs i elements dinàmics i els seus mecanismes de maneig en escriptura de seleni
Abans de seguir endavant amb els tutorials de Framework en aquest Formació en seleni sèrie, aquí en aquest tutorial coneixerem tipus d'excepcions i com gestionar les excepcions en scripts Java i Selenium . Els desenvolupadors / verificadors utilitzen un marc de gestió d’excepcions per gestionar una excepció en scripts de seleni.
Què aprendreu:
- Què és una excepció?
- Avantatges i desavantatges de l'enfocament Avoid-Handle
- Tipus d’excepcions a Java i Seleni
- Manipulació d’excepcions
- Excepcions habituals a Selenium WebDriver
- Evitar i gestionar excepcions comunes
- # 1) org.openqa.selenium.NoSuchElementException
- # 2) org.openqa.selenium.NoSuchWindowException
- # 3) org.openqa.selenium.NoSuchFrameException
- # 4) org.openqa.selenium.NoAlertPresentException
- # 5) org.openqa.selenium.InvalidSelectorException
- # 6) org.openqa.selenium.ElementNotVisibleException
- # 7) org.openqa.selenium.ElementNotSelectableException
- # 8) org.openqa.selenium.TimeoutException
- # 9) org.openqa.selenium.NoSuchSessionException
- # 10) org.openqa.selenium.StaleElementReferenceException
- Conclusió
- Lectura recomanada
Què és una excepció?
Les excepcions són esdeveniments a causa dels quals el programa Java finalitza bruscament sense donar la sortida esperada. Java proporciona un marc on un usuari pot gestionar excepcions.
El procés de gestió d’excepcions s’anomena Gestió d’excepcions.
Cal gestionar les excepcions perquè trenquen el flux normal d’execució d’un programa. Una de les intencions importants del tractament d’excepcions és evitar aquest trencament i continuar l’execució del programa. De vegades, és possible que vulgueu dur a terme algunes sèries d'accions quan es produeixi una excepció determinada.
Quan es produeix una excepció, es crea un objecte d’excepció que tècnicament es denomina ‘ Llançar una excepció » i afegim Prova / Atrapa blocs com,
try { // Protected code } catch (ExceptionName e) { // Catch block }
# 1) El fragment de codi que pot generar una excepció s'afegeix dins del bloc Prova.
# 2) La sentència Catch captura l'excepció i la pren com a paràmetre.
# 3) Quan no es produeix cap excepció, s'executa la sentència try i no la sentència catch.
Exemple : Quan el guió de seleni falla a causa d'un localitzador incorrecte, el desenvolupador hauria de ser capaç d'entendre el motiu del fracàs i això es pot aconseguir fàcilment si l'excepció es gestiona correctament al programa.
Segons la meva experiència, el millor és intentar evitar les excepcions de WebDriver sempre que sigui possible i detectar casos realment excepcionals. Utilitzeu try / catch per gestionar coses que no funcionen correctament i que estan fora del meu control.
Eviteu els que puc atrapar els altres.
Aquesta és la millor estratègia que m’ha funcionat.
Per exemple, tingueu en compte una pàgina de prova que trigui més del normal a carregar-se en un servidor de prova. Tindrem excepcions freqüents mentre fem accions en aquesta pàgina. Per tant, en lloc d’agafar-ho cada vegada, podem
- Afegiu una ordre d'espera i intenteu evitar una excepció
- Utilitzeu 'Prova / Captura' per gestionar si s'ha produït un cas realment excepcional
D’aquesta manera es redueixen les possibilitats d’excepcions.
Avantatges i desavantatges de l'enfocament Avoid-Handle
Avantatges | Desavantatges |
---|---|
1) Aquest enfocament redueix les possibilitats d'obtenir excepcions. | 1) Augmenta les línies de codis perquè afegiu codi addicional per evitar excepcions |
Si encara es detecta una excepció, 2) seria un cas realment excepcional que val la pena comprovar | 2) Hauria de comprendre millor l'API del controlador web, les ordres i les excepcions |
Reduïu el temps de depuració. El codi d'automatització està dissenyat per trobar errors i no voleu veure massa excepcions 3) no desitjades i trobar els motius que hi ha darrere de cadascuna d'elles. | |
4) Al bloc Catch, tractareu casos més vàlids | |
5) Reduïu les falles falses | |
6) Informe més clar |
En aquest tutorial, en parlarem Evita-i-maneja enfocament de les 10 excepcions més comunes a Selenium WebDriver. Abans d’això, obtinguem una comprensió bàsica dels blocs de Gestió d’excepcions i de Prova / Captura.
Tipus d’excepcions a Java i Seleni
A continuació hem descrit els tipus d’excepcions i les diferents maneres de fer servir el marc de gestió d’excepcions en scripts de seleni.
Hi ha tres tipus d’excepcions:
- Excepció marcada
- Excepció sense marcar
- error
La jerarquia de classes d’excepció i error:
# 1) Excepció marcada: L'excepció comprovada es gestiona durant el temps de compilació i proporciona l'error de compilació si no es detecta i es gestiona durant el temps de compilació.
Exemple : FileNotFoundException , IOException etc.
# 2) Excepció sense marcar: En cas de l'excepció no marcada, un compilador no mana gestionar-lo. El compilador ignora durant el temps de compilació.
Exemple : ArrayIndexoutOfBoundException
# 3) Error: Quan un escenari és fatal i el programa no es pot recuperar, la JVM genera un error. El bloc try-catch no pot gestionar els errors. Fins i tot si l’usuari intenta gestionar l’error mitjançant el bloc Try catch, no es pot recuperar de l’error.
Exemple : Error d’afirmació , OutOfMemoryError etc.
Manipulació d’excepcions
Prova i captura el bloc:
intentar atrapar els blocs s’utilitzen generalment per gestionar excepcions. El tipus d’excepcions es declara al bloc de captures que s’espera que arribi. Quan apareix una excepció en el bloc de prova, controleu immediatament els moviments per atrapar el bloc.
Exemple :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); }
Hi pot haver diversos blocs de captura per a un bloc de prova en funció del tipus d’excepció.
Exemple :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); } catch(FileNotFoundException file){ file.printStackTrace(); }
llança Excepció:
llança La paraula clau java s'utilitza per generar una excepció en lloc de gestionar-la. Totes les excepcions marcades es poden generar per mètodes.
Exemple :
public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new FileReader('Data')); while ((line = br.readLine()) != null) { System.out.println(line); } }
finalment bloc:
finalment , el bloc s'executa independentment de l'execució del bloc try-catch i s'executa immediatament després de completar el bloc try / catch.
Bàsicament, es pot tancar el tancament de fitxers, la connexió a la base de dades, etc.
Exemple :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); } Finally { br.close(); }
A l'exemple anterior, Líder de memòria intermèdia el flux es tanca al bloc finalment. br.close () sempre s'executarà independentment de l'execució del bloc try and catch.
Nota : finalment el bloc pot existir sense cap bloc de captura. No cal tenir sempre un bloc de captura.
Hi pot haver molts blocs de captura, però només es pot utilitzar un bloc.
Llançable : Throwable és una classe pare per error i excepció. En general, és difícil gestionar els errors a Java. Si un programador no està segur del tipus d'error i excepció, es recomana utilitzar la classe Throwable, que pot detectar tant errors com excepcions.
Exemple :
try { br = new BufferedReader(new FileReader('Data')); } catch (Throwable t) { t.printStackTrace(); }
Excepcions habituals a Selenium WebDriver
El seleni té el seu propi conjunt d’excepcions. Mentre desenvolupa seqüències d’ordres de seleni, un programador ha de gestionar o fer aquestes excepcions.
A continuació es mostren alguns exemples d’excepcions en seleni:
Totes les classes d’excepció en temps d’execució a Selenium WebDriver pertanyen a la superclasse WebDriverException.
Tot i que hi ha moltes classes d’excepcions a WebDriverException, normalment les veiem a continuació.
- NoSuchElementException
- NoSuchWindowException
- NoSuchFrameException
- NoAlertPresentException
- InvalidSelectorException
- ElementNotVisibleException
- ElementNotSelectableException
- TimeoutException
- NoSuchSessionException
- StaleElementReferenceException
Detalls :
ElementNotVisibleException : Si el seleni intenta trobar un element però l'element no és visible a la pàgina
NoAlertPresentException : Si un usuari intenta gestionar un quadre d'alerta però l'alerta no és present.
NoSuchAttributeException : Mentre intenteu obtenir el valor de l'atribut, però l'atribut no està disponible a DOM.
NoSuchElementException : Aquesta excepció es deu a l'accés a un element que no està disponible a la pàgina.
WebDriverException : L'excepció es produeix quan un codi no pot inicialitzar WebDriver.
Evitar i gestionar excepcions comunes
Analitzem l'enfocament d'evitar-i-manejar les excepcions esmentades anteriorment:
# 1) org.openqa.selenium.NoSuchElementException
Aquesta classe d'excepció que es veu habitualment és una subclasse de NotFoundException classe. L'excepció es produeix quan WebDriver no pot trobar i localitzar elements.
el millor programari de còpia de seguretat per a Windows 10 gratuït
Normalment, això passa quan el provador escriu un localitzador d'elements incorrecte al mètode findElement (By, by).
Tingueu en compte que a l'exemple següent, l'identificador correcte del camp de text era 'firstfield', però el provador el va mencionar incorrectament com a 'fistfield'. En aquest cas, WebDriver no pot localitzar l'element i org.openqa.selenium.NoSuchElementException serà llançat
driver.findElement(By.id('submit')).click(); Exception Handling: try { driver.findElement(By.id('submit')).click(); } catch (NoSuchElementException e)
En aquest cas, l'excepció es genera fins i tot si no es carrega l'element.
Evitar-i-manipular : Proveu de donar una ordre d'espera.
Exemple: L'ordre d'espera següent espera 10 segons la presència d'un element web amb l'identificador 'enviar'. Després intenta fer-hi clic. Si l'element està disponible però el clic falla, es detecta una excepció.
L’ús de temps retardat és una pràctica habitual en l’automatització de proves per crear una pausa entre els passos. En afegir un Try / Catch, ens assegurem que el programa continuï fins i tot si l’espera no ha pogut ajudar.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.presenceOfElementLocated(By.id('submit'))); try { driver.findElement(By.id('submit')).click(); } catch (WebDriverException e) { System.out.println(“An exceptional case.”); } } catch (TimeOutException e) { System.out.println(“WebDriver couldn’t locate the element”); }
# 2) org.openqa.selenium.NoSuchWindowException
NoSuchWindowException entra sota NotFoundException classe. Això es produeix quan WebDriver intenta canviar a una finestra no vàlida.
El codi següent pot generar org.openqa.selenium.NoSuchWindowException si el controlador de la finestra no existeix o no està disponible per canviar-lo.
driver.switchTo (). window (handle_1);
Evitar-i-manipular : Utilitzaríem nanses de finestres per obtenir el conjunt de finestres actives i, a continuació, realitzarem accions al mateix.
A l'exemple següent, per a cada controlador de finestra, s'executa el canvi de controlador a. Per tant, es redueixen les possibilitats de passar un paràmetre de finestra incorrecte.
for (String handle : driver.getWindowHandles()) { try { driver.switchTo().window(handle); } catch (NoSuchWindowException e) { System.out.println(“An exceptional case”); } }
# 3) org.openqa.selenium.NoSuchFrameException
Quan WebDriver intenta canviar a un marc no vàlid, es llença NoSuchFrameException a la classe NotFoundException.
El codi següent pot generar org.openqa.selenium.NoSuchFrameException si no existeix un marc 'frame_11' o no està disponible.
driver.switchTo (). frame ('frame_11');
Gestió d'excepcions:
try { driver.switchTo().frame('frame_11'); } catch (NoSuchFrameException e)
En aquest cas, l'excepció es genera fins i tot si no es carrega el marc.
Evitar-i-manipular : Intenteu donar una ordre d'espera.
A l'exemple següent, WebDriver espera durant 10 segons perquè el marc estigui disponible. Si el marc està disponible i encara hi ha una excepció, es captura.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.frameToBeAvaliableAndSwitchToIt(frame_11)); try { driver.switchTo().frame('frame_11'); } catch (WebDriverException e) { System.out.println(“An exceptional case”); } } catch (TimeOutException e) { System.out.println(“WebDriver couldn’t locate the frame”); }
# 4) org.openqa.selenium.NoAlertPresentException
NoAlertPresentException sota NotFoundException es llança quan WebDriver intenta canviar a una alerta, que no està disponible.
org.openqa.selenium.NoAlertPresentException es llançarà Si a sota del codi d'automatització les trucades accept () operen a la classe Alert () quan encara no apareix una alerta a la pantalla.
driver.switchTo (). alert (). accept ();
Gestió d'excepcions:
try { driver.switchTo().alert().accept(); } catch (NoSuchAlertException e)
En aquest cas, l'excepció es genera fins i tot si l'alerta no es carrega completament.
Evitar-i-manipular : Utilitzeu sempre una espera explícita o fluida durant un temps concret en tots els casos en què s’espera una alerta. Si l’alerta està disponible i encara hi ha una excepció, es detecta.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.alertIsPresent()); try { driver.switchTo().alert().accept(); } catch (NoAlertPresentException e) { System.out.println(“An exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver couldn’t locate the Alert”); }
# 5) org.openqa.selenium.InvalidSelectorException
Aquesta subclasse de NoSuchElementException La classe es produeix quan un selector és incorrecte o no és vàlid sintàcticament. Aquesta excepció es produeix habitualment quan s'utilitza el localitzador XPATH.
Considereu l'exemple següent:
feu clic a XPathButtonAndWait ('botó // [@ type = 'button'] [100]');
Això generaria una InvalidSelectorExeption perquè la sintaxi XPATH és incorrecta.
Evitar i manipular : Per evitar-ho, hauríem de comprovar el localitzador utilitzat perquè és probable que el localitzador sigui incorrecte o que la sintaxi sigui incorrecta. L’ús de Firebug per trobar xpath pot reduir aquesta excepció.
El codi següent mostra com gestionar-lo mitjançant Try / Catch
try { clickXPathButtonAndWait('//button[@type='button']'); } catch (InvalidSelectorException e) { }
# 6) org.openqa.selenium.ElementNotVisibleException
ElementNotVisibleException és una subclasse de ElementNotInteractableException classe. Aquesta excepció es produeix quan WebDriver intenta realitzar una acció sobre un element web invisible, amb el qual no es pot interactuar. És a dir, l'element web es troba en un estat ocult.
Per exemple, al codi següent, si el tipus de botó amb l'identificador 'enviar' està 'ocult' a HTML, org.openqa.selenium.ElementNotVisibleException serà llançat.
driver.findElement(By.id('submit')).click(); Exception Handling: try { driver.findElement(By.id('submit')).click(); } catch (ElementNotVisibleException e)
En aquest cas, l'excepció es genera fins i tot si la pàgina no s'ha carregat completament.
Evitar-i-manipular : Hi ha dues maneres de fer-ho. Podem fer servir espera fins que l'element s'obté completament.
El codi següent espera 10 segons per l'element. Si l'element és visible i es produeix una excepció, es captura.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.visibilityOfElementLocated(By.id(”submit”)); try { driver.findElement(By.id('submit')).click(); } catch (WebDriverException e) { System.out.println(“Exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver couldn’t find this element visible”); }
# 7) org.openqa.selenium.ElementNotSelectableException
Aquesta excepció es troba sota InvalidElementStateException classe . ElementNotSelectableException indica que l'element web està present a la pàgina web però no es pot seleccionar.
Per exemple, el codi següent pot generar una excepció ElementNotSelectableException si l'identificador 'swift' està desactivat.
Menú desplegable Select = nou Select (driver.findElement (By.id ('ràpid')));
Gestió d'excepcions:
provar {
Menú desplegable Select = nou Select (driver.findElement (By.id ('ràpid')));
} catch (ElementNotSelectableException e)
En aquest cas, l'excepció es genera fins i tot si l'element s'activa després d'un temps.
Evitar-i-manipular : Podem afegir una ordre d'espera per esperar fins que l'element es faci clic. Si encara hi ha una excepció, es captura.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions. elementToBeClickable(By.id(”swift”)); try { Select dropdown = new Select(driver.findElement(By.id('swift'))); } catch (WebDriverException e) { System.out.println(“Exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver found that this element was not selectable.”); }
# 8) org.openqa.selenium .TimeoutException
Aquesta excepció es produeix quan la finalització de l'ordre supera el temps d'espera. Les esperes s'utilitzen principalment a WebDriver per evitar l'excepció ElementNotVisibleException.
De vegades, pot ser que la pàgina de prova no es carregui completament abans de la següent ordre del programa. Si WebDriver intenta trobar un element a la pàgina web abans que la pàgina es carregui completament, es llança l'excepció ElementNotVisibleException. Per evitar aquesta excepció, s'afegeixen ordres d'espera.
Tanmateix, si els components no es carreguen fins i tot després de l’espera, l’excepció org.openqa.selenium .TimeoutException serà llançat.
driver.manage (). timeouts (). Implícitament Espera (10, TimeUnit.SECONDS);
driver.get ('https://www.softwaretestinghelp.com');
Al programa anterior s’afegeix una espera implícita de 10 segons. Si la pàgina www.softwaretestinghelp.com no es carrega en 10 segons i es llança TimeoutException.
Evitar i manipular : Per evitar-ho, podem comprovar manualment el temps mitjà per carregar una pàgina i ajustar l'espera
O bé, podem afegir una espera explícita mitjançant l’executor JavaScript fins que es carregui la pàgina.
A l'exemple següent, s'utilitza l'executor JavaScript. Després de navegar per la pàgina, anomenem JavaScript return document.readyState durant 20 segons fins que es retorni el text 'complet'.
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); wait.until(webDriver -> ((JavascriptExecutor)webDriver).executeScript('return document.readyState').equals('complete')); driver.get('https://www.softwaretestinghelp.com');
# 9) org.openqa.selenium.NoSuchSessionException
Aquesta excepció es produeix quan es demana un mètode després de sortir del navegador per WebDriver.quit (). Això també pot passar a causa de problemes del navegador web, com ara bloquejos i WebDriver no pot executar cap ordre mitjançant la instància del controlador.
Per veure aquesta excepció, es pot executar el codi següent.
driver.quit ()
Menú desplegable Select = nou Select (driver.findElement (By.id ('ràpid')));
Evitar i manipular : Trieu sempre la darrera versió estable del navegador per executar les proves de Selenium Webdriver.
Aquesta excepció es pot reduir utilitzant driver.quit () en finalitzar totes les proves. No intenteu utilitzar-los després de cada cas de prova. Això pot provocar problemes quan la instància del controlador és nul·la i els propers casos de prova intenten utilitzar-la sense inicialitzar-la.
El codi següent crea la instància de WebDriver a l’anotació @BeforeSuite TestiNG i la destrueix a l’anotació @AfterSuite TestiNG
@BeforeSuite public void setUp() throws MalformedURLException { WebDriver driver = new FirefoxDriver(); } @AfterSuite public void testDown() { driver.quit(); }
# 10) org.openqa.selenium.StaleElementReferenceException
Aquesta excepció indica que un element web ja no està present a la pàgina web.
Aquest error no és el mateix que ElementNotVisibleException.
StaleElementReferenceException es llança quan es va crear un objecte per a un element web concret al programa sense cap problema; aquest element ja no és present a la finestra. Això pot passar si n'hi hagués
- Navegació cap a una altra pàgina
- DOM s'ha actualitzat
- Un interruptor de quadre o finestra
WebElement firstName = driver.findElement (By.id ('firstname'));
driver.switchTo (). window (Finestra_infant);
element.sendKeys ('Aaron');
Al codi anterior, es va crear l'objecte firstName i després es va canviar la finestra. A continuació, WebDriver intenta escriure 'Aaron' al camp del formulari. En aquest cas es llença StaleElementReferenceException.
Evitar i manipular : Confirmeu que estem intentant fer l'acció a la finestra correcta. Per evitar problemes a causa de l’actualització de DOM, podem utilitzar Dynamic Xpath
Parlem d’un altre exemple.
Digueu que 'identificador' d'un camp de nom d'usuari és 'nom d'usuari_1' i que serà XPath // * [@ id = ’firstname_1?] . Quan torneu a obrir la pàgina, l'identificador pot canviar i dir ' 'nom _11 ’. En aquest cas, la prova fallarà perquè WebDriver no ha pogut trobar l'element. En aquest cas, es llançarà StaleElementReferenceException.
En aquest cas, podem utilitzar un xpath dinàmic com,
try { driver.findElement(By.xpath(“//*[contains(@id,firstname’)]”)).sendKeys(“Aaron”); } catch (StaleElementReferenceException e)
A l'exemple anterior s'utilitza XPATH dinàmic i, si encara es troba l'excepció, es captura.
Conclusió
El maneig d’excepcions és la part essencial de tots els programes java i de l’escriptura de seleni. Podem crear un codi robust i òptim mitjançant gestionant una excepció de maneres intel·ligents . I també és una bona pràctica gestionar excepcions en un script que us proporcionarà un informe millor quan un programa falla per qualsevol motiu.
Aquí hem intentat cobrir el procés i el marc de tractament d'excepcions que cal implementar en scripts de seleni.
Recordeu que no és obligatori gestionar sempre l'excepció en un fitxer intentar atrapar bloc. També podeu llançar una excepció en funció del requisit d'un script.
No s'ha d'ignorar una excepció, ja que trenca l'execució del programa. En aquest tutorial, hem passat per diferents excepcions i maneres de reduir les possibilitats d’obtenir-les mitjançant controls i codis manuals.
Si afegiu esperes es pot controlar alguns casos com ara 'NoSuchElementException', 'ElementNotFoundException', 'ElementNotVisibleException'.
Pròxim tutorial núm. 20 : En el proper tutorial, parlaríem de hi ha disponibles diversos tipus de marcs de proves . També estudiaríem els pros i els contres d’utilitzar un enfocament de marc desenvolupat a les proves d’automatització. Discutirem detalladament sobre el marc basat en dades de proves.
Si us plau, publiqueu les vostres consultes relacionades amb la gestió d’excepcions a Selenium WebDriver.
Lectura recomanada
- Excepcions de Java i tractament d’excepcions amb exemples
- Com gestionar les alertes / finestres emergents a Selenium WebDriver - Selenium Tutorial # 16
- Tutorial d'AutoIt: descàrrega, instal·lació i script bàsic d'AutoIt d'AutoIt
- Tutorial de Cogombre Selenium: Integració de Cogombre Java Selenium WebDriver
- Integració de seleni amb JMeter
- Introducció a Selenium WebDriver - Tutorial Selenium # 8
- 30+ millors tutorials sobre seleni: apreneu el seleni amb exemples reals
- Oportunitat de treball autònom a temps parcial per a experts en seleni