Cum să așteptați încărcarea unei pagini cu seleniu

How Wait Page Load With Selenium



În timp ce automatizarea web sau răzuirea web cu driverul web Selenium, este posibil să vă confruntați cu probleme precum elementul pe care doriți să îl selectați nu este disponibil sau butonul pe care doriți să îl apăsați nu este gata să fie făcut clic și așa mai departe.

Motivul pentru care se întâmplă acest lucru este că driverul web Selenium trebuie să descarce pagina web și să termine redarea paginii înainte de a putea face ceva pe ea. În trecut, serverul web a generat conținutul unui site web, iar browserul tocmai l-a descărcat și l-a redat. În aceste zile avem multe aplicații web cu o singură pagină care funcționează puțin diferit. În aplicațiile web cu o singură pagină (SPA-uri), serverul web servește doar codurile frontend. Odată ce codul frontend este redat în browser, codul frontend folosește AJAX pentru a solicita date API către serverul web. Odată ce frontendul primește datele API, le redă în browser. Deci, chiar dacă browserul a terminat descărcarea și redarea paginii web, pagina web nu este încă gata. Trebuie să așteptați ca acesta să primească datele API și să le redea și ele. Deci, soluția la această problemă este să așteptăm ca datele să fie disponibile înainte de a face ceva cu Selenium.







În seleniu, există 2 tipuri de așteptări:
1) Așteptare implicită
2) Așteptare explicită



1) Așteptare implicită: Acesta este cel mai ușor de implementat. O așteptare implicită îi spune driverului web Selenium să aștepte câteva secunde pentru ca DOM (modelul documentului obiect) să fie gata (pagina web să fie gata).



2) Așteptare explicită: Acest lucru este puțin complex decât așteptarea implicită. În așteptare explicită, îi spuneți driverului web Selenium ce să aștepte. Seleniul așteaptă îndeplinirea acelei condiții specifice. Odată ce acesta este îndeplinit, driverul web Selenium va fi gata să preia alte comenzi. De obicei, timpul de așteptare explicit este variabil. Depinde de cât de repede sunt îndeplinite condițiile. În cel mai rău caz, așteptarea explicită va aștepta atâta timp cât așteptarea implicită.





În acest articol, vă voi arăta cum să așteptați (implicit și explicit) ca o pagină să se încarce cu Selenium. Deci sa începem.

Condiții preliminare:

Pentru a încerca comenzile și exemplele acestui articol, trebuie să aveți,



1) O distribuție Linux (de preferință Ubuntu) instalată pe computer.
2) Python 3 instalat pe computer.
3) PIP 3 instalat pe computer.
4) Python virtualenv pachet instalat pe computer.
5) Browsere web Mozilla Firefox sau Google Chrome instalate pe computer.
6) Trebuie să știți cum să instalați driverul Firefox Gecko sau Chrome Web Driver.

Pentru îndeplinirea cerințelor 4, 5 și 6, citiți articolul meu Introducere în Seleniu cu Python 3 la Linuxhint.com.

Puteți găsi multe articole despre celelalte subiecte de pe LinuxHint.com . Asigurați-vă că le verificați dacă aveți nevoie de asistență.

Configurarea unui director de proiect:

Pentru a menține totul organizat, creați un nou director de proiect seleniu-așteptați / după cum urmează:

$mkdir -pvseleniu-așteptați/șoferii

Navigați la seleniu-așteptați / directorul proiectului după cum urmează:

$CDseleniu-așteptați/

Creați un mediu virtual Python în directorul proiectului după cum urmează:

$virtualenv .venv

Activați mediul virtual după cum urmează:

$sursă.venv/a.m/Activati

Instalați Selenium folosind PIP3 după cum urmează:

$ pip3 instalează seleniu

Descărcați și instalați toate driverele web necesare în drivere / directorul proiectului. Am explicat procesul de descărcare și instalare a driverelor web în articolul meu Introducere în Seleniu cu Python 3 . Dacă aveți nevoie de asistență, căutați pe LinuxHint.com pentru articolul respectiv.

Voi folosi browserul web Google Chrome pentru demonstrația din acest articol. Deci, voi folosi râu cromat binar din drivere / director.

Pentru a experimenta cu așteptare implicită, creați un nou script Python ex01.py în directorul de proiect și introduceți următoarele linii de coduri în acel fișier.

dinseleniuimportwebdriver
dinseleniu.webdriver.uzual.chei importTaste
Opțiuni=webdriver.Opțiuni Chrome()
Opțiuni.fără cap = Adevărat
browser=webdriver.Crom(calea_executabilă=„./drivers/chromedriver”,Opțiuni=Opțiuni)
browser.implicit_așteptați(10)
browser.obține(„https://www.unixtimestamp.com/”)
timestamp-ul=browser.find_element_by_xpath(„// h3 [@] [1]”)
imprimare(„Marcaj de timp curent:% s”%(timestamp-ul.text.Despică('')[0]))
browser.închide()

După ce ați terminat, salvați ex01.py Script Python.

Linia 1 și 2 importă toate componentele de seleniu necesare.

Linia 4 creează un obiect Opțiuni Chrome.

Linia 5 activează modul fără cap pentru driverul web Chrome.

Linia 7 creează un obiect de browser Chrome folosind râu cromat binar din drivere / director.

Linia 8 este utilizată pentru a spune Selenium să aștepte implicit 10 secunde folosind implicit_wait () metoda browserului.

Linia 10 încarcă www.unixtimestamp.com în browser.

Linia 12 găsește elementul timestamp folosind selectorul XPath // h3 [@ class = ’text-danger’] [1] și o stochează în timestamp-ul variabil.

Am obținut selectorul XPath din Chrome Developer Tool. După cum puteți vedea, marca de timp este în prima h3 element cu numele clasei text-pericol . Sunt 2 h3 elemente cu clasa text-pericol .

Linia 13 tipărește doar marca temporală din elementul pe care l-am selectat folosind selectorul XPath și stocat în timestamp-ul variabil.

Linia 14 închide browserul.

După ce ați terminat, rulați scriptul Python ex01.py după cum urmează:

$ python3 ex01.py

După cum puteți vedea, marcajul temporal actual este extras de pe unixtimestamp.com și tipărit pe consolă.

Lucrul cu Așteptare explicită:

Pentru a experimenta cu așteptare explicită, creați un nou script Python ex02.py în directorul de proiect și introduceți următoarele linii de coduri în acel fișier.

dinseleniuimportwebdriver
dinseleniu.webdriver.uzual.chei importTaste
dinseleniu.webdriver.uzual.de importDe
dinseleniu.webdriver.a sustine.ceapă importWebDriverWait
dinseleniu.webdriver.a sustine importcondiții_așteptate
Opțiuni=webdriver.Opțiuni Chrome()
Opțiuni.fără cap = Adevărat
browser=webdriver.Crom(calea_executabilă=„./drivers/chromedriver”,Opțiuni=Opțiuni)
browser.obține(„https://www.unixtimestamp.com/”)
încerca:
timestamp-ul=WebDriverWait(browser, 10).pana cand(
condiții_așteptate.prezența_elementului_locat((De.XPATH, '
// h3 [@] [1] '
))
)
imprimare(„Marcaj de timp curent:% s”%(timestamp-ul.text.Despică('')[0]))
in cele din urma:
browser.închide()

După ce ați terminat, salvați ex02.py Script Python.

Linia 1-5 importă toate componentele necesare din biblioteca Selenium.

Linia 7 creează un obiect Opțiuni Chrome.

Linia 8 activează modul fără cap pentru driverul web Chrome.

Linia 10 creează un obiect browser Chrome folosind râu cromat binar din drivere / director.

Linia 12 încarcă www.unixtimestamp.com în browser.

Așteptarea explicită este implementată în blocul try-finalmente (de la linia 14-20)

Linia 15-17 utilizează creează WebDriverWait () obiect. Primul argument al WebDriverWait () este obiectul browserului, iar al doilea argument este timpul maxim permis (scenariul cel mai rău) pentru îndeplinirea condiției, care este de 10 secunde în acest caz.

În pana cand() bloc, expected_conditions.presence_of_element_located () metoda este utilizată pentru a vă asigura că elementul este prezent înainte de a încerca să selectați elementul. Aici, De.XPATH este folosit pentru a spune prezența_elementului_locat () metoda prin care am folosit un selector XPath pentru a selecta elementul. Selectorul XPath este // h3 [@ class = ’text-danger’] [1] .

Odată ce elementul este găsit, acesta este stocat în timestamp-ul variabil.

Linia 18 tipărește doar marca de timp din elementul selectat.

În cele din urmă, linia 19-20 închide browserul.

După ce ați terminat, rulați ex02.py Script Python după cum urmează:

$ python3 ex02.py

După cum puteți vedea, marcajul de timp actual de la unixtimestamp.com este imprimat pe consolă.

Selectarea elementelor în așteptări explicite:

În secțiunea anterioară, am folosit De.XPATH pentru selectarea elementului folosind selectorul XPath. De asemenea, puteți selecta elementele folosind ID-ul, numele etichetei, numele clasei CSS, selectorul CSS etc.

Metodele de selecție acceptate sunt prezentate mai jos:

De.XPATH - Selectează elementul / elementele folosind selectorul XPath.

De către.CLASS_NAME - Selectează elementul / elementele folosind numele clasei CSS.

De.CSS_SELECTOR - Selectează elementul / elementele folosind selectorul CSS.

De.ID - Selectează elementul după ID

Dupa nume - Selectează elementul / elementele după nume.

De.TAG_NAME - Selectează elementul / elementele după numele etichetei HTML.

De.LINK_TEXT - Selectează elementul / elementele prin textul linkului la (ancoră) etichetă HTML.

De.PARTIAL_LINK_TEXT - Selectează elementul / elementele prin textul linkului parțial al la (ancoră) etichetă HTML.

Pentru mai multe informații despre acestea, vizitați Pagina de documentare API Python Selenium .

Condiții așteptate în așteptări explicite:

În exemplul de așteptare explicit anterior, am folosit prezența_elementului_locat () Metodă de condiții_așteptate ca condiție explicită de așteptare pentru a mă asigura că elementul pe care îl căutam există înainte de a-l selecta.

Există altele condiții_așteptate puteți utiliza ca condiție explicită de așteptare. Unii dintre ei sunt:

title_is (titlu) - verifică dacă titlul paginii este titlu .

title_contains (partial_title) - verifică dacă titlul paginii conține o parte din titlu titlu_parțial .

vizibilitate_de (element) - verifică dacă element este vizibil pe pagina în care elementul are lățimea și înălțimea mai mari de 0.

vizibilitate_element_locat (localizator) -

prezența_elementului_locat (localizator) - Asigurați-vă că elementul situat (de localizator ) este prezent pe pagină. The localizator este un tuplu de (De, selector), așa cum am arătat în exemplul explicit de așteptare.

prezența_totă_elementul_locat () - Asigură-te că toate elementele potrivite cu localizator este prezent pe pagina. The localizator este un (De, selector) tuplu.

text_to_be_present_in_element (localizator, text) - Verifică dacă text este prezent în elementul situat de localizator . The localizator este un (De, selector) tuplu.

element_to_be_clickable (localizator) - Verifică dacă elementul situat de localizator este vizibil și se poate da clic. The localizator este un (De, selector) tuplu.

element_to_be_selected (localizator) - Verifică dacă elementul situat de localizator este selectat. The localizator este un (De, selector) tuplu.

alert_is_present () - așteptați-vă un dialog de alertă pe pagină.

Mai sunt multe condiții_așteptate disponibil pentru utilizare. Pentru mai multe informații despre acestea, vizitați Pagina de documentare API Python Selenium .

Concluzie:

În acest articol, am discutat despre așteptările implicite și explicite ale seleniului. De asemenea, v-am arătat cum să lucrați cu o așteptare implicită și explicită. Ar trebui să încercați întotdeauna să utilizați așteptarea explicită în proiectele dvs. Selenium, deoarece Selenium va încerca să reducă cât mai mult timpul de așteptare. În acest fel, nu va trebui să așteptați un anumit număr de secunde de fiecare dată când rulați proiectele Selenium. Așteptarea explicită ar trebui să economisească multe secunde.

Pentru mai multe informații despre așteptările de seleniu, vizitați Biblioteca oficială Selenium Python așteaptă pagina Documentație .