Kako pričekati da se stranica učita selenom

How Wait Page Load With Selenium

Dok se web automatizacija ili struganje weba pomoću Selenium web upravljačkog programa može suočiti s problemima poput elementa koji želite odabrati nije dostupan ili gumb koji želite pritisnuti nije spreman za klik itd.

Razlog zašto se to događa je to što Selenium web upravljački program mora preuzeti web stranicu i dovršiti iscrtavanje stranice prije nego što možete učiniti bilo što na njoj. U prošlosti je web poslužitelj generirao sadržaj web stranice, a preglednik ga je samo preuzeo i iscrtao. Ovih dana imamo mnogo web stranica s jednom stranicom koje rade malo drugačije. U web stranicama za jednu stranicu (SPA) web poslužitelj služi samo kodovima sučelja. Nakon što se kôd sučelja prikaže u pregledniku, kôd sučelja koristi AJAX za traženje API podataka na web poslužitelju. Nakon što sučelje primi podatke API -ja, generira ih u pregledniku. Dakle, iako je preglednik završio s preuzimanjem i iscrtavanjem web stranice, web stranica još uvijek nije spremna. Morate pričekati da primi podatke API -ja i da ih također prikaže. Dakle, rješenje ovog problema je pričekati da podaci budu dostupni prije nego učinimo bilo što sa Selenom.



U selenu postoje dvije vrste čekanja:
1) Implicitno čekanje
2) Eksplicitno čekanje



1) Implicitno čekanje: Ovo je najlakše implementirati. Implicitno čekanje govori web -upravljačkom programu Selenium da pričeka nekoliko sekundi da DOM (objektni model dokumenta) bude spreman (web stranica mora biti spremna).



2) Eksplicitno čekanje: Ovo je malo složenije od implicitnog čekanja. U izričitom čekanju, kažete Selenium web upravljačkom programu što čekati. Selen čeka da se ispuni taj uvjet. Nakon što se ispuni, Selenium web upravljački program bit će spreman za primanje drugih naredbi. Obično je eksplicitno vrijeme čekanja promjenjivo. Ovisi o tome koliko brzo su uvjeti zadovoljeni. U najgorem slučaju, eksplicitno čekanje čekat će sve dok implicitno čekanje.

U ovom članku pokazat ću vam kako pričekati (implicitno i eksplicitno) da se stranica učita Selenijom. Dakle, krenimo.

Preduvjeti:

Da biste isprobali naredbe i primjere ovog članka, morate imati:



1) Linux distribucija (po mogućnosti Ubuntu) instalirana na vašem računalu.
2) Python 3 instaliran na vašem računalu.
3) PIP 3 instaliran na vašem računalu.
4) Python virtualenv paket instaliran na vašem računalu.
5) Mozilla Firefox ili Google Chrome web preglednici instalirani na vašem računalu.
6) Morate znati kako instalirati upravljački program Firefox Gecko ili Chrome web upravljački program.

Kako biste ispunili uvjete 4, 5 i 6, pročitajte moj članak Uvod u selen s Pythonom 3 na Linuxhint.com.

Možete pronaći mnoge članke o drugim temama na LinuxHint.com . Svakako ih provjerite ako trebate pomoć.

Postavljanje direktorija projekta:

Da bi sve bilo organizirano, izradite novi direktorij projekta selen-čekaj/ kako slijedi:

$mkdir -pvselen-čekaj/vozači

Idite na selen-čekaj/ direktorij projekta na sljedeći način:

$CDselen-čekaj/

Napravite Python virtualno okruženje u direktoriju projekta na sljedeći način:

$virtualenv .venv

Aktivirajte virtualno okruženje na sljedeći način:

$izvor.venv/am/aktivirati

Instalirajte Selenium pomoću PIP3 na sljedeći način:

$ pip3 instalirajte selen

Preuzmite i instalirajte sve potrebne web upravljačke programe u vozači/ imenik projekta. U svom sam članku objasnio postupak preuzimanja i instaliranja mrežnih upravljačkih programa Uvod u selen s Pythonom 3 . Ako vam je potrebna pomoć, tražite dalje LinuxHint.com za taj članak.

Za demonstraciju u ovom članku koristit ću web preglednik Google Chrome. Dakle, ja ću koristiti kromirani upravljač binarni iz vozači/ imenik.

Da biste eksperimentirali s implicitnim čekanjem, stvorite novu Python skriptu ex01.py u direktorij vašeg projekta i upišite sljedeće redove kodova u tu datoteku.

izselenuvozwebdriver
izselen.webdriver.uobičajen.ključeve uvozKljučevi
mogućnosti=webdriver.ChromeOpcije()
mogućnosti.bezglav = Pravi
preglednik=webdriver.Krom(izvršni_put='./drivers/chromedriver',mogućnosti=mogućnosti)
preglednik.implicitno_čekajte(10)
preglednik.dobiti('https://www.unixtimestamp.com/')
vremenska oznaka=preglednik.find_element_by_xpath('// h3 [@] [1]')
ispisati('Trenutna vremenska oznaka: %s'%(vremenska oznaka.tekst.podjela('')[0]))
preglednik.Zatvoriti()

Kada završite, spremite ex01.py Python skripta.

Linija 1 i 2 uvoze sve potrebne komponente selena.

Redak 4 stvara objekt Chromeovih mogućnosti.

Redak 5 omogućuje način rada bez glave za web -upravljački program Chrome.

Redak 7 stvara objekt preglednika Chrome koristeći kromirani upravljač binarni iz vozači/ imenik.

Red 8 koristi se da kaže Seleniumu da implicitno čeka 10 sekundi pomoću implicitno_čekati () metoda preglednika.

Redak 10 učitava www.unixtimestamp.com u preglednik.

Redak 12 pronalazi element vremenske oznake pomoću birača XPath // h3 [@class = ’text-hazard’] [1] i pohranjuje ga u vremenska oznaka promjenjivo.

Odabir XPath -a dobio sam iz alata za razvojne programere Chrome. Kao što vidite, vremenska oznaka je u prvom h3 element s imenom klase tekstualna opasnost . Postoje 2 h3 elementi s klasom tekstualna opasnost .

Redak 13 ispisuje samo vremensku oznaku iz elementa koji sam odabrao pomoću XPath birača i pohranio u vremenska oznaka promjenjivo.

Redak 14 zatvara preglednik.

Kada završite, pokrenite Python skriptu ex01.py kako slijedi:

$ python3 ex01.py

Kao što vidite, trenutna vremenska oznaka izdvaja se s unixtimestamp.com i ispisuje na konzoli.

Rad s eksplicitnim čekanjem:

Da biste eksperimentirali s eksplicitnim čekanjem, stvorite novu skriptu Python ex02.py u direktorij vašeg projekta i upišite sljedeće redove kodova u tu datoteku.

izselenuvozwebdriver
izselen.webdriver.uobičajen.ključeve uvozKljučevi
izselen.webdriver.uobičajen.po uvozPo
izselen.webdriver.podršku.luk uvozWebDriverWait
izselen.webdriver.podršku uvozočekivani_uvjeti
mogućnosti=webdriver.ChromeOpcije()
mogućnosti.bezglav = Pravi
preglednik=webdriver.Krom(izvršni_put='./drivers/chromedriver',mogućnosti=mogućnosti)
preglednik.dobiti('https://www.unixtimestamp.com/')
probati:
vremenska oznaka=WebDriverWait(preglednik, 10).do(
očekivani_uvjeti.prisutnost_elementa_locirana((Po.XPATH, '
// h3 [@] [1] '
))
)
ispisati('Trenutna vremenska oznaka: %s'%(vremenska oznaka.tekst.podjela('')[0]))
konačno:
preglednik.Zatvoriti()

Kada završite, spremite ex02.py Python skripta.

Redak 1-5 uvozi sve potrebne komponente iz biblioteke Selenium.

Redak 7 stvara objekt Chromeove mogućnosti.

Redak 8 omogućuje način rada bez glave za web -upravljački program Chrome.

Redak 10 stvara objekt preglednika Chrome pomoću kromirani upravljač binarni iz vozači/ imenik.

Redak 12 učitava www.unixtimestamp.com u preglednik.

Eksplicitno čekanje implementirano je u blok pokušaj konačno (iz retka 14-20)

Redak 15-17 koristi stvara WebDriverWait () objekt. Prvi argument WebDriverWait () je objekt preglednika, a drugi argument je maksimalno dopušteno vrijeme (u najgorem slučaju) za ispunjenje uvjeta, što je u ovom slučaju 10 sekundi.

U do() blok, očekivani_uvjeti.prisutnost_elementa_located () koristi se kako bi se provjerilo je li element prisutan prije pokušaja odabira elementa. Ovdje, Autor.XPATH koristi se za iskazivanje prisutnost_elementa_locirana () metodom za odabir elementa koristili smo XPath selektor. Birač XPath je // h3 [@class = ’text-hazard’] [1] .

Nakon što se element pronađe, pohranjuje se u vremenska oznaka promjenjivo.

Redak 18 ispisuje samo vremensku oznaku s odabranog elementa.

Konačno, redak 19-20 zatvara preglednik.

Kada završite, pokrenite ex02.py Python skripta na sljedeći način:

$ python3 ex02.py

Kao što vidite, trenutna vremenska oznaka s unixtimestamp.com ispisana je na konzoli.

Odabir elemenata u eksplicitnim čekanjima:

U prethodnom odjeljku sam koristio Autor.XPATH za odabir elementa pomoću birača XPath. Elemente možete odabrati i pomoću ID -a, naziva oznake, naziva klase CSS, birača CSS -a itd.

U nastavku su navedene podržane metode odabira:

Autor.XPATH - Odabir elemenata/elemenata pomoću XPath birača.

Autor.CLASS_NAME - Odabire element/elemente pomoću naziva CSS klase.

Napisao.CSS_SELECTOR - Odabire element/elemente pomoću CSS birača.

Napisao.ID - Odabir elementa prema ID -u

Imenom - Odabir elementa/elemenata po imenu.

Autor: TAG_NAME - Odabire element/elemente prema nazivu HTML oznake.

Autor.LINK_TEXT - Odabire element/elemente prema tekstu veze od do (sidro) HTML oznaka.

Autor: PARTIAL_LINK_TEXT - Odabire element/elemente prema djelomičnom tekstu veze od do (sidro) HTML oznaka.

Za više informacija o njima posjetite Stranica dokumentacije Python Selenium API .

Očekivani uvjeti u eksplicitnim čekanjima:

U ranijem primjeru eksplicitnog čekanja koristio sam prisutnost_elementa_locirana () metoda očekivani_uvjeti kao izričit uvjet čekanja kako bih se uvjerio da element koji sam tražio postoji prije nego što ga odaberem.

Postoje i drugi očekivani_uvjeti možete koristiti kao izričit uvjet čekanja. Neki od njih su:

title_is (naslov) - provjerava je li naslov stranice titula .

title_contains (djelomični_naslov) - provjerava sadrži li naslov stranice dio naslova djelomični_naslov .

visibility_of (element) - provjerava jesu li element je vidljivo na stranici koja ima element širine i visine veće od 0.

visibility_of_element_located (locator) -

prisutnost_elementa_lociranog (lokator) - Uvjerite se da se element nalazi (kod lokator ) je prisutan na stranici. The lokator je hrpa od (By, selektor), kao što sam pokazao u primjeru eksplicitnog čekanja.

prisutnost_svog_elementa_locirano () - Pazi da svi elementi odgovaraju lokator prisutna je na stranici. The lokator je (By, selektor) tuple.

text_to_be_present_in_element (lokator, tekst) - Provjerava je li tekst prisutan je u elementu koji se nalazi uz lokator . The lokator je (By, selektor) tuple.

element_to_be_clickable (lokator) - Provjerava nalazi li se element pored lokator vidljiv je i na njega se može kliknuti. The lokator je (By, selektor) tuple.

element_to_be_select (locator) - Provjerava nalazi li se element pored lokator je odabran. The lokator je (By, selektor) tuple.

alert_is_present () - očekujte da će dijalog upozorenja biti prisutan na stranici.

Ima ih još mnogo očekivani_uvjeti dostupna za korištenje. Za više informacija o njima posjetite Stranica dokumentacije Python Selenium API .

Zaključak:

U ovom članku raspravljao sam o implicitnim i eksplicitnim čekanjima Selenium -a. Također sam vam pokazao kako raditi s implicitnim i eksplicitnim čekanjem. U svojim projektima Selenium uvijek biste trebali koristiti eksplicitno čekanje jer će Selenium pokušati smanjiti vrijeme čekanja što je više moguće. Na ovaj način nećete morati čekati određeni broj sekundi svaki put kada pokrenete svoje Selenium projekte. Izričito čekanje trebalo bi uštedjeti mnogo sekundi.

Za više informacija o čekanju selena posjetite službena biblioteka Selenium Python čeka stranicu s dokumentacijom .