Как совместить неявные и явные таймауты в 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);
Другие вопросы по тегам