Kako počakati, da se stran naloži s selenom

How Wait Page Load With Selenium



Medtem ko spletna avtomatizacija ali strganje s spletnim gonilnikom Selenium povzroči težave, na primer element, ki ga želite izbrati, ni na voljo ali gumb, ki ga želite pritisniti, ni pripravljen za klik itd.

Razlog za to je, da mora spletni gonilnik Selenium prenesti spletno stran in dokončati upodabljanje strani, preden lahko na njej kaj storite. V preteklosti je spletni strežnik ustvarjal vsebino spletnega mesta, brskalnik pa ga je samo prenesel in upodobil. Dandanes imamo veliko spletnih strani z eno stranjo, ki delujejo nekoliko drugače. V spletnih aplikacijah za eno stran (SPA) spletni strežnik streže samo kode vmesnika. Ko je koda vmesnika upodobljena v brskalniku, koda vmesnika uporablja AJAX, da zahteva podatke API -ja na spletnem strežniku. Ko vmesnik prejme podatke API, jih upodobi v brskalniku. Torej, čeprav je brskalnik prenesel in upodobil spletno stran, spletna stran še vedno ni pripravljena. Počakati morate, da prejme podatke API -ja in jih tudi upodobi. Rešitev tega problema je torej počakati, da bodo podatki na voljo, preden naredimo kaj s Selenom.







V selenu obstajata dve vrsti čakanja:
1) Implicitno čakanje
2) Eksplicitno čakanje



1) Implicitno čakanje: To je najlažje izvesti. Implicitno čakanje pove spletnemu gonilniku Selenium, naj počaka nekaj sekund, da bo DOM (objektni model dokumenta) pripravljen (spletna stran je pripravljena).



2) Eksplicitno čakanje: To je nekoliko bolj zapleteno kot implicitno čakanje. Pri izrecnem čakanju spletnemu gonilniku Selenium poveš, kaj naj čaka. Selen čaka na izpolnitev tega posebnega pogoja. Ko bo izpolnjen, bo spletni gonilnik Selenium pripravljen sprejeti druge ukaze. Običajno je izrecni čakalni čas spremenljiv. Odvisno je od tega, kako hitro so pogoji izpolnjeni. V najslabšem primeru bo izrecno čakanje čakalo tako dolgo kot implicitno čakanje.





V tem članku vam bom pokazal, kako počakati (implicitno in eksplicitno), da se stran naloži s selenom. Torej, začnimo.

Predpogoji:

Če želite preizkusiti ukaze in primere tega članka, morate imeti:



1) V vašem računalniku nameščena distribucija Linuxa (po možnosti Ubuntu).
2) Python 3 je nameščen na vašem računalniku.
3) PIP 3 nameščen na vašem računalniku.
4) Python virtualenv paket, nameščen v računalniku.
5) Spletni brskalniki Mozilla Firefox ali Google Chrome, nameščeni v vašem računalniku.
6) Morate vedeti, kako namestiti gonilnik Firefox Gecko ali spletni gonilnik Chrome.

Če želite izpolniti zahteve 4, 5 in 6, preberite moj članek Uvod v selen s Pythonom 3 na naslovu Linuxhint.com.

Tu lahko najdete veliko člankov o drugih temah LinuxHint.com . Če potrebujete pomoč, jih obvezno preverite.

Nastavitev imenika projekta:

Če želite, da je vse organizirano, ustvarite nov imenik projektov selen-čakaj/ kot sledi:

$mkdir -pvselen-čakaj/vozniki

Pomaknite se do selen-čakaj/ imenik projekta, kot sledi:

$CDselen-čakaj/

Ustvarite navidezno okolje Python v imeniku projekta na naslednji način:

$virtualenv .venv

Navidezno okolje aktivirajte na naslednji način:

$vir.venv/sem/aktivirati

Namestite selen z uporabo PIP3 na naslednji način:

$ pip3 namestite selen

Prenesite in namestite ves zahtevani spletni gonilnik v vozniki/ imenik projekta. Postopek prenosa in namestitve spletnih gonilnikov sem razložil v svojem članku Uvod v selen s Pythonom 3 . Če potrebujete pomoč, poiščite LinuxHint.com za tisti članek.

Za predstavitev v tem članku bom uporabil spletni brskalnik Google Chrome. Torej bom uporabljal kromiran binarni iz vozniki/ imenik.

Če želite eksperimentirati z implicitnim čakanjem, ustvarite nov skript Python ex01.py v imenik vašega projekta in vnesite naslednje vrstice kod v to datoteko.

odselenauvozspletni gonilnik
odselena.spletni gonilnik.običajni.ključe uvozKljuči
opcije=spletni gonilnik.ChromeOptions()
opcije.brez glave = Prav
brskalnik=spletni gonilnik.Chrome(executable_path='./drivers/chromedriver',opcije=opcije)
brskalnik.implicitno_počakajte(10)
brskalnik.dobiti('https://www.unixtimestamp.com/')
časovni žig=brskalnik.find_element_by_xpath('// h3 [@] [1]')
tiskanje('Trenutni časovni žig: %s'%(časovni žig.besedilo.razcepljeno('')[0]))
brskalnik.blizu()

Ko končate, shranite ex01.py Python skript.

V vrstici 1 in 2 se uvažajo vse potrebne komponente selena.

4. vrstica ustvari predmet Možnosti Chroma.

Vrstica 5 omogoča brezglavi način za spletni gonilnik Chrome.

Vrstica 7 ustvari objekt brskalnika Chrome s pomočjo kromiran binarni iz vozniki/ imenik.

Vrstica 8 se uporablja za povedo Selenium, da implicitno počaka 10 sekund z uporabo implicitno_wait () brskalniški način.

Vrstica 10 naloži www.unixtimestamp.com v brskalnik.

Vrstica 12 najde element časovnega žiga z izbirnikom XPath // h3 [@class = ’text-hazard’] [1] in ga shrani v časovni žig spremenljivka.

Iz orodja za razvijalce za Chrome sem dobil izbirnik XPath. Kot lahko vidite, je časovni žig na prvem mestu h3 element z imenom razreda besedilna nevarnost . Obstajata 2 h3 elementi s razredom besedilna nevarnost .

Vrstica 13 natisne samo časovni žig elementa, ki sem ga izbral z izbirnikom XPath in shranjen v datoteki časovni žig spremenljivka.

Vrstica 14 zapre brskalnik.

Ko končate, zaženite skript Python ex01.py kot sledi:

$ python3 ex01.py

Kot lahko vidite, je trenutni časovni žig izvlečen iz unixtimestamp.com in natisnjen na konzoli.

Delo z Explicit Wait:

Če želite eksperimentirati z izrecnim čakanjem, ustvarite nov skript Python ex02.py v imenik vašega projekta in vnesite naslednje vrstice kod v to datoteko.

odselenauvozspletni gonilnik
odselena.spletni gonilnik.običajni.ključe uvozKljuči
odselena.spletni gonilnik.običajni.avtor: uvozAvtor:
odselena.spletni gonilnik.podpora.čebula uvozWebDriverWait
odselena.spletni gonilnik.podpora uvozpričakovani_pogoji
opcije=spletni gonilnik.ChromeOptions()
opcije.brez glave = Prav
brskalnik=spletni gonilnik.Chrome(executable_path='./drivers/chromedriver',opcije=opcije)
brskalnik.dobiti('https://www.unixtimestamp.com/')
poskusite:
časovni žig=WebDriverWait(brskalnik, 10).dokler(
pričakovani_pogoji.prisotnost_elementa_locirana((Avtor:.XPATH, '
// h3 [@] [1] '
))
)
tiskanje('Trenutni časovni žig: %s'%(časovni žig.besedilo.razcepljeno('')[0]))
končno:
brskalnik.blizu()

Ko končate, shranite ex02.py Python skript.

Vrstica 1-5 uvozi vse potrebne komponente iz knjižnice Selenium.

Vrstica 7 ustvari predmet Možnosti Chroma.

Vrstica 8 omogoča brezglavi način za spletni gonilnik Chrome.

Vrstica 10 ustvari objekt brskalnika Chrome z uporabo kromiran binarni iz vozniki/ imenik.

Vrstica 12 naloži www.unixtimestamp.com v brskalnik.

Eksplicitno čakanje je izvedeno v bloku try-final (iz vrstice 14-20)

Vrstica 15-17 uporablja ustvarja WebDriverWait () predmet. Prvi argument WebDriverWait () je objekt brskalnika, drugi argument pa je največji dovoljeni čas (v najslabšem primeru) za izpolnitev pogoja, ki je v tem primeru 10 sekund.

V dokler () blok, pričakovani_pogoji.prisotnost_elementa_located () metoda se uporablja za preverjanje prisotnosti elementa, preden poskusite izbrati element. Tukaj, Avtor.XPATH se uporablja za povedati prisotnost_elementa_locirano () metodo, da smo za izbiro elementa uporabili izbirnik XPath. Izbirnik XPath je // h3 [@class = ’text-hazard’] [1] .

Ko element najdemo, ga shranimo v časovni žig spremenljivka.

Vrstica 18 natisne samo časovni žig iz izbranega elementa.

Nazadnje vrstica 19-20 zapre brskalnik.

Ko končate, zaženite ex02.py Python skript:

$ python3 ex02.py

Kot lahko vidite, je trenutni časovni žig unixtimestamp.com natisnjen na konzoli.

Izbira elementov v eksplicitnih čakalnicah:

V prejšnjem razdelku sem uporabil Avtor.XPATH za izbiro elementa z izbirnikom XPath. Elemente lahko izberete tudi z ID -jem, imenom oznake, imenom razreda CSS, izbirnikom CSS itd.

Spodaj so navedene podprte metode izbire:

Avtor.XPATH - Izbere element/elemente z izbirnikom XPath.

Avtor.CLASS_NAME - Izbere element/elemente z imenom razreda CSS.

Avtor.CSS_SELECTOR - Izbere element/elemente z izbirnikom CSS.

Avtor.ID - Izbere element po ID -ju

Avtor.NAME - Izbere element/elemente po imenu.

Avtor :.TAG_NAME - Izbere element/elemente po imenu oznake HTML.

Avtor.LINK_TEXT - Izbere element/elemente glede na besedilo povezave do (sidro) oznaka HTML.

Avtor :.PARTIAL_LINK_TEXT - Izbere element/elemente z delnim besedilom povezave do (sidro) oznaka HTML.

Za več informacij o tem obiščite Stran z dokumentacijo Python Selenium API .

Pričakovani pogoji v eksplicitnih čakanjih:

V prejšnjem primeru izrecnega čakanja sem uporabil prisotnost_elementa_locirano () metoda pričakovani_pogoji kot pogoj za izrecno čakanje, da se prepričam, da element, ki sem ga iskal, obstaja, preden ga izberem.

Obstajajo še drugi pričakovani_pogoji lahko uporabite kot izrecni pogoj čakanja. Nekateri med njimi so:

title_is (naslov) - preveri, ali je naslov strani naslov .

title_contains (delni_naslov) - preveri, ali naslov strani vsebuje del naslova delni_naslov .

visibility_of (element) - preveri, ali je element je vidno na strani, pri kateri ima element širino in višino več kot 0.

visibility_of_element_located (locator) -

prisotnost_elementa_lociran (lokator) - Prepričajte se, da je element (pri lokator ) je na strani. The lokator je nabor (Z, izbirnik), kot sem pokazal v primeru izrecnega čakanja.

prisotnost_vsih_elementov_lociranih () - Poskrbi, da se vsi elementi ujemajo z lokator je prisoten na strani. The lokator je (Avtor, izbirnik) tuple.

text_to_be_present_in_element (lokator, besedilo) - Preveri, ali je besedilo je prisoten v elementu, ki se nahaja v lokator . The lokator je (Avtor, izbirnik) tuple.

element_to_be_clickable (lokator) - Preveri, ali je element, ki se nahaja pri lokator je vidna in nanjo je mogoče klikniti. The lokator je (Avtor, izbirnik) tuple.

element_to_be_selected (lokator) - Preveri, ali je element, ki se nahaja pri lokator je izbrano. The lokator je (Avtor, izbirnik) tuple.

alert_is_present () - pričakujte, da bo na strani prikazano pogovorno okno z opozorili.

Obstaja še veliko več pričakovani_pogoji na voljo za uporabo. Za več informacij o tem obiščite Stran z dokumentacijo Python Selenium API .

Zaključek:

V tem članku sem razpravljal o implicitnih in eksplicitnih pričakovanjih Selenium. Pokazal sem vam tudi, kako delati z implicitnim in eksplicitnim čakanjem. V svojih projektih Selenium vedno poskušajte uporabiti izrecno čakanje, saj bo Selenium poskušal čim bolj skrajšati čakalni čas. Tako vam ne bo treba čakati na določeno število sekund vsakič, ko zaženete svoje projekte Selenium. Eksplicitno čakanje bi moralo prihraniti veliko sekund.

Za več informacij o čakanju na selen obiščite uradna knjižnica Selenium Python čaka na stran z dokumentacijo .