kapitansen
@kapitansen
Веб-погромист

Как правильно работать с асинхронностью в selenium для javascript?

Убил уже кучу времени на тесты. То ли у меня проблема с пониманием асинхронности, то ли одно из двух.
Подскажите пожалуйста рабочий паттерн на js.

const isVisible = (element) => browser.wait(until.elementIsVisible(element), 20000);

// async function isVisible(element) {
//     await browser.wait(until.elementIsVisible(element), 20000);
//}

async function loadingProcess() {
    const loading = await browser.wait(until.elementLocated(By.xpath("//div[@id='loading']")), 20000);
    await browser.wait(until.elementIsNotVisible(loading), 20000);
}
await browser.get(myURL);

// тарам-парам-пам

const loginBtn = await browser.wait(until.elementLocated(By.id('login')), 20000).then(isVisible);
loginBtn.click();
await loadingProcess();

await browser.wait(until.elementLocated(By.linkText('Websites')), 20000).then(isVisible).then(btn => btn.click());
await browser.wait(until.elementLocated(By.xpath("//input[contains(@class, 'textbox')]/../../td[2]/a")), 20000).then(isVisible).then(btn => btn.click());
await loadingProcess();

await browser.wait(until.elementLocated(By.xpath('//a[text()=" Create directory"]')), 20000).then(isVisible).then(btn => btn.click());


Всё это худо-бедно работает, но не всегда. У меня сомнения в функциях loadingProcess и isVisible. Если isVisible переписать через async (закомментированный вариант), то драйвер вообще не ждёт. loadingProcess тоже отрабатывает как надо в 4 случаях из 5.
Возможно, есть какой-то более современный и короткий способ? Делать костыли с driver.sleep() уж точно не хочется.
div[@id='loading'] - див, который перекрывает всю видимую область браузера и становится display:none, когда загрузка заканчивается.
  • Вопрос задан
  • 337 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы