Selenium WebDriver JS - явное ожидание
Я использую selenium-webdriverjs. Я хочу дождаться отображения определенного элемента, для которого я создал явное ожидание, как показано ниже, и он работает просто отлично,
var displayed = false;
driver.wait(function(){
driver.findElement(locator).isDisplayed().then(function(value){
displayed = value;
});
return displayed;
}, timeout);
Это лучшее, что я могу сделать, или есть лучший способ сделать это? Причина, по которой я спрашиваю, состоит в том, что при первом вызове обратного вызова (в моем случае) он всегда возвращает false. Только после выполнения обещания isDisplayed значение отображаемого изменения изменится.
2 ответа
Ваш код смешивает синхронный возврат с асинхронными обратными вызовами, следующий код должен делать правильно:
return driver.wait(function() {
return driver.findElement(locator).isDisplayed();
}, timeout);
Внутренняя функция вернет обещание, что driver.wait
будет ожидать и примет его значение (true/false) в качестве условия ожидания.
Чтобы избежать путаницы, связанной с асинхронными вариантами webdriver и js, вы можете попробовать синхронизировать webdriver: https://npmjs.org/package/webdriver-sync
По моему опыту, асинхронные версии API веб-драйвера становятся трудными для чтения после слишком большого количества вложенных обратных вызовов.
Это, конечно, предполагает, что у вас нет требований оставаться асинхронными.
Отказ от ответственности: я являюсь создателем этого программного обеспечения (webdriver-sync)