【问题标题】:Does WebDriverWait override ImplicitlyWait when both are used?两者都使用时,WebDriverWait 是否会覆盖 ImplicitlyWait?
【发布时间】:2013-07-23 16:00:40
【问题描述】:

我正在使用 python+selenium webdriver 进行自动化。我已经使用了 ImplicitlyWait 和 WebDriverWait。

问题:

  1. 在单个脚本中同时使用 ImplicitlyWait 和 WebDriverWait 是否是一种好习惯?

  2. 假设我的 ImplicitlyWait 值为 20,WebDriverWait 值为 10 秒。 WebDriverWait 在等待特定元素时会覆盖 20 吗?当 ImplicitlyWait 值小于 WebDriverWait 时会发生什么?

请提出建议。我试图在互联网上找到这个答案,但没有得到任何完整的证据或令人信服的答案。

【问题讨论】:

  • 你可能想看看 JimEvans 的想法here
  • 我看过那个答案,但它只是回答了我上面问题的第一部分。第二部分呢?
  • 该答案也回答了您问题的第二部分。答案(如另一篇文章所述)是“这是未定义的行为”。

标签: python selenium webdriver


【解决方案1】:

对于第一点,这可能是个人选择。我根本不使用implicit waiting,因为我喜欢控制 Selenium 等待的位置和不等待的位置。设置implicit wait 是在盲目地告诉Selenium,如果你没有找到我的元素,那就等一段时间,直到你能找到为止。不管是什么,不管是什么后果,不管是什么页面,你要么找到它,要么等20秒过去了。

如果这是您想要的方式,那很好,但对我来说,问题来自如果我的元素需要 30 秒才能出现在页面上,那么这本身就是一个问题。 Selenium 只是隐藏它,它可以掩盖问题。

但是,有时元素确实需要一段时间才能出现并“准备好”,这就是 explicit waiting 出现的时候。当您确实期待它时。

至于等待,最初会发生什么,当您的WebDriverWait 被点击时,它将运行并尝试查找元素。 Selenium 会看到您设置了implicit wait,因此它将不断尝试查找该元素长达 20 秒。

它将在幕后“免费”执行此操作。

一旦过期,您的 WebDriverWait 将收到响应,并且由于您的 implicit wait 超时大于您的 WebDriverWait 超时,它会因异常(超时异常)而崩溃。

如果WebDriverWait 值高于implicit wait 值(您在 cmets 中的示例),那么过程将是:

  1. 最初运行 WebDriverWait
  2. 调用.FindElement
  3. Selenium 在内部运行 10 秒
  4. 最初的 10 秒后,您的 WebDriverWait 会收到回复。
  5. 如果未找到该元素,则从第 1 步再次运行。
  6. 进入第 4 步后,如果仍未找到该元素,则会引发超时异常。

进一步解释(伪C#代码):

driver.Manage().Timeouts().SetImplicitWait(TimeSpan.FromSeconds(10));
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
wait.Until(w => 
{
    return w.FindElement(By.Id("something")).Displayed;
}

WebDriverWait 为 20 秒,implicit wait 为 10 秒。

它会击中:

return w.FindElement(By.Id("something")).Displayed;

第一次。 Selenium 在内部将运行 .FindElement 10 秒。在这 10 秒过去后,我的 WebDriverWait 将检查它的状况 (.Displayed)。如果不满足,那么WebDriverWait 将再次运行同一行代码。同样,Selenium 将像以前一样运行,并运行 10 秒。一旦返回,如果条件不满足,这意味着WebDriverWait等待的时间总共是20秒,然后会抛出错误。

【讨论】:

  • 所以你的意思是,如果我们同时存在等待并且当遇到 WebDriverWait 时,首先调用 ImplicitlyWait,等待 20 秒,如果未找到元素,则不再等待 10 秒WebDriver 等等。对吗?
  • 请注意,最后一个问题。如果 WebDriverWait 的值大于 ImplicitlyWait 的值,比如 WebDriverWait = 20 和 ImplicitlyWait = 10,你能告诉我这将如何执行吗?
  • 会和以前差不多。因为 WebDriverWait 将被调用,在每个 find element 调用中,它会等待 10 秒,然后再循环。由于这里的 WebDriverWait 较大,它会不断检查您给它的条件,每次检查时等待最多 10 秒。这有意义吗?
  • 抱歉,我无法理解。您是说 WebDriverWait 会等待 10 秒?但为什么。我的意思是 WebDriverWait 的值为 20,而 ImplicitlyWait 的值为 10。你能再清楚一点吗...谢谢!
  • 希望我的编辑让事情变得更清晰。值得一提的是 JimEvan 的回应——作为 Selenium 的核心开发人员,他认为这是未定义的行为——我的回答完全基于我坐下来使用调试器并尝试这个时看到的情况。
猜你喜欢
  • 2020-04-17
  • 1970-01-01
  • 2010-10-09
  • 2020-06-07
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多