对于第一点,这可能是个人选择。我根本不使用implicit waiting,因为我喜欢控制 Selenium 等待的位置和不等待的位置。设置implicit wait 是在盲目地告诉Selenium,如果你没有找到我的元素,那就等一段时间,直到你能找到为止。不管是什么,不管是什么后果,不管是什么页面,你要么找到它,要么等20秒过去了。
如果这是您想要的方式,那很好,但对我来说,问题来自如果我的元素需要 30 秒才能出现在页面上,那么这本身就是一个问题。 Selenium 只是隐藏它,它可以掩盖问题。
但是,有时元素确实需要一段时间才能出现并“准备好”,这就是 explicit waiting 出现的时候。当您确实期待它时。
至于等待,最初会发生什么,当您的WebDriverWait 被点击时,它将运行并尝试查找元素。 Selenium 会看到您设置了implicit wait,因此它将不断尝试查找该元素长达 20 秒。
它将在幕后“免费”执行此操作。
一旦过期,您的 WebDriverWait 将收到响应,并且由于您的 implicit wait 超时大于您的 WebDriverWait 超时,它会因异常(超时异常)而崩溃。
如果WebDriverWait 值高于implicit wait 值(您在 cmets 中的示例),那么过程将是:
- 最初运行 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秒,然后会抛出错误。