Așteptați pentru pagina de încărcare în Seleniu

Cum faci Seleniu 2.0 așteptați să se încarce pagina?

Comentarii la întrebare (1)

Puteți verifica, de asemenea, pageloaded folosind următorul cod

IWait wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

 wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
Comentarii (12)

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#:

WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));
Comentarii (7)

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.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

sursa: implicit-așteaptă

Comentarii (4)

Î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 asteptare findelement până când este găsit sau ori (timpul poate fi setat).

Comentarii (6)

Ruby aplicare:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}
Comentarii (3)

S-ar putea elimina din Sistem.afară de pe linie. Acesta este adăugat pentru scopuri de depanare.

WebDriver driver_;

public void waitForPageLoad() {

    Wait wait = new WebDriverWait(driver_, 30);
    wait.until(new Function() {
        public Boolean apply(WebDriver driver) {
            System.out.println("Current Window State       : "
                + String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")));
            return String
                .valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
                .equals("complete");
        }
    });
}
Comentarii (1)

Toate aceste soluții sunt OK pentru cazuri specifice, dar ei suferă de cel puțin unul dintre o pereche de posibile probleme:

  1. 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)

  2. 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):

def wait_for(condition_function):
    start_time = time.time()
    while time.time() < start_time + 3:
        if condition_function():
            return True
        else:
            time.sleep(0.1)
    raise Exception('Timeout waiting for {}'.format(condition_function.__name__))

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:

old_page = browser.find_element_by_tag_name('html')

browser.find_element_by_link_text('my link').click()

def page_has_loaded():
    new_page = browser.find_element_by_tag_name('html')
    return new_page.id != old_page.id

wait_for(page_has_loaded)

Pentru mai multe Pythonic, reutilizabile, generic helper, puteți face un context manager:

from contextlib import contextmanager

@contextmanager
def wait_for_page_load(browser):
    old_page = browser.find_element_by_tag_name('html')

    yield

    def page_has_loaded():
        new_page = browser.find_element_by_tag_name('html')
        return new_page.id != old_page.id

    wait_for(page_has_loaded)

Și apoi puteți să-l utilizați pe destul de mult orice seleniu interacțiune:

with wait_for_page_load(browser):
    browser.find_element_by_link_text('my link').click()

Cred că's antiglonț! Tu ce crezi?

Mai multe informații într-un post pe blog despre asta here

Comentarii (1)

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țiuni

Puteți utiliza `ExpectedConditions clasa a determina dacă un element este vizibil:

WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));

Vezi ExpectedConditions clasa Javadoc pentru lista tuturor condițiilor aveți posibilitatea de a verifica.

Comentarii (0)

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.

Comentarii (6)

Imran's a răspunde rehashed pentru Java 7:

    WebDriverWait wait = new WebDriverWait(driver, 30);

    wait.until(new ExpectedCondition() {
        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript(
                "return document.readyState"
            ).equals("complete");
        }
    });
Comentarii (0)

Dacă doriți să așteptați pentru un anumit element pentru a încărca, puteți utiliza isDisplayed() metoda pe un RenderedWebElement :

// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
    // Browsers which render content (such as Firefox and IE) return "RenderedWebElements"
    RenderedWebElement resultsDiv = (RenderedWebElement) driver.findElement(By.className("gac_m"));

    // If results have been returned, the results are displayed in a drop down.
    if (resultsDiv.isDisplayed()) {
      break;
    }
}

(Exemplu de la 5 Minute de Ghidul Noțiuni de bază)

Comentarii (2)

Î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.

WebDriverWait wait = new WebDriverWait(wb, 60);
wait.until(ExpectedConditions.elementToBeClickable(By.name("value")));

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.

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

Acest lucru vă va aștepta pentru fiecare element de web pentru 60 de secunde.

Comentarii (0)

Utilizați implicit așteptați, așteptați de fiecare element de pe pagină până moment dat.

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

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ă.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

În id-ul da static element de identitate care este timid afișa pe pagină, cât mai curând ca pagina se încarcă.

Comentarii (1)

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:

driverWait.until(textIsPresent("expectedText");

În testul meu de clasa părinte:

protected Predicate textIsPresent(String text){
    final String t = text;
    return new Predicate(){
        public boolean apply(WebDriver driver){
            return isTextPresent(t);
        }
    };
}

protected boolean isTextPresent(String text){
    return driver.getPageSource().contains(text);
}

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ă.

Comentarii (1)

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...

driver.get('www.sidanmor.com').then(()=> {
    // here the page is fully loaded!!!
    // do your stuff...
}).catch(console.log.bind(console));

Dacă ai scrie acest cod, vei naviga, seleniu și va aștepta 3 secunde...

driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...

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)

Comentarii (0)

Apelul de mai jos Funcția în script-ul dvs. , acesta va aștepta până când pagina este încărcată folosind javascript

public static boolean isloadComplete(WebDriver driver)
{
    return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
            || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}
Comentarii (1)
/**
 * Call this method before an event that will change the page.
 */
private void beforePageLoad() {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("document.mpPageReloaded='notYet';");
}

/**
 * Call this method after an event that will change the page.
 * 
 * @see #beforePageLoad
 * 
 *      Waits for the previous page to disappear.
 */
private void afterPageLoad() throws Exception {
    (new WebDriverWait(driver, 10)).until(new Predicate() {

        @Override
        public boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            Object obj = js.executeScript("return document.mpPageReloaded;");
            if (obj == null) {
                return true;
            }
            String str = (String) obj;
            if (!str.equals("notYet")) {
                return true;
            }
            return false;
        }
    });
}

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.

Comentarii (0)

SeleniumWaiter:

import com.google.common.base.Function;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SeleniumWaiter {

      private WebDriver driver;

      public SeleniumWaiter(WebDriver driver) {
           this.driver = driver;
      }

      public WebElement waitForMe(By locatorname, int timeout){
           WebDriverWait wait = new WebDriverWait(driver, timeout);
           return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
      }

      public static Function presenceOfElementLocated(final By locator) {
            // TODO Auto-generated method stub
            return new Function() {
                 @Override
                 public WebElement apply(WebDriver driver) {
                      return driver.findElement(locator);
                 }
            };
      }
 }

Și pentru tine folositi-l:

_waiter = new SeleniumWaiter(_driver);

try {
   _waiter.waitForMe(By.xpath("//..."), 10);
} 
catch (Exception e) {
   // Error
}
Comentarii (0)

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

Comentarii (0)

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

 WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)
Comentarii (0)