对于第一点,这可能是个人选择。我根本不使用implicit waiting
,因为我喜欢控制 Selenium 等待的位置和不等待的位置。设置implicit wait
是一味地告诉Selenium,如果你没有找到我的元素,那就等一段时间,直到你能找到。不管它是什么,不管结果如何,不管是什么页面,你都等到找到它或者20秒过去了。
如果这是您想要的方式,那很好,但对我来说,问题来自如果我的元素需要 30 秒才能出现在页面上,那么这本身就是一个问题。Selenium 只是隐藏它,它可以覆盖问题。
但是,有时元素确实需要一段时间才能出现并“准备好”,这就是explicit waiting
进来的时候。当您确实期望它时。
至于等待,最初会发生什么,当你WebDriverWait
被击中时,它会运行并尝试找到元素。Selenium 会看到你有你的implicit wait
集合,所以它会不断尝试找到该元素长达 20 秒。
它将在幕后“免费”执行此操作。
一旦过期,您WebDriverWait
将收到响应,并且由于您的implicit wait
超时大于您的WebDriverWait
超时,它将因异常(超时异常)而倒下。
如果该WebDriverWait
值高于该implicit wait
值(您在评论中的示例),那么该过程将是:
- 最初运行 WebDriverWait
- 它打了
.FindElement
电话
- Selenium 在内部运行 10 秒
- 在最初的 10 秒后,您
WebDriverWait
会收到回复。
- 如果未找到该元素,则再次从步骤 1 运行。
- 一旦进入第 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 秒,然后将引发错误。