Selen

Hvordan man venter på, at en side skal fyldes med selen

Hvordan man venter på, at en side skal fyldes med selen
Mens webautomatisering eller webskrabning med Selenium-webdriver, kan du blive udsat for problemer som det element, du vil vælge, ikke er tilgængeligt, eller den knap, du vil trykke på, er ikke klar til at blive klikket på og så videre.

Årsagen til dette sker er, at Selenium-webdriveren skal downloade websiden og afslutte gengivelsen af ​​siden, før du kan gøre noget på den. Tidligere genererede webserveren indholdet på et websted, og browseren downloadede det bare og gengivet det. I disse dage har vi mange enkeltsidede webapps, der fungerer lidt anderledes. I SPA'er (Single Page Web Apps) serverer webserveren kun frontend-koder. 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 gengiver dem også. Så løsningen på dette problem er at vente på, at dataene er tilgængelige, inden vi gør noget med Selen.

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

1) Implicit ventetid: Dette er den nemmeste at implementere. En implicit ventetid fortæller Selenium-webdriveren at vente i flere sekunder, indtil DOM (dokumentobjektmodel) er klar (websiden skal være klar).

2) Eksplicit ventetid: Dette er lidt kompliceret end den implicitte ventetid. I eksplicit ventetid fortæller du Selenium-chaufføren, hvad man skal vente på. Selen venter på, at den specifikke betingelse er opfyldt. Når den er opfyldt, vil Selenium-webdriveren være 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 venter den eksplicitte ventetid, så længe den implicitte ventetid.

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

Forudsætninger:

For at prøve kommandoer og eksempler 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 på LinuxHint.com. Sørg for at tjekke dem ud, hvis du har brug for hjælp.

Opsætning af et projektkatalog:

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

$ mkdir -pv selen-vent / drivere

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

$ cd selen-vent /

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

$ virtualenv .venv

Aktivér det virtuelle miljø som følger:

$ kilde .venv / bin / aktiver

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

$ pip3 installer selen

Download og installer alle de krævede webdrivere i drivere / projektmappe. 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 på LinuxHint.com til den artikel.

Jeg bruger Google Chrome-webbrowseren til demonstrationen i denne artikel. Så jeg vil bruge chromedriver binær fra drivere / vejviser.

Arbejde med implicit ventetid:

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

fra selen import webdriver
fra selen.webdriver.almindelige.nøgler importerer nøgler
optioner = webdriver.Chrome-valg ()
muligheder.headless = Sandt
browser = webdriver.Chrome (eksekverbar_sti = "./ drivers / chromedriver ", optioner = optioner)
browser.implicit_wait (10)
browser.get ("https: // www.unixtimestamp.com / ")
tidsstempel = browser.find_element_by_xpath ("// h3 [@ class = 'text-danger'] [1]")
print ('Aktuel tidsstempel:% s'% (tidsstempel.tekst.split (") [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 Selen-komponenter.

Linje 4 opretter et Chrome Options-objekt.

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

Linje 7 opretter et Chrome-browserobjekt ved hjælp af chromedriver binær fra drivere / vejviser.

Linie 8 bruges til at fortælle Selen at vente implicit i 10 sekunder ved hjælp af implicit_wait () browser metode.

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

Linje 12 finder tidsstempelelementet ved hjælp af XPath-vælgeren // h3 [@ class = 'text-danger'] [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.

Linie 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, udvindes den aktuelle tidsstempel fra unixtimestamp.com og trykt 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 skriv følgende koderader i den pågældende fil.

fra selen import webdriver
fra selen.webdriver.almindelige.nøgler importerer nøgler
fra selen.webdriver.almindelige.ved import af
fra selen.webdriver.support.ui importerer WebDriverWait
fra selen.webdriver.understøtter import forventet_betingelser
optioner = webdriver.Chrome-valg ()
muligheder.headless = Sandt
browser = webdriver.Chrome (eksekverbar_sti = "./ drivers / chromedriver ", optioner = optioner)
browser.get ("https: // www.unixtimestamp.com / ")
prøve:
tidsstempel = WebDriverWait (browser, 10).så længe(
forventede_betingelser.tilstedeværelse_af_element_lokeret ((af.XPATH, "
// h3 [@ class = 'text-danger'] [1] "))
)
print ('Aktuel tidsstempel:% s'% (tidsstempel.tekst.split (") [0]))
langt om længe:
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 Selenium-biblioteket.

Linje 7 opretter et Chrome Options-objekt.

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

Linje 10 opretter et Chrome-browserobjekt ved hjælp af chromedriver binær fra drivere / vejviser.

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

Den eksplicitte ventetid implementeres i forsøge-endelig blokken (fra linje 14-20)

Linie 15-17 bruger skaber WebDriverWait () objekt. Det første argument af WebDriverWait () er browserobjektet, og det andet argument er den maksimalt tilladte tid (worst-case scenario) til opfyldelse af betingelsen, som i dette tilfælde er 10 sekunder.

I så længe() blok, forventede_betingelser.tilstedeværelse_element_lokeret () metode bruges til at sikre, at elementet er til stede, inden du forsøger at vælge elementet. Her, Ved.XPATH bruges til at fortælle tilstedeværelse af elementelokeret () metode, som vi har brugt en XPath-vælger til at vælge elementet. XPath-vælgeren er // h3 [@ class = 'text-danger'] [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, den aktuelle tidsstempel fra unixtimestamp.com er trykt på konsollen.

Valg af elementer i eksplicit ventetid:

I det tidligere afsnit har jeg brugt Ved.XPATH til valg af element 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 valgmetoder er angivet nedenfor:

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

Ved.CLASS_NAME - Vælger element / elementer ved hjælp af CSS-klasse navn.

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

Ved.ID - Vælger element efter ID

Ved.NAVN - Vælger element / elementer efter navn.

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

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

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

For mere information om disse, besøg Python Selen API-dokumentationssiden.

Forventede forhold i eksplicit ventetid:

I det tidligere eksplicit ventende eksempel har jeg brugt tilstedeværelse_element_lokeret () metode til forventede_betingelser som den eksplicitte ventetilstand for at sikre, at det element, jeg ledte efter, eksisterer, før du vælger det.

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

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

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

visibility_of (element) - kontrollerer, om element er synlig på den side, hvor elementet har bredde og højde større end 0.

visibility_of_element_located (locator) -

tilstedeværelse_af_element_lokeret (lokalisering) - Sørg for, at elementet er placeret (ved lokalisator) findes på siden. Det lokalisator er en tuple af (Af, vælger), som jeg har vist i det eksplicit ventende eksempel.

tilstedeværelse_all_element_located () - Sørger for, at alt element matchet med lokalisator er til stede på siden. Det lokalisator er en (Af, vælger) tuple.

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

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

element_til_be_selected (locator) - Kontrollerer, om elementet er placeret ved lokalisator er valgt. Det lokalisator er en (Af, vælger) tuple.

alarm_is_present () - forventer, at der vises en alarmdialog på siden.

Der er mange flere forventede_betingelser tilgængelig for dig at bruge. For mere information om disse, besøg Python Selen API-dokumentationssiden.

Konklusion:

I denne artikel har jeg diskuteret Selenis 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 Selen-projekter, da Selen vil forsøge at reducere ventetiden så meget som muligt. På denne måde behøver du ikke vente på et bestemt antal sekunder hver gang du kører dine Selen-projekter. Den eksplicitte ventetid skulle spare mange sekunder.

For mere information om Selen-ventetid, besøg den officielle Selenium Python Library-ventedokumentationsside.

Nyttige værktøjer til Linux-spillere
Hvis du kan lide at spille spil på Linux, er chancerne for, at du måske har brugt apps og hjælpeprogrammer som Wine, Lutris og OBS Studio for at forbe...
HD Remastered-spil til Linux, der aldrig tidligere havde haft en Linux-udgivelse
Mange spiludviklere og udgivere kommer med HD-remaster af gamle spil for at forlænge franchisens levetid. Venligst fans, der anmoder om kompatibilitet...
Sådan bruges AutoKey til at automatisere Linux-spil
AutoKey er et desktopautomatiseringsværktøj til Linux og X11, programmeret i Python 3, GTK og Qt. Ved hjælp af dets scripting og MACRO-funktionalitet ...