Убил уже кучу времени на тесты. То ли у меня проблема с пониманием асинхронности, то ли одно из двух.
Подскажите пожалуйста рабочий паттерн на 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, когда загрузка заканчивается.