Дождитесь загрузки страницы в Selenium - PullRequest
216 голосов
/ 03 мая 2011

Как заставить Selenium 2.0 ждать загрузки страницы?

Ответы [ 46 ]

9 голосов
/ 24 мая 2011

Если вы хотите дождаться загрузки определенного элемента, вы можете использовать метод isDisplayed() для 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;
    }
}

(Пример из 5-минутное руководство по началу работы)

7 голосов
/ 23 марта 2017

Явное ожидание или условное ожидание в этом ожидании, пока не будет дано это условие.

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

Это будет ожидать каждого веб-элемента в течение 60 секунд.

Использовать неявное ожидание ожидания каждого элемента на странице до указанного времени.

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

Это будет ждать каждого веб-элемента в течение 60 секунд.

5 голосов
/ 24 февраля 2016

Используйте неявное ожидание ожидания каждого элемента на странице до указанного времени.

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

это ожидание для каждого элемента на странице в течение 30 секунд.

Еще одно ожидание - явное ожидание или условное ожидание.подождите в этом ожидании, пока не получите заданное условие.

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

В id укажите статический идентификатор элемента, который неуверенно отображается на странице, как только страница загружается.

4 голосов
/ 25 декабря 2016

NodeJS Solution:

В Узлах вы можете получить его через обещания ...

Если вы напишите этот код, вы можете быть уверены, что страница полностью загружена, когда вы доберетесь до ...

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

Если вы напишите этот код, вы будете перемещаться, и селен будет ждать 3 секунды ...

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

Из документации Selenium:

this.get (url) → Thenable

Запланирует команду для перехода к указанному URL.

Возвращает обещание, которое будет выполнено после завершения загрузки документа .

Документация по селену (Nodejs)

4 голосов
/ 07 января 2014

Я удивлен, что предикаты не были первым выбором, поскольку вы обычно знаете, с какими элементами вы будете взаимодействовать в следующий раз на странице, которую вы ожидаете загрузить.Мой подход всегда заключался в создании предикатов / функций, таких как waitForElementByID(String id) и waitForElemetVisibleByClass(String className) и т. Д., А затем их использование и повторное использование везде, где они мне нужны, будь то загрузка страницы или изменение содержимого страницы, на котором я жду.1003 *

Например,

В моем тестовом классе:

driverWait.until(textIsPresent("expectedText");

В моем тестовом классе родитель:

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

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

Хотя это кажется большим,он выполняет повторную проверку для вас, и интервал между тем, как часто проверять, можно установить вместе с конечным временем ожидания до истечения времени ожидания.Кроме того, вы будете повторно использовать такие методы.

В этом примере родительский класс определил и инициировал WebDriver driver и WebDriverWait driverWait.

Надеюсь, это поможет.

3 голосов
/ 25 октября 2012

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<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
            // TODO Auto-generated method stub
            return new Function<WebDriver, WebElement>() {
                 @Override
                 public WebElement apply(WebDriver driver) {
                      return driver.findElement(locator);
                 }
            };
      }
 }

А тебе пользуйся :

_waiter = new SeleniumWaiter(_driver);

try {
   _waiter.waitForMe(By.xpath("//..."), 10);
} 
catch (Exception e) {
   // Error
}
3 голосов
/ 27 сентября 2013
/**
 * 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<WebDriver>() {

        @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;
        }
    });
}

Вы можете перейти от документа к элементу в случае, когда изменяется только часть документа.

Этот метод был вдохновлен ответом Sincebasic.

3 голосов
/ 05 января 2016

Лучший способ дождаться загрузки страницы при использовании привязок Java для WebDriver - это использовать шаблон проектирования Page Object с PageFactory.Это позволяет вам использовать AjaxElementLocatorFactory, то есть просто действует как глобальное ожидание всех ваших элементов.У него есть ограничения на такие элементы, как выпадающие списки или сложные переходы JavaScript, но он значительно сократит объем кода и ускорит время тестирования.Хороший пример можно найти в этом посте.Предполагается базовое понимание Core Java.

http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html

3 голосов
/ 02 февраля 2018

Вызов ниже функции

public static boolean isloadComplete(WebDriver driver)
{
    return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
            || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}
3 голосов
/ 12 января 2017

Вы можете использовать существующий ниже метод для установки времени для pageeLoadTimeout в следующем примере, если загрузка страницы занимает более 20 секунд, тогда она выдаст исключение перезагрузки страницы

 WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...