Erandi käsitlemine Selenium Veebidraiver (tüübid)

⚡ Nutikas kokkuvõte

Erandi käsitlemine Selenium WebDriver hoiab nurjunud käsku stop-käsultping terve katsesõit. Java try-catch, mitu catch blokki, throw, throws ja lõpuks igaüks neist annab skriptile erineva viisi taastumiseks.

  • 🔘 Määratlus: Erand on programmi käivitamise ajal tekkiv viga ja käsitlemata viga põhjustab programmi krahhi.
  • ☑️ Reguleerimisala: Selenium WebDriver pakub enam kui neljakümmet erandiklassi ja igaüks neist põlvneb WebDriverExceptionist.
  • Sagedased rikkujad: Enamiku reaalsetest tõrketest põhjustavad NoSuchElementException, TimeoutException, StaleElementReferenceException ja ElementNotInteractableException.
  • 🧪 Käitlemine: Try-catch paar isoleerib ühe veatüübi, mitu catch plokki eraldavad mitut ja lõpuks alati käivitub.
  • 🛠️ Eskalatsioon: Märksõnad „throw” ja „throws” edastavad helistajale erandi, kui praegune meetod seda lahendada ei suuda.
  • 📊 Diagnoos: printStackTrace(), toString() ja getMessage() annavad veast erineva detailsuse taseme.

Erandi käsitlemine Selenium WebDriver koos try-catch, throw ja finally käsklustega

Mis on erand?

Erand on viga, mis ilmneb programmi käivitamise ajal. Programmi töötamise ajal genereerib programmeerimiskeel erandi, mis tuleb lahendada, vastasel juhul programm krahhib.

Erand näitab, et kuigi sündmus võib aset leida, toimub seda tüüpi sündmus harva. Kui meetod ei suuda erandiga toime tulla, suunatakse see oma kutsujafunktsioonile. Java, mis kõige enam ajendab Selenium sviitide puhul on iga WebDriveri erand kontrollimata, seega ei sunni kompilaator teid kunagi seda püüdma – käsitlemata tõrge ilmneb ainult käitusajal.

Erandite tüübid Selenium Veebidraiver

WebDriverException on hierarhia baasklass ja iga allpool olev erand pärib sellelt. Tabelis on loetletud kõik 41 erandit, millega võite kokku puutuda, koos tingimusega, mis iga erandi käivitab.

# Erand Millal see juhtub
1 ElementNotVisibleException DOM-is oleval elemendil on peidetud funktsioonide komplekt.
2 ElementNotSelectableException Element asub DOM-is, kuid seda ei saa valida, seega on interaktsioon võimatu.
3 NoSuchElementException Elementi ei leitud lokaator varustatud.
4 NoSuchFrameException . raam Sihtmärki, millele lülitada, pole olemas.
5 NoAlertPresentException Üleminek hoiatada käivitub, kui hoiatust ei kuvata.
6 NoSuchWindowException Akna sihtmärki, millele lülitada, pole olemas.
7 StaleElementReferenceException Veebielement on praegusest eraldatud DOM.
8 SessionNotFoundException WebDriver hakkab tööle pärast brauseri sulgemist.
9 TimeoutException Käsk ei jõudnud õigeaegselt lõpule – näiteks otsitud elementi ooteaja jooksul ei leitud.
10 WebDriverException Teiste WebDriveri erandite baasklass; tekib ka siis, kui WebDriver tegutseb kohe pärast brauseri sulgemist.
11 Ühenduse sulgemise erand Draiveris on ühenduse katkestus.
12 ElementClickInterceptedException Sündmusi vastuvõttev element varjab klõpsu jaoks taotletud elementi.
13 ElementNotInteractableException Element on DOM-is olemas, kuid sellega on võimatu suhelda.
14 VastusevigaErand Suhtlemisel tekkis viga Firefox laiendus või kaugdraiveri server.
15 Veakäsitleja. TundmatuServeriErand Kasutatakse kohatäitena, kui server tagastab vea ilma pinuta trace.
16 ImeActivationFailedException IME mootori aktiveerimine ebaõnnestus.
17 ImeNotAvailableException IME tugi pole saadaval.
18 Ebaturvalise sertifikaadi erand Navigeerimine pani kasutajaagendi klõpsama a-l sertifikaadi hoiatus, mida võib põhjustada kehtetu või aegunud TLS-sertifikaat.
19 Kehtetu argumendi erand Argument ei kuulu oodatud tüüpi.
20 Kehtetu küpsise domeeni erand A küpsis lisatakse praeguse asemel teise domeeni alla URL.
21 Vigaste koordinaatide erand Vastav interakteeruv toiming ei ole kehtiv.
22 Vigase elemendi oleku erand Käsku ei saa lõpule viia, kuna element on sobimatu.
23 Kehtetu seansi ID erand Antud seansi ID ei ole aktiivsete seansside hulgas, seega seda ei eksisteeri või on see mitteaktiivne.
24 Kehtetu lülitiTargetErand Raami või akna sihtmärki, millele lülitada, pole olemas.
25 JavascriptErand Käivitamisel tekkis viga JavaKasutaja antud skript.
26 JsonException Seanssi taotletakse siis, kui seanssi pole loodud.
27 NoSuchAttributeException Elemendi atribuuti ei leitud.
28 LiikumaTargetVäljaspool piire olev erand ActionChains move() meetodile antud sihtmärk ei ole kehtiv – näiteks „väljas dokumendist“.
29 NoSuchContextException ContextAware, mis tegeleb mobiilseadmete testimisega, ei leia taotletud konteksti.
30 NoSuchCookieException Praegu sirvitava dokumendi küpsiste hulgast ei leitud antud teekonna nimega sobivat küpsist.
31 NotFoundException WebDriverExceptioni alamklass, mis tekib siis, kui DOM-is elementi ei eksisteeri.
32 RemoteDriverServerException Server ei vasta, kuna kirjeldatud võimalused pole õiged.
33 ScreenshotException Ekraani ei ole võimalik jäädvustada.
34 SessionNotCreatedException Uue seansi loomine ebaõnnestus.
35 UnableToSetCookieException Juht ei saa küpsist määrata.
36 Ootamatu sildinime erand Tugiklass ei saanud oodatud veebielementi.
37 Käitlemata hoiatuse erand Hoiatus on olemas, kuid WebDriver ei saa hoiatustoimingut teostada.
38 Ootamatu hoiatuse praegune erand Ilmub ootamatu teade.
39 Tundmatu meetodi erand Taotletud käsk vastab teadaolevale URL aga mitte selle konkreetse meetodi jaoks URL.
40 Kättesaamatu brauseri erand Brauserit ei saa avada või see jookseb mingil põhjusel kokku.
41 Toetamata käsuerand Kaug-veebidraiver ei saada ootuspäraselt kehtivaid käske.

Kolm domineerivat igapäevast silumist: NoSuchElementException tähendab valet XPath või element, mida pole renderdatud, tähendab TimeoutException, et ooteaeg on liiga lühike. AJAX vastusele ja StaleElementReferenceException järgneb dünaamiline uuesti renderdama.

Kuidas eranditega toime tulla Selenium

Siin on standardsed konstruktsioonid erandite käsitlemiseks Selenium WebDriver. Igaüks on lihtne Java, seega töötab see igas WebDriveri skript ilma lisaraamatukogudeta.

Samm 1) Proovige püüda

See meetod suudab erandeid püüda märksõnade try ja catch kombinatsiooni abil. Käsk try tähistab ploki algust ja catch paigutatakse try ploki lõppu, kus see lahendab erandi.

try
{
// Code
} catch (Exception e) {
// Code for Handling exception
}

2. samm) Mitu püüdmisplokki

Erandeid on erinevat tüüpi ja üks koodiplokk võib tekitada mitu. Mitme catch-ploki korral saate iga tüübi eraldi koodiga käsitleda. Võite kasutada rohkem kui kahte catch-plokki ja lisatavate plokkide arvul pole piirangut.

try
{
//Code
} catch (ExceptionType1 e1) {
//Code for Handling Exception 1
} catch (ExceptionType2 e2) {
//Code for Handling Exception 2
}

Samm 3) Viska

Kui soovid erandi genereerida, annab märksõna `throw` selle käitusajal käsitlemiseks edasi. Kasuta märksõna `throw` erandi edastamisel edasi, selle asemel, et seda praeguses meetodis lahendada.

public static void anyFunction() throws Exception{

try {
// write your code here
} catch (Exception b) {
// Do whatever you want to perform 
// Throw the Exception back to the system
throw(b);
}
}

4. samm) Mitu erandit

Throws-klauslis saab mainida mitmesuguseid erandeid.

public static void anyFunction() throws ExceptionType1, ExceptionType2{

try {
// write your code here
} catch (ExceptionType1 e1) {
// Code to handle exception 1
} catch (ExceptionType2 e2) {
// Code to handle exception 2
}

Samm 5) Lõpuks

Märksõna „finally” loob ploki „try” alla. See käivitub olenemata sellest, kas tekkis erand, mistõttu on see õige koht draiveri sulgemiseks või failikäepideme vabastamiseks.

try {
//Code
} catch (ExceptionType1 e1) {
//Catch block
} catch (ExceptionType2 e2) {
//Catch block
} catch (ExceptionType3 e3) {
//Catch block
} finally {
//The finally block always executes.
}

Erandteabe kuvamise meetodid

Kui erand on tabatud, kannab objekt ise diagnostilist detaili. Selle kuvamiseks saate kasutada järgmisi meetodeid:

Meetod Mida see teatab
printStackTrace() Prindib virna trace, erandi nimi ja muu kasulik kirjeldus.
toString () Tagastab tekstisõnumi, mis kirjeldab erandi nime ja kirjeldust.
getMessage() Kuvab erandi kirjelduse eraldi.

Ühenda need catch-ploki sees tehtud ekraanipildiga ja ebaõnnestunud käivitamine näitab nii, mis katki läks, kui ka seda, kuidas leht välja nägi.

KKK

Kõik WebDriveri erandid on kontrollimata, kuna need kõik laiendavad RuntimeExceptioni WebDriverExceptioni kaudu. Seega ei nõua kompilaator kunagi try-catchi, mis on mugav, kuid tähendab ka seda, et kaitsmata lokaatori tõrge ilmneb alles siis, kui test tegelikult töötab.

Leidke element vahetult enne sellega tegutsemist ümber, selle asemel, et viidet vahemällu salvestada. Lühike uuesti proovimise tsükkel, mis ignoreerib erandit ja hangib sõlme uuesti, käsitleb Reacti või Vue uuesti renderdamist palju usaldusväärsemalt kui pikem unerežiim.

Nad vähendavad seda järsult, aga ei eemalda seda kunagi. Otsene ootamine lahendab ainult ajastusprobleemid – vale lokaator, pealtkuulatud klõps või suletud seanss tekitab ikkagi erandi, mida miski peale catch-bloki ei suuda absorbeerida.

Selenium 4 säilitab sama hierarhia, kuid ootekonstruktorid võtavad nüüd täisarvulise ajalõpu asemel kestuse (Duration) ja rangem W3C argumentide valideerimine tähendab, et InvalidArgumentException kuvatakse väärtuste puhul, mis Selenium 3 võeti vastu ilma kaebusteta.

Isetervenevad lokaatorimootorid track, millised selektorid katkevad ja vahetuvad toimiva alternatiivi vastu, mis kõrvaldab suure osa NoSuchElementExceptioni tõrgetest. Sarnased mudelid klasterdavad korduvat pinu tracnii et tõeliselt uus defekt ei jää ebaühtlaste korduste vahele.

Copilot on tugev mallipõhiselt – try-catch skelett, õiges järjekorras catch-ahel, finally-plokk, mis draiverist väljub. See ei saa teada, milliseid erandeid teie enda rakendus tekitab, seega vaadake üle iga genereeritud catch-plokk.

Need täiendavad seda. ITestListener koondab logimise ja ekraanipildid kõigi ebaõnnestunud testide kohta, mis hoiab testi sisu puhtana. Kasutage try-catchi ainult siis, kui skript peab pärast viga jätkama, mitte lihtsalt sellest teatama.

Edastage draiver TakesScreenshot'i catch-käsu sees või lõpuks plokis ja kirjutage fail enne seansi sulgemist. Pildi nimetamine testimismeetodi järgi muudab ebaõnnestunud CI-käivituse loetavaks ilma viga lokaalselt taasesitamata.

Võta see postitus kokku järgmiselt: