【问题标题】:Do I always have to "wait" for page loads when using selenium on non-ajax pages?在非 ajax 页面上使用 selenium 时,我是否总是需要“等待”页面加载?
【发布时间】:2015-08-08 02:43:01
【问题描述】:

我正在使用 Cucumber、Selenium 和 Xunit 为旧版 ASP.Net 应用程序编写一些 BDD 测试。页面的设计方式,每次“点击”都会导致从服务器获取一个新页面。如果我必须对特定页面进行自动化测试,我是否应该在每次“点击”后有类似以下的一行?

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));
wait.Until(...); //Wait until something about the page is true

我不确定 Selenium 是否会隐式等待页面加载,而无需我一直明确说明这一点。处理这种情况的推荐模式是什么?

总是有“一些元素”的想法很麻烦,这样我就可以把它放在Until 方法中,这会导致脆弱的测试。 ASP.Net 页面充斥着大量动态控件和大量页面刷新,这使得测试代码非常难以阅读。

我提出的解决方案: 编写一个扩展方法来隐式地等待,并接受一个元素 ID 的参数来等待。但我只是将上述问题重构为更易于管理的地方。我仍然等待被明确执行。有没有办法消除它? selenium 是否有一些明显的默认值可以在不需要这种扩展方法的情况下处理这种情况,或者这真的是一种自然的方式吗?

【问题讨论】:

    标签: asp.net selenium selenium-webdriver bdd specflow


    【解决方案1】:

    如果您希望您的测试可靠并且只等待确切需要的时间间隔 - 那么是的,WebDriverWait 的显式等待是一个完美的解决方案。而且,它实际上是一个非常“自然” 的解决方案 - 想想作为用户的您如何定义加载的页面 - 通常是在您看到所需内容时,对吗?当您查看加载页面时,您会不断地重新评估页面的状态,检查是否出现了所需的内容。显式等待遵循相同的逻辑 - 默认情况下,它每 500 毫秒检查一次预期条件是否为真,但不超过您在实例化时配置的 X 秒 WebDriverWait.

    如果您需要经常使用wait.until() 调用并希望遵循DRY 原则,请考虑应用"Extracting Method" 或其他重构方法。

    您可以设置将应用于每个元素搜索的隐式等待,或引入硬编码的“人为”延迟,但这并不可靠并且会浪费时间 - 您最终会等待超过需要的时间并且偶尔测试失败。

    【讨论】:

    • 我明白你的意思。让我感到困惑的是,当我们已经有了wait.Until 时,还需要指定TimeSpan.FromSeconds。前者是干什么用的?如果“直到”从未发生,则超时?
    • @PhD 是的,这是一个上限,等待不超过 X 秒,如果不满足预期条件则抛出超时异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2017-03-27
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多