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

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

Ответы [ 46 ]

2 голосов
/ 26 января 2012

Вы можете явно подождать, пока элемент появится на веб-странице, прежде чем предпринимать какие-либо действия (например, element.click ())

driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
        @Override
        public WebElement apply(WebDriver d) {
        return d.findElement(By.id("myDynamicElement"));
}});

Это то, что я использовал для похожего сценария, и он отлично работает.

2 голосов
/ 26 сентября 2017

Вы можете использовать ожидание. в селене существует 2 типа ожидания

  • Неявное ожидание
  • Явное ожидание

- неявное ожидание

Это очень просто, смотрите синтаксис ниже:

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

- явное ожидание

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

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

Вы можете использовать другие свойства, такие как visblityOf(), visblityOfElement()

2 голосов
/ 19 мая 2018

Если кто-то использует селенид:

public static final Long SHORT_WAIT = 5000L; // 5 seconds
$("some_css_selector").waitUntil(Condition.appear, SHORT_WAIT);

Дополнительные условия можно найти здесь: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html

2 голосов
/ 07 июня 2018

В моем случае я использовал следующее, чтобы узнать статус загрузки страницы. В нашем приложении присутствуют gif-файлы, и я слушаю их следующим образом, чтобы исключить нежелательное время ожидания в сценарии.

public static void processing(){ 
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
}

Где xpath находит gif в HTML DOM. После этого Вы также можете реализовать свои методы действий. Нажмите.

public static void click(WebElement elementToBeClicked){
    WebDriverWait wait = new WebDriverWait(driver, 45);
    wait.until(ExpectedConditions.visibilityOf(element));
    wait.until(ExpectedConditions.elementToBeClickable(element)); 
    wait.ignoring(NoSuchElementException.class).ignoring(StaleElementReferenceException.class); elementToBeClicked.click(); 
 }
2 голосов
/ 22 апреля 2015

Мой простой способ:

long timeOut = 5000;
    long end = System.currentTimeMillis() + timeOut;

        while (System.currentTimeMillis() < end) {

            if (String.valueOf(
                    ((JavascriptExecutor) driver)
                            .executeScript("return document.readyState"))
                    .equals("complete")) {
                break;
            }
        }
1 голос
/ 23 ноября 2016

Лучший способ, который я видел, - это использовать stalenessOf ExpectedCondition, чтобы дождаться устаревания старой страницы.

Пример:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement oldHtml = driver.findElement(By.tagName("html"));
wait.until(ExpectedConditions.stalenessOf(oldHtml));

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

1 голос
/ 27 марта 2019

Вот Java 8 версия самого популярного на данный момент ответа :

WebDriverWait wait = new WebDriverWait(myDriver, 15);
wait.until(webDriver -> ((JavascriptExecutor) myDriver).executeScript("return document.readyState").toString().equals("complete"));

Где myDriver - это объект WebDriver (объявленный ранее).

Примечание : помните, что этот метод (document.readyState) проверяет только DOM.

1 голос
/ 07 ноября 2016

Вы можете использовать этот фрагмент кода для загрузки страницы:

    IWait wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver,TimeSpan.FromSeconds(30.00));
    wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

Или вы можете использовать официант для любого элемента, который будет загружен и станет видимым / кликабельным на этой странице, скорее всего, этозагружаться в конце загрузки, как:

    Wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpathOfElement));
    var element = GlobalDriver.FindElement(By.XPath(xpathOfElement));
    var isSucceededed = element != null;
0 голосов
/ 23 ноября 2014

Как заставить Selenium ждать загрузки страницы после клика обеспечивает следующий интересный подход:

  1. Сохраните ссылку на WebElement со старой страницы.
  2. Нажмите на ссылку.
  3. Продолжайте вызывать операции на WebElement, пока не будет выброшено StaleElementReferenceException.

Пример кода:

WebElement link = ...;
link.click();
new WebDriverWait(webDriver, timeout).until((org.openqa.selenium.WebDriver input) ->
{
    try
    {
        link.isDisplayed();
        return false;
    }
    catch (StaleElementReferenceException unused)
    {
        return true;
    }
});
0 голосов
/ 15 августа 2017

Я использую node + selenium-webdriver (сейчас это версия 3.5.0).что я делаю для этого:

var webdriver = require('selenium-webdriver'),
    driver = new webdriver.Builder().forBrowser('chrome').build();
;
driver.wait(driver.executeScript("return document.readyState").then(state => {
  return state === 'complete';
}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...