Sådan venter du på, at en side indlæses med selen

How Wait Page Load With Selenium



Mens webautomatisering eller webskrabning med Selenium -webdriver, kan du opleve problemer som at det element, du vil vælge, ikke er tilgængeligt, eller at den knap, du vil trykke på, ikke er klar til at blive klikket på og så videre.

Grunden til at dette sker er, at Selenium -webdriveren skal downloade websiden og afslutte gengivelse af siden, før du kan gøre noget på den. Tidligere genererede webserveren indholdet på et websted, og browseren downloadede det bare og gengav det. I disse dage har vi mange enkeltsidede web-apps, der fungerer lidt anderledes. I Single Page Web Apps (SPA'er) serverer webserveren kun frontendkoderne. Når frontend -koden er gengivet i browseren, bruger frontend -koden AJAX til at anmode om API -data til webserveren. Når frontend modtager API -data, gengives det i browseren. Så selvom browseren er færdig med at downloade og gengive websiden, er websiden stadig ikke klar. Du skal vente på, at den modtager API -data og også gengiver dem. Så løsningen på dette problem er at vente på, at dataene er tilgængelige, før vi gør noget med Selenium.







I selen er der 2 typer ventetider:
1) Implicit ventetid
2) Eksplicit ventetid



1) Implicit ventetid: Dette er det nemmeste at implementere. En implicit ventetid fortæller Selenium -webdriveren at vente i flere sekunder på, at DOM (dokumentobjektmodel) er klar (websiden er klar).



2) Eksplicit ventetid: Dette er lidt kompliceret end den implicitte ventetid. I eksplicit ventetid fortæller du Selenium -webdriveren, hvad du skal vente på. Selen venter på, at den specifikke betingelse er opfyldt. Når den er opfyldt, er Selenium -webdriveren klar til at tage andre kommandoer. Normalt er den eksplicitte ventetid variabel. Det afhænger af, hvor hurtigt betingelserne er opfyldt. I værste fald vil den eksplicitte ventetid vente lige så længe som den implicitte ventetid.





I denne artikel vil jeg vise dig, hvordan du venter (implicit og eksplicit) på, at en side indlæses med Selenium. Så lad os komme i gang.

Forudsætninger:

For at prøve kommandoerne og eksemplerne på denne artikel skal du have,



1) En Linux -distribution (helst Ubuntu) installeret på din computer.
2) Python 3 installeret på din computer.
3) PIP 3 installeret på din computer.
4) Python virtualenv pakke installeret på din computer.
5) Mozilla Firefox eller Google Chrome webbrowsere installeret på din computer.
6) Skal vide, hvordan du installerer Firefox Gecko Driver eller Chrome Web Driver.

Læs min artikel for at opfylde kravene 4, 5 og 6 Introduktion til selen med Python 3 på Linuxhint.com.

Du kan finde mange artikler om de andre emner om LinuxHint.com . Sørg for at tjekke dem ud, hvis du har brug for hjælp.

Opsætning af et projektmappe:

For at holde alt organiseret skal du oprette et nyt projektmappe selen-vent/ som følger:

$mkdir -pvselen-vent/chauffører

Naviger til selen-vent/ projektmappe som følger:

$CDselen-vent/

Opret et virtuelt Python -miljø i projektmappen som følger:

$virtualenv .venv

Aktiver det virtuelle miljø som følger:

$kilde.venv/er/aktivere

Installer Selenium ved hjælp af PIP3 som følger:

$ pip3 installer selen

Download og installer alle de nødvendige webdrivere i chauffører/ bibliotek over projektet. Jeg har forklaret processen med at downloade og installere webdrivere i min artikel Introduktion til selen med Python 3 . Hvis du har brug for hjælp, skal du søge videre LinuxHint.com for den artikel.

Jeg vil bruge Google Chrome -webbrowseren til demonstrationen i denne artikel. Så jeg vil bruge chromedriver binært fra chauffører/ vejviser.

For at eksperimentere med implicit ventetid skal du oprette et nyt Python -script ex01.py i dit projektmappe, og indtast følgende koderader i den fil.

fraselenimporterewebdriver
fraselen.webdriver.almindelige.nøgler importereNøgler
muligheder=webdriver.ChromeOptions()
muligheder.hovedløs = Sand
browser=webdriver.Chrome(eksekverbar_sti='./drivers/chromedriver',muligheder=muligheder)
browser.implicit_venter(10)
browser.('https://www.unixtimestamp.com/')
tidsstempel=browser.find_element_by_xpath('// h3 [@] [1]')
Print('Aktuelt tidsstempel: %s'%(tidsstempel.tekst.dele('')[0]))
browser.tæt()

Når du er færdig, skal du gemme ex01.py Python script.

Linje 1 og 2 importerer alle de nødvendige selenkomponenter.

Linje 4 opretter et Chrome Options -objekt.

Linje 5 muliggør hovedløs tilstand for Chrome -webdriveren.

Linje 7 opretter et Chrome -browserobjekt ved hjælp af chromedriver binært fra chauffører/ vejviser.

Linje 8 bruges til at fortælle selen at vente implicit i 10 sekunder ved hjælp af implicit_wait () browsermetode.

Linje 10 indlæser www.unixtimestamp.com i browseren.

Linje 12 finder tidsstempelelementet ved hjælp af XPath -vælgeren // h3 [@class = ’tekst-fare’] [1] og gemmer det i tidsstempel variabel.

Jeg fik XPath -vælgeren fra Chrome Developer Tool. Som du kan se, er tidsstemplet i det første h3 element med klassens navn tekst-fare . Der er 2 h3 elementer med klassen tekst-fare .

Linje 13 udskriver kun tidsstemplet fra det element, jeg har valgt ved hjælp af XPath -vælgeren og gemt i tidsstempel variabel.

Linje 14 lukker browseren.

Når du er færdig, skal du køre Python -scriptet ex01.py som følger:

$ python3 ex01.py

Som du kan se, hentes det aktuelle tidsstempel fra unixtimestamp.com og udskrives på konsollen.

Arbejde med eksplicit ventetid:

For at eksperimentere med eksplicit ventetid skal du oprette et nyt Python -script ex02.py i dit projektmappe, og indtast følgende koderader i den fil.

fraselenimporterewebdriver
fraselen.webdriver.almindelige.nøgler importereNøgler
fraselen.webdriver.almindelige.ved importereVed
fraselen.webdriver.support.løg importereWebDriverWait
fraselen.webdriver.support importereforventede_betingelser
muligheder=webdriver.ChromeOptions()
muligheder.hovedløs = Sand
browser=webdriver.Chrome(eksekverbar_sti='./drivers/chromedriver',muligheder=muligheder)
browser.('https://www.unixtimestamp.com/')
prøve:
tidsstempel=WebDriverWait(browser, 10).så længe(
forventede_betingelser.tilstedeværelse_elementelokaliseret((Ved.XPATH, '
// h3 [@] [1] '
))
)
Print('Aktuelt tidsstempel: %s'%(tidsstempel.tekst.dele('')[0]))
endelig:
browser.tæt()

Når du er færdig, skal du gemme ex02.py Python script.

Linje 1-5 importerer alle de nødvendige komponenter fra selenbiblioteket.

Linje 7 opretter et Chrome Options -objekt.

Linje 8 muliggør hovedløs tilstand for Chrome -webdriveren.

Linje 10 opretter et Chrome -browserobjekt ved hjælp af chromedriver binært fra chauffører/ vejviser.

Linje 12 indlæser www.unixtimestamp.com i browseren.

Den eksplicitte ventetid er implementeret i blokken prøve-endelig (fra linje 14-20)

Linje 15-17 bruger opretter WebDriverWait () objekt. Det første argument af WebDriverWait () er browserobjektet, og det andet argument er den maksimalt tilladte tid (værste tilfælde) for at opfylde betingelsen, hvilket er 10 sekunder i dette tilfælde.

I så længe() blok, expect_conditions.presence_of_element_located () metode bruges til at sikre, at elementet er til stede, før du forsøger at vælge elementet. Her, Af.XPATH bruges til at fortælle tilstedeværelse_elementelokaliseret () metode, som vi har brugt en XPath -vælger til at vælge elementet. XPath -vælgeren er // h3 [@class = ’tekst-fare’] [1] .

Når elementet er fundet, gemmes det i tidsstempel variabel.

Linje 18 udskriver kun tidsstemplet fra det valgte element.

Endelig lukker linje 19-20 browseren.

Når du er færdig, skal du køre ex02.py Python script som følger:

$ python3 ex02.py

Som du kan se, udskrives det aktuelle tidsstempel fra unixtimestamp.com på konsollen.

Valg af elementer i eksplicit ventetid:

I det tidligere afsnit har jeg brugt Af.XPATH for at vælge elementet ved hjælp af XPath -vælgeren. Du kan også vælge elementerne ved hjælp af ID, tagnavn, CSS -klassenavn, CSS -vælger osv.

De understøttede udvælgelsesmetoder er angivet nedenfor:

Af.XPATH - Vælger element/elementer ved hjælp af XPath -vælger.

Af.CLASS_NAME - Vælger element/elementer ved hjælp af CSS -klassenavn.

Af.CSS_SELECTOR - Vælger element/elementer ved hjælp af CSS -vælger.

Af.ID - Vælger element efter id

Ved navn - Vælger element/elementer ved navn.

Af.TAG_NAME - Vælger element/elementer efter HTML -tagnavn.

Af.LINK_TEXT - Vælger element/elementer efter linktekst af til (anker) HTML -tag.

Af.PARTIAL_LINK_TEXT - Vælger element/elementer ved delvis linktekst af til (anker) HTML -tag.

For mere information om disse, besøg Python Selenium API dokumentationsside .

Forventede forhold under eksplicit ventetid:

I det tidligere eksplicitte venteeksempel har jeg brugt tilstedeværelse_elementelokaliseret () metode til forventede_betingelser som den eksplicitte ventetilstand for at sikre, at det element, jeg ledte efter, eksisterer, før det blev valgt.

Der er andre forventede_betingelser du kan bruge som en eksplicit ventetilstand. Nogle af dem er:

title_is (titel) - kontrollerer, om sidens titel er titel .

title_contains (delvis_title) - kontrollerer, om sidens titel indeholder en del af titlen delvis_title .

synlighed_af (element) - kontrollerer, om element er synlig på siden, der er elementet, har bredde og højde større end 0.

visibility_of_element_located (lokaliser) -

tilstedeværelse_elementelokaliseret (lokaliser) - Sørg for, at elementet er placeret (ved lokalisator ) findes på siden. Det lokalisator er en tuppel af (Ved, vælger), som jeg har vist i eksemplet med eksplicit ventetid.

tilstedeværelse_af_all_element_lokeret () - Sørger for, at alt elementet matches af lokalisator er til stede på siden. Det lokalisator er en (Af, vælger) tupel.

text_to_be_present_in_element (lokalisator, tekst) - Kontrollerer, om tekst er til stede i elementet placeret ved lokalisator . Det lokalisator er en (Af, vælger) tupel.

element_to_be_clickable (lokaliser) - Kontrollerer, om elementet er placeret ved lokalisator er synlig og klikbar. Det lokalisator er en (Af, vælger) tupel.

element_til_vælges (lokaliser) - Kontrollerer, om elementet er placeret ved lokalisator er valgt. Det lokalisator er en (Af, vælger) tupel.

alert_is_present () - forvent en advarseldialog på siden.

Der er mange flere forventede_betingelser til rådighed for dig at bruge. For mere information om disse, besøg Python Selenium API dokumentationsside .

Konklusion:

I denne artikel har jeg diskuteret Seleniums implicitte og eksplicitte ventetid. Jeg har også vist dig, hvordan du arbejder med en implicit og eksplicit ventetid. Du bør altid prøve at bruge eksplicit ventetid i dine Selenium -projekter, da Selenium vil forsøge at reducere ventetiden så meget som muligt. På denne måde behøver du ikke vente et bestemt antal sekunder, hver gang du kører dine Selenium -projekter. Den eksplicitte ventetid skal spare mange sekunder.

For mere information om Selenium venter, besøg det officielle Selenium Python -bibliotek venter på dokumentationssiden .