Selen

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

Hur man väntar på att en sida ska laddas med selen
Medan webbautomatisering eller webbskrapning med Selenium-webbdrivrutin kan du möta problem som att elementet du vill välja inte är tillgängligt eller att knappen du vill trycka 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 slutföra 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 renderade den. Dessa dagar har vi många enkelsidiga webbappar som fungerar lite annorlunda. I enstaka webbappar (SPA) serverar webbservern endast frontend-koder. När frontend-koden återges i webbläsaren använder frontend-koden AJAX för att begära API-data till webbservern. När frontend tar emot API-data återges den i webbläsaren. Så även om webbläsaren har laddat ner och renderat webbsidan är webbsidan fortfarande inte klar. Du måste vänta tills den tar emot API-data och återger dem också. Så lösningen på detta problem är att vänta på att informationen är tillgänglig innan vi gör något med Selen.

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

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

2) Explicit väntan: Det här är lite komplicerat ä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 den väl har uppfyllts ä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 så länge den implicita väntar.

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

Förutsättningar:

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

1) En Linux-distribution (helst Ubuntu) installerad på din dator.
2) Python 3 installerad på din dator.
3) PIP 3 installerad på din dator.
4) Python virtualenv paketet 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 de andra ämnena på LinuxHint.com. Var noga med att kolla in dem om du behöver hjälp.

Ställa in en projektkatalog:

Skapa en ny projektkatalog för att hålla allt ordnat selen-vänta / som följer:

$ mkdir -pv selen-wait / drivrutiner

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

$ cd selen-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 / bin / aktivera

Installera Selen med PIP3 enligt följande:

$ pip3 installera selen

Ladda ner och installera alla nödvändiga webbdrivrutiner i förare / projektkatalogen. 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är från förare / katalog.

Arbeta med implicit väntan:

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ån selenimportwebdriver
från selen.webbdrivare.allmänning.nycklar importerar nycklar
alternativ = webdriver.ChromeOptions ()
alternativ.headless = Sant
webbläsare = webdriver.Chrome (executable_path = "./ drivers / chromedriver ", optioner = optioner)
webbläsare.implicit_wait (10)
webbläsare.få ("https: // www.unixtimestamp.com / ")
tidsstämpel = webbläsare.find_element_by_xpath ("// h3 [@ class = 'text-danger'] [1]")
skriv ut ('Aktuell tidsstämpel:% s'% (tidsstämpel.text.split (") [0]))
webbläsare.stänga()

När du är klar sparar du ex01.py Python-skript.

Linje 1 och 2 importerar alla nödvändiga Selen-komponenter.

Rad 4 skapar ett Chrome-alternativ-objekt.

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

Linje 7 skapar ett Chrome-webbläsarobjekt med hjälp av kromförare binär från förare / katalog.

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

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

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

Jag har 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 det element som jag har valt med XPath-väljaren och lagrad 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 kan se extraheras den aktuella tidsstämpeln från unixtimestamp.com och tryckt på konsolen.

Arbeta med Explicit Wait:

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

från selenimportwebdriver
från selen.webbdrivare.allmänning.nycklar importerar nycklar
från selen.webbdrivare.allmänning.genom import av
från selen.webbdrivare.Stöd.ui importera WebDriverWait
från selen.webbdrivare.stödja import förväntade villkor
alternativ = webdriver.ChromeOptions ()
alternativ.headless = Sant
webbläsare = webdriver.Chrome (executable_path = "./ drivers / chromedriver ", optioner = optioner)
webbläsare.få ("https: // www.unixtimestamp.com / ")
Prova:
tidsstämpel = WebDriverWait (webbläsare, 10).fram tills(
förväntade_villkor.närvaro_element_lokerad ((av.XPATH, "
// h3 [@ class = 'text-danger'] [1] "))
)
skriv ut ('Aktuell tidsstämpel:% s'% (tidsstämpel.text.split (") [0]))
till sist:
webbläsare.stänga()

När du är klar sparar du ex02.py Python-skript.

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

Rad 7 skapar ett Chrome-alternativ-objekt.

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

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

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

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

Rad 15-17 använder skapar WebDriverWait () objekt. Det första argumentet av WebDriverWait () är webbläsarobjektet och det andra argumentet är den maximalt tillåtna tiden (worst-case scenario) för att uppfylla villkoret, vilket är 10 sekunder i det här fallet.

I fram tills() blockera, förväntade_villkor.närvaro_element_placerad () metoden används för att säkerställa att elementet är närvarande innan du försöker välja elementet. Här, Förbi.XPATH används för att berätta för närvaro_element_placerad () metod som vi har använt en XPath-väljare för att välja elementet. XPath-väljaren är // h3 [@ class = 'text-danger'] [1].

När elementet har 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 den aktuella tidsstämpeln från unixtimestamp.com är tryckt på konsolen.

Välja element i uttryckliga väntetider:

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

De stödda urvalsmetoderna ges nedan:

Förbi.XPATH - Väljer element / element med XPath-väljare.

Förbi.KLASSNAMN - Väljer element / element med CSS-klassnamn.

Förbi.CSS_SELECTOR - Väljer element / element med CSS-väljare.

Förbi.ID - Väljer element efter ID

Förbi.NAMN - Väljer element / element efter namn.

Förbi.TAGGNAMN - Väljer element / element efter HTML-taggnamn.

Förbi.LINK_TEXT - Väljer element / element efter länktext av a (ankare) HTML-tagg.

Förbi.PARTIAL_LINK_TEXT - Väljer element / element genom partiell länktext av a (ankare) HTML-tagg.

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

Förväntade förhållanden i väntat väntetid:

I det tidigare uttryckliga väntande exemplet har jag använt närvaro_element_placerad () metod av förväntade_villkor som det uttryckliga väntetillståndet för att se till att elementet jag letade efter finns innan du väljer det.

Det finns andra förväntade_villkor du kan använda som ett uttryckligt vänteläge. 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 delvis_titel.

visibility_of (element) - kontrollerar om element är synlig på sidan där elementet har bredden och höjden större än 0.

visibility_of_element_located (locator) -

närvaro_element_placerad (lokaliserare) - Se till att elementet ligger (vid lokalisator) finns på sidan. De lokalisator är en tupel av (Av, väljare), som jag har visat i det uttryckliga väntande exemplet.

närvaro_av_all_element_placerad () - Ser till att allt element matchas av lokalisator finns på sidan. De lokalisator är en (Av, väljare) tupel.

text_to_be_present_in_element (lokaliserare, text) - Kontrollerar om text är närvarande i elementet som ligger vid lokalisator. De lokalisator är en (Av, väljare) tupel.

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

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

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

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

Slutsats:

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

För mer information om Selenium waits, besök den officiella Selenium Python Library waits Documentation-sidan.

Mus Mellan musknappen fungerar inte i Windows 10
Mellan musknappen fungerar inte i Windows 10
De mittknappen hjälper dig att bläddra igenom långa webbsidor och skärmar med mycket data. Om det slutar, kommer du sluta använda tangentbordet för at...
Mus Hur man ändrar vänster och höger musknapp på Windows 10 PC
Hur man ändrar vänster och höger musknapp på Windows 10 PC
Det är en hel norm att alla datormusenheter är ergonomiskt utformade för högerhänta användare. Men det finns musenheter tillgängliga som är speciellt ...
Mus Emulera musklick genom att sväva med Clickless Mouse i Windows 10
Emulera musklick genom att sväva med Clickless Mouse i Windows 10
Att använda en mus eller tangentbord i fel hållning av överdriven användning kan resultera i många hälsoproblem, inklusive stam, karpaltunnelsyndrom o...