Mai mult
Așteptați pentru pagina de încărcare în Seleniu
Cum faci Seleniu 2.0 așteptați să se încarce pagina?
226
47
Cum faci Seleniu 2.0 așteptați să se încarce pagina?
Puteți verifica, de asemenea, pageloaded folosind următorul cod
Clasa de utilizare WebDriverWait
De asemenea, a se vedea aici
Vă puteți aștepta pentru a arăta un element. ceva ca în C#:
Dacă setați implicit așteptați de la driver, apoi apel
findElement
metoda pe un element-ai aștepta să fie pe pagina încărcată, în WebDriver va sondaj de opinie pentru ca element până când se găsește un element sau ajunge la timp de valoare.sursa: implicit-așteaptă
În general, cu Seleniu 2.0 web driver ar trebui să se întoarcă numai de control pentru codul de asteptare, odată ce a stabilit că pagina s-a incarcat. Dacă nu, puteți apela
waitforelemement
, care ciclurile rundă de asteptarefindelement
până când este găsit sau ori (timpul poate fi setat).Ruby aplicare:
S-ar putea elimina din Sistem.afară de pe linie. Acesta este adăugat pentru scopuri de depanare.
Toate aceste soluții sunt OK pentru cazuri specifice, dar ei suferă de cel puțin unul dintre o pereche de posibile probleme:
Ele nu sunt suficient de generic, ei vor să știe, înainte de timp, că unele specifice, condiția va fi adevărată a paginii aveți de gând să (de exemplu, un element va fi afișat)
Acestea sunt deschise la o cursa de condiție în cazul în care utilizați un element care este prezent pe pagina vechi, precum și noua pagină.
Aici's incercarea mea de la un generic soluție care evită această problemă (în Python):
În primul rând, un generic "stai" funcția (folosiți un WebDriverWait dacă vă place, le-am găsit urât):
Apoi, soluția se bazează pe faptul că seleniul înregistrează o (interne), numărul de identificare, pentru toate elementele de pe o pagină, inclusiv la nivel de top ` element. Cand o pagina se reîmprospătează sau sarcini, acesta devine un nou element html cu un nou ID.
Deci, presupunând că vrei să faceți clic pe un link cu textul "link-ul meu" de exemplu:
Pentru mai multe Pythonic, reutilizabile, generic helper, puteți face un context manager:
Și apoi puteți să-l utilizați pe destul de mult orice seleniu interacțiune:
Cred că's antiglonț! Tu ce crezi?
Mai multe informații într-un post pe blog despre asta here
Puteți folosi, de asemenea, la clasa:
ExpectedConditions
în mod explicit să așteptați pentru un element pentru a afișa pe pagina de web înainte de a putea să ia orice măsuri suplimentare de acțiuniPuteți utiliza `ExpectedConditions clasa a determina dacă un element este vizibil:
Vezi ExpectedConditions clasa Javadoc pentru lista tuturor condițiilor aveți posibilitatea de a verifica.
Acest lucru pare a fi o limitare gravă a WebDriver. Evident, de așteptare pentru un element nu va implica pagina a fi încărcate, în special DOM poate fi pe deplin construi (onready de stat) prin care JS este încă de executare și CSS și imaginile sunt încă de încărcare.
Cred că cea mai simplă soluție este de a stabili un JS variabilă asupra evenimentului onload după ce totul este inițializat și verificare și așteptați pentru acest JS variabilă în Seleniu.
Imran's a răspunde rehashed pentru Java 7:
Dacă doriți să așteptați pentru un anumit element pentru a încărca, puteți utiliza
isDisplayed()
metoda pe unRenderedWebElement
:(Exemplu de la 5 Minute de Ghidul Noțiuni de bază)
În mod explicit, așteptați sau condiționată așteptați în acest așteptați până când a dat această condiție.
Acest lucru vă va aștepta pentru fiecare element de web pentru 60 de secunde.
Utilizați implicit așteptați, așteptați de fiecare element de pe pagină până la acel moment dat.
Acest lucru vă va aștepta pentru fiecare element de web pentru 60 de secunde.
Utilizați implicit așteptați, așteptați de fiecare element de pe pagină până moment dat.
acest așteptați pentru fiecare element de pe pagină pentru 30 sec.
Un alt așteptați este în mod Explicit așteptați sau condiționată așteptați în acest așteptați până când condiție dată.
În id-ul da static element de identitate care este timid afișa pe pagină, cât mai curând ca pagina se încarcă.
Am'm-a surprins că predicate n't prima alegere ca de obicei știu ce element(e) pe care va interacționa cu pagina pe care're de așteptare pentru a încărca. Abordarea mea a fost întotdeauna de a construi predicate/funcții, cum ar fi
waitForElementByID(String id) " și " waitForElemetVisibleByClass(String className)
, etc. și apoi utilizarea și reutilizarea acestor oriunde am nevoie de ele, fie pentru o încărcare a paginii sau conținutul paginii schimba I'm așteptare pe.De exemplu,
În testul meu de clasa:
În testul meu de clasa părinte:
Deși acest lucru pare ca o mulțime, este nevoie de grijă de a verifica în mod repetat pentru tine și intervalul de cât de des pentru a verifica poate fi stabilit împreună cu final timp de așteptare înainte de calendarul afară. De asemenea, va reutiliza astfel de metode.
În acest exemplu, clasa părinte definite și a inițiat
WebDriver driver " și " WebDriverWait driverWait
.Sper că acest lucru ajută.
NodeJS Soluție:
În Nodejs puteți să-l prin promisiuni...
Dacă ai scrie acest cod, puteți fi sigur că pagina este complet încărcată atunci când vei ajunge la...
Dacă ai scrie acest cod, vei naviga, seleniu și va aștepta 3 secunde...
De Seleniu documentație:
acest lucru.a lua( url ) → Thenable
Programele de comandă pentru a naviga la URL-ul dat.
Returnează o promisiune că va fi rezolvată atunci când documentul a a terminat de încărcare.
Seleniu Documentare (Nodejs)
Apelul de mai jos Funcția în script-ul dvs. , acesta va aștepta până când pagina este încărcată folosind javascript
Puteți schimba de la document la un element, în cazul în care numai o parte a unui document este de a fi schimbat.
Această tehnică a fost inspirat de răspuns de la sincebasic.
SeleniumWaiter:
Și pentru tine folositi-l:
Cel mai bun mod de a aștepta pentru pagină se încarcă atunci când se utilizează Java legături pentru WebDriver este de a utiliza Pagina de design de Obiect model cu PageFactory. Acest lucru vă permite de a utiliza
AjaxElementLocatorFactory
care să-l puneți pur și simplu acționează ca un globale așteptați pentru toate elementele. Are limitări privind elemente, cum ar fi cutii sau complexe javascript tranziții, dar se va reduce drastic cantitatea de cod necesar și de a accelera timpul de testare. Un bun exemplu poate fi găsit în acest blogpost. Înțelegere de bază de Bază Java este presupus.http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html
Puteți utiliza de mai jos existente metodă pentru a seta ora pentru pageeLoadTimeout în exemplu de mai jos dacă pagina este de a lua mai mult de 20 de secunde pentru a încărca , atunci se va arunca o excepție de reîncărcare pagina