Hvordan vente på at en side skal laste med selen

Hvordan vente på at en side skal laste med selen
Mens nettautomatisering eller skraping av nett med Selenium Web Driver, kan du møte problemer som elementet du vil velge ikke er tilgjengelig, eller knappen du vil trykke på er ikke klar til å klikkes og så videre.

Årsaken til at dette skjer er at Selenium Web Driver må laste ned websiden og avslutte gjengi siden før du kan gjøre noe på den. Tidligere genererte webserveren innholdet på et nettsted, og nettleseren lastet det nettopp ned og ga det. I disse dager har vi mange enkeltsider webapper som fungerer litt annerledes. I enkeltsider webapper (SPA) serverer 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, gjengir den dem i nettleseren. Så selv om nettleseren er ferdig med å laste ned og gjengi websiden, er websiden 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 skal være tilgjengelige før vi gjør noe med Selenium.

I selen er det to typer venter:
1) Implisitt vent
2) Eksplisitt vent

1) Implisitt Vent: Dette er det enkleste å implementere. En implisitt ventetid forteller at Selenium Web Driver skal vente i flere sekunder på at DOM (Document Object Model) skal være klar (websiden er klar).

2) Eksplisitt Vent: Dette er litt komplekst enn den implisitte ventetiden. I eksplisitt ventetid forteller du selen -webdriveren hva du skal vente på. Selen venter på at den spesifikke tilstanden blir oppfylt. Når den er oppfylt, vil Selenium Web Driver være klar til å ta andre kommandoer. Vanligvis er den eksplisitte ventetiden varierende. Det kommer an på hvor raskt forholdene er fornøyde. I verste fall vil den eksplisitte ventetiden vente så lenge den implisitte ventetiden.

I denne artikkelen skal jeg vise deg hvordan du kan vente (implisitt og eksplisitt) for at en side skal laste med selen. Så la oss komme i gang.

Forutsetninger:

For å prøve ut 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 din.
3) Pip 3 installert på datamaskinen din.
4) Python Virtualenv pakke 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 Hos Linuxhint.com.

Du kan finne mange artikler om de andre emnene på Linuxhint.com. Sørg for å sjekke dem ut hvis du trenger hjelp.

Sette opp en prosjektkatalog:

For å holde alt organisert, opprette en ny prosjektkatalog Selen-Wait/ følgende:

$ mkdir -pv selen -wait/drivere

Naviger til Selen-Wait/ Prosjektkatalog som følger:

$ CD Selenium-Wait/

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

$ virtualenv .Venv

Aktiver det virtuelle miljøet som følger:

$ kilde .Venv/bin/aktiverer

Installer selen ved hjelp av PIP3 som følger:

$ pip3 installer selen

Last ned og installer all nødvendig nettdriver i drivere/ Katalogen til prosjektet. Jeg har forklart prosessen med å laste ned og installere nettdrivere i artikkelen min Introduksjon til selen med Python 3. Hvis du trenger hjelp, kan du søke på Linuxhint.com for den artikkelen.

Jeg vil bruke Google Chrome -nettleseren for demonstrasjonen i denne artikkelen. Så jeg vil bruke Chromedriver binær fra drivere/ katalog.

Jobber med implisitt ventetid:

For å eksperimentere med implisitt vent, lage et nytt Python -skript EX01.py I prosjektkatalogen din og skriv inn følgende koder i den filen.

Fra Selenium Import WebDriver
fra Selenium.Webdriver.felles.nøkler importerer nøkler
Alternativer = webdriver.ChromeOptions ()
alternativer.Hodeløs = sant
nettleser = webdriver.Krom (kjørbar_path = "./Drivere/Chromedriver ", alternativer = alternativer)
nettleser.implisitt_wait (10)
nettleser.få ("https: // www.Unixtimestamp.com/")
Timestempel = nettleser.find_element_by_xpath ("// h3 [@class = 'text-danger'] [1]")
Print ('Gjeldende tidsstempel: % S' % (tidsstempel.tekst.split (") [0]))
nettleser.Lukk()

Når du er ferdig, kan du lagre EX01.py Python -manus.

Linje 1 og 2 importerer alle nødvendige selenkomponenter.

Linje 4 Oppretter et Chrome Option -objekt.

Linje 5 Aktiverer hodeløs modus for Chrome Web Driver.

Linje 7 Oppretter et Chrome -nettleserobjekt ved hjelp av Chromedriver binær fra drivere/ katalog.

Linje 8 brukes til å fortelle Selenium å vente implisitt i 10 sekunder ved å bruke implisitt_wait () nettlesermetode.

Linje 10 laster www.Unixtimestamp.com i nettleseren.

Linje 12 finner tidsstempelelementet ved hjelp av XPath -velgeren // h3 [@class = 'text-Danger'] [1] og lagrer det i tidsstempel variabel.

Jeg fikk XPath -velgeren fra Chrome Developer Tool. Som du kan se, er tidsstempelet i den første H3 element med klassenavnet tekst-far. Det er 2 H3 elementer med klassen tekst-far.

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 ser blir den nåværende tidsstempelet trukket ut fra Unixtimestamp.com og trykt på konsollen.

Arbeider med eksplisitt ventetid:

For å eksperimentere med eksplisitt ventetid, lag et nytt Python -skript EX02.py I prosjektkatalogen din og skriv inn følgende koder i den filen.

Fra Selenium Import WebDriver
fra Selenium.Webdriver.felles.nøkler importerer nøkler
fra Selenium.Webdriver.felles.ved import av
fra Selenium.Webdriver.Brukerstøtte.UI importer webdriverwait
fra Selenium.Webdriver.Støtt import forventet_conditions
Alternativer = webdriver.ChromeOptions ()
alternativer.Hodeløs = sant
nettleser = webdriver.Krom (kjørbar_path = "./Drivere/Chromedriver ", alternativer = alternativer)
nettleser.få ("https: // www.Unixtimestamp.com/")
prøve:
Timestamp = WebDriverWait (nettleser, 10).før(
forventet_conditions.tilstedeværelse_of_element_located ((av.Xpath, "
// h3 [@class = 'Text-Danger'] [1] ")))
)
Print ('Gjeldende tidsstempel: % S' % (tidsstempel.tekst.split (") [0]))
endelig:
nettleser.Lukk()

Når du er ferdig, kan du lagre EX02.py Python -manus.

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

Linje 7 Oppretter et Chrome Option -objekt.

Linje 8 Aktiverer hodeløs modus for Chrome Web Driver.

Linje 10 Oppretter et Chrome -nettleserobjekt ved hjelp av Chromedriver binær fra drivere/ katalog.

Linje 12 laster www.Unixtimestamp.com i nettleseren.

Den eksplisitte ventetiden implementeres i forsøksblokken (fra linje 14-20)

Linje 15-17 bruker Creates WebDriverWait () gjenstand. Det første argumentet av WebDriverWait () er nettleserobjektet, og det andre argumentet er den maksimale tillatte tiden (worst-case scenario) for å oppfylle tilstanden, som er 10 sekunder i dette tilfellet.

I før() blokkere, forventet_conditions.tilstedeværelse_of_element_located () Metoden brukes for å sikre at elementet er til stede før du prøver å velge elementet. Her, Av.Xpath brukes til å fortelle tilstedeværelse_of_element_located () Metode som vi har brukt en XPath -velger for å velge elementet. XPath -velgeren er // h3 [@class = 'text-Danger'] [1].

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

Linje 18 Skriver bare tidsstempel fra det valgte elementet.

Endelig lukker linje 19-20 nettleseren.

Når du er ferdig, kjører du EX02.py Python -manus som følger:

$ Python3 EX02.py

Som du kan se, den nåværende tidsstempelet fra Unixtimestamp.com skrives ut på konsollen.

Velge elementer i eksplisitte venter:

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 seleksjonsmetodene er gitt nedenfor:

Av.Xpath - Velger element/elementer ved hjelp av xpath -velgeren.

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

Av.CSS_Selector - Velger element/elementer ved hjelp av CSS -velgeren.

Av.Id - Velger element etter id

Av.NAVN - Velger element/elementer ved navn.

Av.Tag_name - Velger element/elementer etter html tagnavn.

Av.Link_text - Velger element/elementer etter koblingstekst av en (Anker) HTML -tag.

Av.Partial_link_text - Velger element/elementer etter delvis koblingstekst av en (Anker) HTML -tag.

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

Forventede forhold i eksplisitte venter:

I det tidligere eksplisitte venteteksemplet har jeg brukt tilstedeværelse_of_element_located () Metode av forventet_conditions som den eksplisitte ventetilstanden for å sikre at elementet jeg lette etter eksisterer før jeg valgte det.

Det er andre forventet_conditions Du kan bruke som en eksplisitt ventetilstand. Noen av dem er:

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

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

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

SIGHTITY_OF_ELEMENT_LOCATED (Locator) -

tilstedeværelse_of_element_located (locator) - Forsikre deg om at elementet som ligger (av Lokator) er til stede på siden. De Lokator er en tuple av (Av, velger), Som jeg har vist i det eksplisitte venteteksemplet.

tilstedeværelse_of_all_element_located () - Sørger for at alt elementet matchet av Lokator er til stede på siden. De Lokator er en (Av, velger) tuple.

text_to_be_present_in_element (locator, tekst) - Sjekker om tekst er til stede i elementet som ligger av Lokator. De Lokator er en (Av, velger) tuple.

element_to_be_clickable (locator) - Sjekker om elementet ligger av Lokator er synlig og klikkbar. De Lokator er en (Av, velger) tuple.

element_to_be_selected (locator) - Sjekker om elementet ligger av Lokator er valgt. De Lokator er en (Av, velger) tuple.

Alert_is_present () - Forvent at en varslingsdialog skal være til stede på siden.

Det er mange flere forventet_conditions Tilgjengelig for deg å bruke. For mer informasjon om disse, besøk Python Selenium API -dokumentasjonssiden.

Konklusjon:

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

For mer informasjon om Selenium Waits, besøk den offisielle Selenium Python Library Waits Documentation Page.