【问题标题】:Webdriver Assertions fail after swicthing to Java 8切换到 Java 8 后 Webdriver 断言失败
【发布时间】:2015-10-01 14:51:16
【问题描述】:

在切换到 Java 8 之后,许多 webdriver 断言在它试图在元素呈现之前断言某些东西时失败。看起来渲染速度和 Java 测试不同步。项目中使用的 Webdriver 是 Selenium-chrome-driver-2.43.1。我还没有为其他浏览器尝试过这个。无论如何我可以在不放置太多“等待元素”的情况下完成这项工作吗?

【问题讨论】:

    标签: java selenium


    【解决方案1】:

    您可以使用隐式或显式等待。

    隐式影响所有请求,如果应用程序通常很慢​​,则更容易,因此您希望增加对所有请求的等待。但是设置太高可能会导致测试在您不想等待的情况下等待很长时间:

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

    显式等待为您提供更大的灵活性,但需要更多的工作。例如,假设您希望大部分操作在 10 秒内完成,因此您将上面的隐式等待设置为 10 秒。但是假设您知道以下操作可能会因隐式等待而失败,因为此特定元素平均需要 15 秒才能显示出来:

     WebElement element = driver.findElement(By.name("q"));
    

    所以你可以把它改成:

     WebElement element = (new WebDriverWait(driver, 20))
             .until(newExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver d) {
                    return driver.findElement(By.name("q"));
            }
        });
    

    【讨论】:

    • 通过将隐式等待时间从 5 秒增加到 10 秒,运行所有测试的时间增加了一倍,但失败仍然相同。我也尝试在每次操作后添加等待,例如点击,提交。这暂时有效,但不是一个简洁的解决方案。我还尝试升级到最新的 selenium webdriver - 27.1,并更新了 chrome,但无助于通过测试。
    • @Avatar:“还尝试在每个操作后添加等待”是指硒等待(例如 WebDriverWait 或 FluentWait)吗?如果是,不幸的是,我认为这是正确的解决方案。使用 selenium 的多年经验告诉我,如果您希望测试可靠,则必须使用此类等待来搜索元素,尤其是在您拥有动态 Web 应用程序的情况下。至于优雅,当然在实践中我不建议您每次进行搜索或聚焦时都放置那段 WebDriverWait 代码。通常,您可以为您的应用程序隔离大约 5-10 个等待模式,因此将它们包装在可重用的函数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多