От Sync к Async
В связи с изменениями в V8 команда WebdriverIO объявила о прекращении поддержки синхронного выполнения команд к апрелю 2023 года. Команда усердно работала, чтобы сделать переход как можно более простым. В этом руководстве мы объясним, как вы можете постепенно перенести свой набор тестов с синхронного выполнения на асинхронное. В качестве примера проекта мы используем Cucumber Boilerplate, но подход одинаков для всех других проектов.
Промисы в JavaScript
Причина, по которой синхронное выполнение было популярно в WebdriverIO, заключается в том, что оно устраняет сложность работы с промисами. Особенно если вы пришли из других языков, где этот концепт не существует таким образом, это может быть запутанным вначале. Однако промисы - это очень мощный инструмент для работы с асинхронным кодом, и сегодняшний JavaScript делает эту работу действительно простой. Если вы никогда не работали с промисами, мы рекомендуем ознакомиться с справочным руководством MDN, так как объяснение этого концепта выходит за рамки данного руководства.
Переход на асинхронное выполнение
Тестовый фреймворк WebdriverIO может обрабатывать асинхронное и синхронное выполнение в рамках одного набора тестов. Это означает, что вы можете постепенно мигрировать свои тесты и PageObjects шаг за шагом в своем темпе. Например, Cucumber Boilerplate имеет определенный большой набор определений шагов, которые вы можете скопировать в свой проект. Мы можем постепенно мигрировать одно определение шага или один файл за раз.
WebdriverIO предлагает codemod, который позволяет преобразовать ваш синхронный код в асинхронный почти полностью автоматически. Сначала запустите codemod, как описано в документации, и используйте это руководство для ручной миграции при необходимости.
Во многих случаях всё, что нужно сделать, это сделать функцию, в которой вы вызываете команды WebdriverIO, async и добавить await перед каждой командой. Глядя на первый файл clearInputField.ts для преобразования в проекте-шаблоне, мы трансформируем его из:
export default (selector: Selector) => {
$(selector).clearValue();
};
в:
export default async (selector: Selector) => {
await $(selector).clearValue();
};
Вот и всё. Вы можете увидеть полный коммит со всеми примерами переписывания здесь:
Коммиты:
- transform all step definitions [af6625f]
Этот переход не зависит от того, используете ли вы TypeScript или нет. Если вы используете TypeScript, просто убедитесь, что в итоге вы измените свойство types в вашем tsconfig.json с webdriverio/sync на @wdio/globals/types. Также убедитесь, что ваша цель компиляции установлена как минимум на ES2018.