【问题标题】:Not able to make selenium webdriver wait for specified period无法让 selenium webdriver 等待指定的时间
【发布时间】:2016-11-08 22:04:29
【问题描述】:

我正在使用以下代码,以便 selenium 驱动程序在进行任何进一步处理之前等待 10 秒。但是页面加载太快了,似乎将时间从 10 秒增加到 20 秒并没有任何区别。我什至将 TimeUnit.SECONDS 更改为 TimeUnit.MINUTES 但没有区别。

我错过了什么?

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

CheckoutTest.java

@Test
public void testCheckoutScenario() throws InterruptedException {
    driver.get(WEBSTORE_BASE_URL); //hit the Home Page
    assertEquals("Home Page", driver.getTitle().trim());

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

    //navigate to category page
    driver.findElement(By.linkText("Gear")).click();
    assertEquals("Gear", driver.getTitle().trim());
    //navigate to subcategory page
    driver.findElement(By.linkText("Watches")).click();
    assertEquals("Watches - Gear", driver.getTitle().trim());

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

    //some more code
}

我正在使用 Selenium 3.0、Google Chrome Webdriver 和 Java 8 来运行这个测试。

【问题讨论】:

    标签: java google-chrome selenium selenium-webdriver integration-testing


    【解决方案1】:

    您对 Selenium 的隐式等待功能的理解是不正确的。
    您声明您正在使用隐式等待“以便硒驱动程序在进行任何进一步处理之前等待 10 秒”。

    隐式等待不会延迟处理,而是设置 selenium WebDriver 将等待 AS A MAXIMUM 等待任何实现等待的操作的时间量。 “click()”方法没有实现等待,所以当你执行你的代码时,它会执行 line:
    assertEquals("Gear", driver.getTitle().trim());
    但失败,因为它仍然看到页面“主页”,因为断言在页面移动之前执行。

    考虑通过以下方式使用显式等待重写您的代码:-
    WebElement myDynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

    其中 myDynamicElement 是您希望导航到(等待)的页面上的定位器。

    为了使您的代码更具可读性,您应该考虑创建一个类来使用 try-catch 块正确实现计时器。

    要了解更多信息,您应该考虑在The Selenium Handbook 注册免费的 Selenium 训练营。第 4 天涵盖等待。

    【讨论】:

      【解决方案2】:

      有一种方法可以让 Selenium 等到你的 DOM 被加载:

      WebDriver driver = new FirefoxDriver();
      driver.get("http://somedomain/url_that_delays_loading");
      WebElement myDynamicElement = (new WebDriverWait(driver, 10))
        .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
      

      您可以在文档here 中查看此示例。

      在您的情况下,您将等到新页面上的 DOM 加载。

      【讨论】:

        【解决方案3】:

        使用Thread.sleep() 代替implicitlyWait()。查看示例

        driver.get(WEBSTORE_BASE_URL);
        assertEquals("Home Page", driver.getTitle().trim());
        Thread.sleep(10000); //Thread default time unit is millisecond
        

        【讨论】:

          【解决方案4】:

          隐式等待提供最大的等待时间。但它会在等待结束之前运行下一行。所以尝试使用WebDriverWait 类正确等待直到指定条件。

          WebDriverWait wait = new WebDriverWait(driver, 20);
          wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By
                          .className("session")));
          

          如果您不想指定条件,请使用Thread.sleep();

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-08-13
            • 1970-01-01
            • 2014-04-04
            • 1970-01-01
            • 1970-01-01
            • 2013-12-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多