Как совместить неявные и явные таймауты в 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 секунд.
1 ответ
В документации явного и неявного ожидания четко указано, что:
Не смешивайте неявные и явные ожидания. Это может привести к непредсказуемому времени ожидания. Например, установка неявного ожидания 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);