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

时间:2018-10-08 16:40:34

标签: c# selenium selenium-webdriver webdriverwait implicitwait

我正在使用具有隐式超时的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秒钟后就会超时。

1 个答案:

答案 0 :(得分:2)

根据Explicit and Implicit Waits的文档,其中明确指出:

  

请勿混用 隐式 显式 等待。这样做可能导致不可预测的等待时间。例如,将隐式等待设置为10秒,将显式等待设置为15秒,则可能导致20秒后发生超时。

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

_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);