WebDriverWait在使用两者时是否会覆盖ImplicitlyWait?

Pra*_*dey 5 python selenium webdriver

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

问题:

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

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

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

Arr*_*ran 5

首先,这可能是个人选择。我根本不使用它implicit waiting只是因为我喜欢控制Selenium在哪里等待和不在哪里等待。设置implicit wait会盲目地告诉Selenium,如果找不到我的元素,请等待一段时间直到可以。不管是什么,无论结果如何,无论是哪一页,都需要等到找到它或20秒过去。

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

但是,有时该元素确实需要一段时间才能显示出来并处于“准备就绪”状态,explicit waiting这才传入的时间。

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

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

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

如果该WebDriverWait值大于该implicit wait值(您在注释中的示例),则该过程将是:

  1. 最初运行WebDriverWait
  2. 打了.FindElement电话
  3. 硒在内部运行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;
}
Run Code Online (Sandbox Code Playgroud)

我们有WebDriverWait20秒和implicit wait10秒的时间。

它将命中:

return w.FindElement(By.Id("something")).Displayed;
Run Code Online (Sandbox Code Playgroud)

首次。内部硒将运行.FindElement10秒钟。经过10秒钟后,我WebDriverWait将检查其状况(.Displayed)。如果不满足,它将WebDriverWait再次运行同一行代码。再次,Selenium将像以前一样运行,并运行10秒钟。从那里回来后,如果不满足条件,则意味着WebDriverWait等待时间总计为20秒,然后将引发错误。