Я пишу тесты на 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?