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)

Другие вопросы по тегам