Hur man väntar på att en sida ska laddas med selen

How Wait Page Load With Selenium



Medan webbautomatisering eller webbskrapning med Selenium -webbdrivrutin kan du stöta på problem som att elementet du vill välja inte är tillgängligt eller att knappen du vill trycka på inte är redo att klicka på och så vidare.

Anledningen till att detta händer är att Selenium -webbdrivrutinen måste ladda ner webbsidan och avsluta renderingen av sidan innan du kan göra något på den. Tidigare genererade webbservern innehållet på en webbplats och webbläsaren laddade bara ner den och återgav den. Idag har vi många enkelsidiga webbappar som fungerar lite annorlunda. I enkelsidiga webbappar (SPA: er) serverar webbservern endast frontendkoder. När frontend -koden har gjorts i webbläsaren använder frontend -koden AJAX för att begära API -data till webbservern. När frontend har tagit emot API -data, återges det i webbläsaren. Så, även om webbläsaren har laddat ner och återger webbsidan, är webbsidan fortfarande inte klar. Du måste vänta på att API -data tas emot och återges också. Så lösningen på detta problem är att vänta tills data är tillgängliga innan vi gör något med Selenium.







I selen finns det två typer av väntetider:
1) Implicit vänta
2) Explicit vänta



1) Implicit väntan: Detta är det enklaste att genomföra. En implicit väntan ber Selenium -webbdrivrutinen vänta i flera sekunder för att DOM (dokumentobjektmodell) ska vara klar (webbsidan ska vara klar).



2) Explicit vänta: Det här är lite komplext än den implicita väntan. I uttrycklig väntan säger du till Selenium -webbdrivrutinen vad du ska vänta på. Selen väntar på att det specifika villkoret ska uppfyllas. När det är uppfyllt är Selenium -webbdrivrutinen redo att ta andra kommandon. Vanligtvis är den uttryckliga väntetiden variabel. Det beror på hur snabbt villkoren är uppfyllda. I värsta fall väntar den uttryckliga väntan lika länge som den implicita väntan.





I den här artikeln kommer jag att visa dig hur du väntar (implicit och tydligt) på att en sida ska laddas med Selenium. Så, låt oss komma igång.

Förkunskaper:

För att prova kommandona och exemplen på den här artikeln måste du ha,



1) En Linux -distribution (helst Ubuntu) installerad på din dator.
2) Python 3 installerat på din dator.
3) PIP 3 installerat på din dator.
4) Python virtualenv paket installerat på din dator.
5) Mozilla Firefox eller Google Chrome webbläsare installerade på din dator.
6) Måste veta hur man installerar Firefox Gecko Driver eller Chrome Web Driver.

För att uppfylla kraven 4, 5 och 6, läs min artikel Introduktion till selen med Python 3 på Linuxhint.com.

Du kan hitta många artiklar om andra ämnen på LinuxHint.com . Var noga med att kolla in dem om du behöver hjälp.

Konfigurera en projektkatalog:

För att hålla allt organiserat, skapa en ny projektkatalog selen-vänta/ som följer:

$mkdir -pvselen-vänta/förare

Navigera till selen-vänta/ projektkatalog enligt följande:

$CDselen-vänta/

Skapa en virtuell Python -miljö i projektkatalogen enligt följande:

$virtualenv .venv

Aktivera den virtuella miljön enligt följande:

$källa.venv/am/Aktivera

Installera Selen med PIP3 enligt följande:

$ pip3 installera selen

Ladda ner och installera alla nödvändiga webbdrivrutiner i förare/ projektkatalog. Jag har förklarat processen för nedladdning och installation av webbdrivrutiner i min artikel Introduktion till selen med Python 3 . Om du behöver hjälp, sök vidare LinuxHint.com för den artikeln.

Jag kommer att använda webbläsaren Google Chrome för demonstrationen i den här artikeln. Så jag kommer att använda kromförare binärt från förare/ katalog.

För att experimentera med implicit väntan, skapa ett nytt Python -skript ex01.py i din projektkatalog och skriv in följande koderader i den filen.

frånselenimporterawebbdriver
frånselen.webbdriver.allmänning.nycklar importeraNycklar
alternativ=webbdriver.ChromeOptions()
alternativ.huvudlös = Sann
webbläsare=webbdriver.Krom(körbar_väg='./drivers/chromedriver',alternativ=alternativ)
webbläsare.implicit_vänta(10)
webbläsare.skaffa sig('https://www.unixtimestamp.com/')
tidsstämpel=webbläsare.hitta_element_by_xpath('// h3 [@] [1]')
skriva ut('Aktuell tidsstämpel: %s'%(tidsstämpel.text.dela('')[0]))
webbläsare.stänga()

När du är klar, spara ex01.py Python -skript.

Linje 1 och 2 importerar alla nödvändiga selenkomponenter.

Rad 4 skapar ett Chrome Options -objekt.

Linje 5 möjliggör headless -läge för Chrome -webbdrivrutinen.

Rad 7 skapar ett Chrome -webbläsarobjekt med kromförare binärt från förare/ katalog.

Linje 8 används för att berätta för Selenium att vänta implicit i 10 sekunder med implicit_wait () webbläsarmetod.

Rad 10 läser in www.unixtimestamp.com i webbläsaren.

Rad 12 hittar tidsstämpelelementet med XPath -väljaren // h3 [@class = ’text-fara’] [1] och lagrar den i tidsstämpel variabel.

Jag fick XPath -väljaren från Chrome Developer Tool. Som du kan se är tidsstämpeln i den första h3 element med klassnamnet text-fara . Det finns 2 h3 element med klassen text-fara .

Rad 13 skriver bara ut tidsstämpeln från elementet som jag har valt med XPath -väljaren och lagrat i tidsstämpel variabel.

Rad 14 stänger webbläsaren.

När du är klar kör du Python -skriptet ex01.py som följer:

$ python3 ex01.py

Som du ser extraheras den aktuella tidsstämpeln från unixtimestamp.com och skrivs ut på konsolen.

Arbeta med Explicit Wait:

För att experimentera med tydlig väntan, skapa ett nytt Python -skript ex02.py i din projektkatalog och skriv in följande koderader i den filen.

frånselenimporterawebbdriver
frånselen.webbdriver.allmänning.nycklar importeraNycklar
frånselen.webbdriver.allmänning.förbi importeraFörbi
frånselen.webbdriver.Stöd.lök importeraWebDriverWait
frånselen.webbdriver.Stöd importeraförväntade_förhållanden
alternativ=webbdriver.ChromeOptions()
alternativ.huvudlös = Sann
webbläsare=webbdriver.Krom(körbar_väg='./drivers/chromedriver',alternativ=alternativ)
webbläsare.skaffa sig('https://www.unixtimestamp.com/')
Prova:
tidsstämpel=WebDriverWait(webbläsare, 10).fram tills(
förväntade_förhållanden.närvaro_ av_element_lokaliserad((Förbi.XPATH, '
// h3 [@] [1] '
))
)
skriva ut('Aktuell tidsstämpel: %s'%(tidsstämpel.text.dela('')[0]))
till sist:
webbläsare.stänga()

När du är klar, spara ex02.py Python -skript.

Rad 1-5 importerar alla nödvändiga komponenter från selenbiblioteket.

Rad 7 skapar ett Chrome Options -objekt.

Linje 8 möjliggör huvudlöst läge för Chrome -webbdrivrutinen.

Rad 10 skapar ett Chrome -webbläsarobjekt med kromförare binärt från förare/ katalog.

Rad 12 laddar www.unixtimestamp.com i webbläsaren.

Den uttryckliga väntan implementeras i blocket försök-slutligen (från rad 14-20)

Linje 15-17 använder skapar WebDriverWait () objekt. Det första argumentet av WebDriverWait () är webbläsarobjektet, och det andra argumentet är den högsta tillåtna tiden (värsta fall) för att uppfylla villkoret, vilket är 10 sekunder i detta fall.

I fram tills() blockera, expect_conditions.presence_of_element_located () metod används för att se till att elementet är närvarande innan du försöker välja elementet. Här, By.XPATH används för att berätta närvaro_ av_element_locerad () metod som vi har använt en XPath -väljare för att välja elementet. XPath -väljaren är // h3 [@class = ’text-fara’] [1] .

När elementet hittats lagras det i tidsstämpel variabel.

Rad 18 skriver bara ut tidsstämpeln från det valda elementet.

Slutligen stänger rad 19-20 webbläsaren.

När du är klar kör du ex02.py Python -skript enligt följande:

$ python3 ex02.py

Som du kan se skrivs den aktuella tidsstämpeln från unixtimestamp.com ut på konsolen.

Välja element i Explicit Waits:

I det tidigare avsnittet har jag använt By.XPATH för att välja elementet med XPath -väljaren. Du kan också välja element med ID, taggnamn, CSS -klassnamn, CSS -väljare etc.

De valda metoderna som stöds ges nedan:

By.XPATH - Väljer element/element med XPath -väljare.

Av.CLASS_NAME - Väljer element/element med CSS -klassnamn.

Av.CSS_SELECTOR - Väljer element/element med CSS -väljare.

Av.ID - Väljer element efter ID

Vid namn - Väljer element/element efter namn.

Av.TAG_NAME - Väljer element/element efter HTML -taggnamn.

Av.LINK_TEXT - Väljer element/element efter länktext av till (ankare) HTML -tagg.

Av.PARTIAL_LINK_TEXT - Väljer element/element med delvis länktext av till (ankare) HTML -tagg.

För mer information om dessa, besök Python Selenium API -dokumentationssida .

Förväntade förhållanden i explicita väntetider:

I det tidigare uttryckliga väntetidsexemplet har jag använt närvaro_ av_element_locerad () metod av förväntade_förhållanden som det uttryckliga väntetillståndet för att se till att det element jag letade efter existerar innan du väljer det.

Det finns andra förväntade_förhållanden du kan använda som ett uttryckligt väntetillstånd. Några av dem är:

title_is (titel) - kontrollerar om sidans titel är titel .

title_contains (partial_title) - kontrollerar om sidans titel innehåller en del av titeln partiell_titel .

synlighet_of (element) - kontrollerar om element är synlig på sidan som är elementet har en bredd och höjd större än 0.

visibility_of_element_located (lokalisering) -

närvaro_ av_element_lokerad (lokaliserare) - Se till att elementet (vid lokaliserare ) finns på sidan. De lokaliserare är en tuppel av (Av, väljare), som jag har visat i det uttryckliga vänta -exemplet.

närvaro_av_all_element_locerad () - Se till att alla element matchas av lokaliserare finns på sidan. De lokaliserare är en (Av, väljare) tupel.

text_to_be_present_in_element (sökare, text) - Kontrollerar om text finns i elementet som ligger vid lokaliserare . De lokaliserare är en (Av, väljare) tupel.

element_to_be_clickable (lokalisering) - Kontrollerar om elementet ligger vid lokaliserare är synlig och klickbar. De lokaliserare är en (Av, väljare) tupel.

element_to_be_selected (lokalisering) - Kontrollerar om elementet ligger vid lokaliserare är vald. De lokaliserare är en (Av, väljare) tupel.

alert_is_present () - förvänta dig att en varningsdialogruta kommer att finnas på sidan.

Det finns många fler förväntade_förhållanden tillgängliga för dig att använda. För mer information om dessa, besök Python Selenium API -dokumentationssida .

Slutsats:

I den här artikeln har jag diskuterat Seleniums implicita och uttryckliga väntetider. Jag har också visat dig hur du arbetar med en implicit och tydlig väntan. Du bör alltid försöka använda uttrycklig väntan i dina Selen -projekt eftersom Selenium kommer att försöka minska väntetiden så mycket som möjligt. På så sätt behöver du inte vänta ett visst antal sekunder varje gång du kör dina selenprojekt. Den uttryckliga väntan bör spara många sekunder.

För mer information om Selenium väntar, besök det officiella Selenium Python -biblioteket väntar på dokumentationssidan .