Hvordan vente på at en side skal lastes med selen

How Wait Page Load With Selenium



Mens webautomatisering eller webskraping med Selenium -webdriver, kan du få problemer som at elementet du vil velge ikke er tilgjengelig, eller at knappen du vil trykke på ikke er klar til å klikkes og så videre.

Grunnen til at dette skjer er at Selenium -webdriveren må laste ned websiden og fullføre gjengivelsen av siden før du kan gjøre noe på den. Tidligere genererte webserveren innholdet på et nettsted, og nettleseren lastet det ned og gjengitt det. I disse dager har vi mange nettsider på én side som fungerer litt annerledes. I Single Page Web Apps (SPA) betjener webserveren bare frontend -kodene. Når frontend -koden er gjengitt i nettleseren, bruker frontend -koden AJAX for å be om API -data til webserveren. Når frontend mottar API -dataene, gjengis de i nettleseren. Så selv om nettleseren er ferdig med å laste ned og gjengi websiden, er nettsiden fremdeles ikke klar. Du må vente på at den mottar API -dataene og gjengir dem også. Så løsningen på dette problemet er å vente på at dataene er tilgjengelige før vi gjør noe med Selenium.







I selen er det to typer ventetider:
1) Implisitt ventetid
2) Eksplisitt ventetid



1) Implisitt ventetid: Dette er det enkleste å implementere. En implisitt ventetid forteller Selenium -webdriveren å vente i flere sekunder på at DOM (dokumentobjektmodell) er klar (websiden er klar).



2) Eksplisitt ventetid: Dette er litt komplisert enn den implisitte ventetiden. I eksplisitt ventetid forteller du Selenium -webdriveren hva du skal vente på. Selen venter på at den spesifikke betingelsen er oppfylt. Når den er oppfylt, vil Selenium -webdriveren være klar til å ta andre kommandoer. Vanligvis er den eksplisitte ventetiden variabel. Det avhenger av hvor raskt betingelsene er oppfylt. I verste fall vil den eksplisitte ventetiden vente like lenge som den implisitte ventetiden.





I denne artikkelen skal jeg vise deg hvordan du venter (implisitt og eksplisitt) på at en side skal lastes inn med Selenium. Så, la oss komme i gang.

Forutsetninger:

For å prøve kommandoene og eksemplene på denne artikkelen må du ha,



1) En Linux -distribusjon (helst Ubuntu) installert på datamaskinen din.
2) Python 3 installert på datamaskinen.
3) PIP 3 installert på datamaskinen.
4) Python virtualenv pakken installert på datamaskinen din.
5) Mozilla Firefox eller Google Chrome nettlesere installert på datamaskinen din.
6) Må vite hvordan du installerer Firefox Gecko Driver eller Chrome Web Driver.

For å oppfylle kravene 4, 5 og 6, les artikkelen min Introduksjon til selen med Python 3 på Linuxhint.com.

Du kan finne mange artikler om de andre temaene på LinuxHint.com . Husk å sjekke dem hvis du trenger hjelp.

Sette opp en prosjektkatalog:

For å holde alt organisert, opprett en ny prosjektkatalog selen-vent/ følgende:

$mkdir -pvselen-vent/sjåfører

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

$CDselen-vent/

Lag et virtuelt Python -miljø i prosjektkatalogen som følger:

$virtualenv .venv

Aktiver det virtuelle miljøet som følger:

$kilde.venv/er/aktivere

Installer Selen med PIP3 som følger:

$ pip3 installer selen

Last ned og installer all nødvendig webdriver i sjåfører/ katalog over prosjektet. Jeg har forklart prosessen med å laste ned og installere webdrivere i artikkelen min Introduksjon til selen med Python 3 . Hvis du trenger hjelp, kan du søke videre LinuxHint.com for den artikkelen.

Jeg kommer til å bruke nettleseren Google Chrome for demonstrasjonen i denne artikkelen. Så, jeg kommer til å bruke chromedriver binær fra sjåfører/ katalog.

For å eksperimentere med implisitt ventetid, opprett et nytt Python -skript ex01.py i prosjektkatalogen og skriv inn følgende koderader i filen.

fraselenimportwebdriver
fraselen.webdriver.felles.nøkler importNøkler
alternativer=webdriver.ChromeOptions()
alternativer.hodeløs = ekte
nettleser=webdriver.Chrome(kjørbar_bane='./drivers/chromedriver',alternativer=alternativer)
nettleser.implisitt_vente(10)
nettleser.('https://www.unixtimestamp.com/')
tidsstempel=nettleser.finn_element_by_xpath('// h3 [@] [1]')
skrive ut('Gjeldende tidsstempel: %s'%(tidsstempel.tekst.dele('')[0]))
nettleser.Lukk()

Når du er ferdig, lagrer du ex01.py Python -skript.

Linje 1 og 2 importerer alle nødvendige selenkomponenter.

Linje 4 oppretter et Chrome Options -objekt.

Linje 5 muliggjør hodeløs modus for Chrome -nettdriveren.

Linje 7 oppretter et Chrome -nettleserobjekt ved hjelp av chromedriver binær fra sjåfører/ katalog.

Linje 8 brukes til å fortelle Selenium å vente implisitt i 10 sekunder med implisitt_vente () nettlesermetode.

Linje 10 laster www.unixtimestamp.com i nettleseren.

Linje 12 finner tidsstempelelementet ved hjelp av XPath -velgeren // h3 [@class = ’tekst-fare’] [1] og lagrer den i tidsstempel variabel.

Jeg fikk XPath -velgeren fra Chrome Developer Tool. Som du kan se, er tidsstempelet i det første h3 element med klassens navn tekst-fare . Det er 2 h3 elementer med klassen tekst-fare .

Linje 13 skriver ut bare tidsstempelet fra elementet jeg har valgt ved hjelp av XPath -velgeren og lagret i tidsstempel variabel.

Linje 14 lukker nettleseren.

Når du er ferdig, kjør Python -skriptet ex01.py følgende:

$ python3 ex01.py

Som du kan se, blir det nåværende tidsstempelet hentet fra unixtimestamp.com og skrevet ut på konsollen.

Arbeide med eksplisitt ventetid:

For å eksperimentere med eksplisitt venting, opprett et nytt Python -skript ex02.py i prosjektkatalogen og skriv inn følgende koderader i filen.

fraselenimportwebdriver
fraselen.webdriver.felles.nøkler importNøkler
fraselen.webdriver.felles.av importAv
fraselen.webdriver.Brukerstøtte.løk importWebDriverWait
fraselen.webdriver.Brukerstøtte importforventede_forhold
alternativer=webdriver.ChromeOptions()
alternativer.hodeløs = ekte
nettleser=webdriver.Chrome(kjørbar_bane='./drivers/chromedriver',alternativer=alternativer)
nettleser.('https://www.unixtimestamp.com/')
prøve:
tidsstempel=WebDriverWait(nettleser, 10).før(
forventede_forhold.tilstedeværelse_element_lokalisert((Av.XPATH, '
// h3 [@] [1] '
))
)
skrive ut('Gjeldende tidsstempel: %s'%(tidsstempel.tekst.dele('')[0]))
endelig:
nettleser.Lukk()

Når du er ferdig, lagrer du ex02.py Python -skript.

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

Linje 7 oppretter et Chrome Options -objekt.

Linje 8 muliggjør hodeløs modus for Chrome -nettdriveren.

Linje 10 oppretter et Chrome -nettleserobjekt ved hjelp av chromedriver binær fra sjåfører/ katalog.

Linje 12 laster www.unixtimestamp.com i nettleseren.

Den eksplisitte ventingen er implementert i blokken prøve-endelig (fra linje 14-20)

Linje 15-17 bruker skaper WebDriverWait () gjenstand. Det første argumentet for WebDriverWait () er nettleserobjektet, og det andre argumentet er maksimal tillatt tid (verst tenkelige scenario) for å oppfylle betingelsen, som er 10 sekunder i dette tilfellet.

I før() blokkere, expect_conditions.presence_of_element_located () metode brukes for å sikre at elementet er tilstede før du prøver å velge elementet. Her, Av.XPATH brukes til å fortelle tilstedeværelse_elementelokalisert () metode som vi har brukt en XPath -velger for å velge elementet. XPath -velgeren er // h3 [@class = ’tekst-fare’] [1] .

Når elementet er funnet, blir det lagret i tidsstempel variabel.

Linje 18 skriver ut bare tidsstempelet fra det valgte elementet.

Til slutt lukker linje 19-20 nettleseren.

Når du er ferdig, kjør ex02.py Python -skript som følger:

$ python3 ex02.py

Som du kan se, skrives nåværende tidsstempel fra unixtimestamp.com ut på konsollen.

Velge elementer i eksplisitt ventetid:

I den tidligere delen har jeg brukt Av.XPATH for å velge elementet ved hjelp av XPath -velgeren. Du kan også velge elementene ved hjelp av ID, tagnavn, CSS -klassenavn, CSS -velger, etc.

De støttede utvalgsmetodene er gitt nedenfor:

Av.XPATH - Velger element/elementer ved hjelp av XPath -velger.

Av.CLASS_NAME - Velger element/elementer ved hjelp av CSS -klassenavn.

Av.CSS_SELECTOR - Velger element/elementer ved hjelp av CSS -velger.

Av.ID - Velger element etter ID

Ved navn - Velger element/elementer etter navn.

Av.TAG_NAME - Velger element/elementer etter HTML -tagnavn.

Av.LINK_TEXT - Velger element/elementer etter lenketekst av til (anker) HTML -tag.

Av.PARTIAL_LINK_TEXT - Velger element/elementer etter delvis lenketekst av til (anker) HTML -tag.

For mer informasjon om disse, besøk Python Selenium API -dokumentasjonsside .

Forventede forhold i eksplisitt ventetid:

I det tidligere eksplisitte venteeksemplet har jeg brukt tilstedeværelse_elementelokalisert () Metode av forventede_forhold som den eksplisitte ventetilstanden for å sikre at elementet jeg lette etter eksisterer før du velger det.

Det er andre forventede_forhold du kan bruke som en eksplisitt ventetilstand. Noen av dem er:

title_is (tittel) - sjekker om tittelen på siden er tittel .

title_contains (delvis_tittel) - sjekker om tittelen på siden inneholder en del av tittelen delvis_tittel .

synlighet_ av (element) - sjekker om element er synlig på siden som er elementet har bredde og høyde større enn 0.

visibility_of_element_located (lokalisator) -

tilstedeværelse_elementelokalisert (lokalisator) - Sørg for at elementet (ved lokalisator ) er tilstede på siden. De lokalisator er en tuppel av (Av, velger), som jeg har vist i eksemplet med eksplisitt ventetid.

presence_of_all_element_located () - Sørger for at alt elementet matchet av lokalisator er tilstede på siden. De lokalisator er en (Av, velger) tupel.

text_to_be_present_in_element (lokalisator, tekst) - Sjekker om tekst er tilstede i elementet som ligger ved lokalisator . De lokalisator er en (Av, velger) tupel.

element_to_be_clickable (lokaliser) - Sjekker om elementet ligger ved lokalisator er synlig og klikkbar. De lokalisator er en (Av, velger) tupel.

element_til_velges (lokalisator) - Sjekker om elementet ligger ved lokalisator er valgt. De lokalisator er en (Av, velger) tupel.

alert_is_present () - Forvent en varselsdialog på siden.

Det er mange flere forventede_forhold tilgjengelig for deg å bruke. For mer informasjon om disse, besøk Python Selenium API -dokumentasjonsside .

Konklusjon:

I denne artikkelen har jeg diskutert Seleniums implisitte og eksplisitte ventetid. Jeg har også vist deg hvordan du arbeider med en implisitt og eksplisitt ventetid. Du bør alltid prøve å bruke eksplisitt ventetid i Selen -prosjektene, da Selenium vil prøve å redusere ventetiden så mye som mulig. På denne måten trenger du ikke å vente et bestemt antall sekunder hver gang du kjører Selenium -prosjektene dine. Den eksplisitte ventetiden bør spare mange sekunder.

For mer informasjon om Selenium venter, besøk det offisielle Selenium Python -biblioteket venter på dokumentasjonssiden .