6

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

问题:

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

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

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

4

1 回答 1

5

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

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

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

至于等待,最初会发生什么,当你WebDriverWait被击中时,它会运行并尝试找到元素。Selenium 会看到你有你的implicit wait集合,所以它会不断尝试找到该元素长达 20 秒。

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

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

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

  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;
}

我们有WebDriverWait20 秒和implicit wait10 秒。

它会击中:

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

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

于 2013-07-24T09:20:59.387 回答