如何在 Selenium 中结合隐式和显式超时?

How to combine implicit and explicit timeouts in Selenium?

我正在使用带有隐式超时的 Selenium ChromeDriver:

_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);

在我的一个测试中,我想用一个明确的超时来覆盖它。在阅读 属性 之前,我明确地等待找到元素:

WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(120));
wait.Until(d => d.FindElement(By.CssSelector("div.example")));

我预计这将花费 120 秒来尝试找到该元素,但它仅在 5 秒后超时。

根据 Explicit and Implicit Waits 的文档,明确提到:

Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times. For example setting an implicit wait of 10 seconds and an explicit wait of 15 seconds, could cause a timeout to occur after 20 seconds.

仍然,如果您将 隐式超时 定义为:

_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);

在为要找到的元素引入显式等待之前,您需要删除隐式超时,如下所示:

_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(120));
wait.Until(d => d.FindElement(By.CssSelector("div.example")));

完成显式等待后,您可以重新配置回隐式超时,如下所示:

_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(0);
WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(120));
wait.Until(d => d.FindElement(By.CssSelector("div.example")));
//perform your action with the element
_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);