В синхронном режиме Webdriver.io возникают проблемы с Promise - PullRequest
0 голосов
/ 08 мая 2019

Я пишу тесты на CoffeeScript, используя инфраструктуру Webdriver.io (Wdio testrunner) с включенным режимом синхронизации.Согласно документации, команды Webdriver.io должны выполняться в синхронном режиме.Однако в процессе использования Promise возникает неожиданная проблема.

Мы рассматриваем простейший тест, который находит элемент на странице по селектору и отображает текст найденного элемента на консоли.

Пример 1 - код без обещания

browser.url('... URL ...')
a = browser.$('... selector ...').getText()
console.log(a)

В этом примере команды Webdriver.io работают правильно.

Пример 2 - код находится в конструктореPromise

p = new Promise((resolve, reject) -> 
    browser.url('... URL ...')
    a = browser.$('... selector ...').getText()
    console.log(a)
    resolve()
)
return p

Если команды содержатся в конструкторе Promise, то они также правильно выполняются.

Пример 3 - код находится в блоке .then после возврата Promise

p = new Promise((resolve, reject) -> 
    resolve()
).then(() ->
    browser.url('... URL ...')
    a = $('... selector ...').getText()
    console.log(a)
)
return p

На дисплее отображается следующее сообщение об ошибке: «$ (...). GetText не является функцией» (пример 3).По-видимому, команды Webdriver.io начинают работать асинхронно.Хотя я могу использовать ключевое слово await для обработки этих Обещаний, но я хочу выполнить код одинаково (синхронно) независимо от местоположения кода (в Обещании или вне его).

Также переключение наАсинхронный режим возникает при использовании команды Await.

Пример 4 (код примера 1 с использованием ключевого слова await)

await console.log('123')
browser.url('... URL ...')
a = browser.$('... selector ...').getText()
console.log(a)

В этом случае для корректной работы программы необходимо будет повторитьвесь код с учетом асинхронной обработки.

В качестве решения я могу написать все тесты асинхронно, но код станет более сложным.Могу ли я работать с командами Webdriver.io синхронно даже при использовании Promise?

1 Ответ

0 голосов
/ 08 мая 2019

Если вы хотите использовать Promise в тестовом скрипте wdio, который находится в режиме синхронизации, тогда вам нужно использовать browser.call() wdio.Подробнее о call: v5 и v4 .

Здесь вы можете найти пример кода и более подробную информацию о том, как используется вызов: Какиспользовать сторонний метод, который принимает обратный вызов в webdriverio

Спасибо, Навин

...