Перейти к основному содержанию

Отладка

Отладка значительно усложняется, когда несколько процессов запускают десятки тестов в нескольких браузерах.

Для начала, крайне полезно ограничить параллелизм, установив maxInstances в 1, и нацеливаться только на те спецификации и браузеры, которые нуждаются в отладке.

В wdio.conf:

export const config = {
// ...
maxInstances: 1,
specs: [
'**/myspec.spec.js'
],
capabilities: [{
browserName: 'firefox'
}],
// ...
}

Команда Debug​

Во многих случаях вы можете использовать browser.debug() для приостановки теста и проверки браузера.

Ваш интерфейс командной строки также переключится в режим REPL. Этот режим позволяет вам экспериментировать с командами и элементами на странице. В режиме REPL вы можете обращаться к объекту browser или функциям $ и $$, как в ваших тестах.

При использовании browser.debug() вам, вероятно, потребуется увеличить таймаут в тест-раннере, чтобы предотвратить завершение теста из-за превышения времени. Например:

В wdio.conf:

jasmineOpts: {
defaultTimeoutInterval: (24 * 60 * 60 * 1000)
}

Смотрите timeouts для получения дополнительной информации о том, как сделать это с использованием других фреймворков.

Чтобы продолжить тесты после отладки, в оболочке используйте сочетание клавиш ^C или команду .exit.

Динамическая конфигурация​

Обратите внимание, что wdio.conf.js может содержать JavaScript. Поскольку вы, вероятно, не хотите навсегда изменить значение таймаута на 1 день, часто бывает полезно изменять эти настройки из командной строки с помощью переменной среды.

Используя этот метод, вы можете динамически изменять конфигурацию:

const debug = process.env.DEBUG
const defaultCapabilities = ...
const defaultTimeoutInterval = ...
const defaultSpecs = ...

export const config = {
// ...
maxInstances: debug ? 1 : 100,
capabilities: debug ? [{ browserName: 'chrome' }] : defaultCapabilities,
execArgv: debug ? ['--inspect'] : [],
jasmineOpts: {
defaultTimeoutInterval: debug ? (24 * 60 * 60 * 1000) : defaultTimeoutInterval
}
// ...
}

Затем вы можете добавить префикс debug к команде wdio:

$ DEBUG=true npx wdio wdio.conf.js --spec ./tests/e2e/myspec.test.js

...и отлаживать свой файл спецификации с помощью DevTools!

Отладка с Visual Studio Code (VSCode)​

Если вы хотите отлаживать свои тесты с точками останова в последней версии VSCode, у вас есть два варианта для запуска отладчика, из которых вариант 1 является самым простым методом:

  1. автоматическое подключение отладчика
  2. подключение отладчика с использованием файла конфигурации

VSCode Toggle Auto Attach​

Вы можете автоматически подключить отладчик, выполнив следующие действия в VSCode:

  • Нажмите CMD + Shift + P (Linux и Macos) или CTRL + Shift + P (Windows)
  • Введите "attach" в поле ввода
  • Выберите "Debug: Toggle Auto Attach"
  • Выберите "Only With Flag"

Вот и всё! Теперь, когда вы запускаете свои тесты (не забудьте, что вам понадобится флаг --inspect, установленный в вашей конфигурации, как показано ранее), он автоматически запустит отладчик и остановится на первой точке останова, которую он достигнет.

Файл конфигурации VSCode​

Возможно запустить все или выбранные файлы спецификаций. Конфигурации отладки должны быть добавлены в .vscode/launch.json. Для отладки выбранной спецификации добавьте следующую конфигурацию:

{
"name": "run select spec",
"type": "node",
"request": "launch",
"args": ["wdio.conf.js", "--spec", "${file}"],
"cwd": "${workspaceFolder}",
"autoAttachChildProcesses": true,
"program": "${workspaceRoot}/node_modules/@wdio/cli/bin/wdio.js",
"console": "integratedTerminal",
"skipFiles": [
"${workspaceFolder}/node_modules/**/*.js",
"${workspaceFolder}/lib/**/*.js",
"<node_internals>/**/*.js"
]
},

Чтобы запустить все файлы спецификаций, удалите "--spec", "${file}" из "args"

Пример: .vscode/launch.json

Дополнительная информация: https://code.visualstudio.com/docs/nodejs/nodejs-debugging

Динамический Repl с Atom​

Если вы хакер Atom, вы можете попробовать wdio-repl от @kurtharriger, который представляет собой динамический repl, позволяющий выполнять отдельные строки кода в Atom. Посмотрите это видео на YouTube, чтобы увидеть демонстрацию.

Отладка с WebStorm / Intellij​

Вы можете создать конфигурацию отладки node.js следующим образом: Screenshot from 2021-05-29 17-33-33 Посмотрите это видео на YouTube для получения дополнительной информации о том, как создать конфигурацию.

Отладка нестабильных тестов​

Нестабильные тесты может быть действительно сложно отлаживать, поэтому вот несколько советов о том, как вы можете попытаться воспроизвести локально те нестабильные результаты, которые вы получили в своем CI.

Сеть​

Для отладки нестабильности, связанной с сетью, используйте команду throttleNetwork.

await browser.throttleNetwork('Regular3G')

Скорость рендеринга​

Для отладки нестабильности, связанной со скоростью устройства, используйте команду throttleCPU. Это заставит ваши страницы рендериться медленнее, что может быть вызвано многими факторами, например, запуском нескольких процессов в вашем CI, что может замедлять ваши тесты.

await browser.throttleCPU(4)

Скорость выполнения тестов​

Если ваши тесты, кажется, не затронуты, возможно, WebdriverIO быстрее, чем обновления от frontend-фреймворка / браузера. Это происходит при использовании синхронных утверждений, поскольку у WebdriverIO больше нет возможности повторить эти утверждения. Вот некоторые примеры кода, который может сломаться из-за этого:

expect(elementList.length).toEqual(7) // список может быть еще не заполнен на момент утверждения
expect(await elem.getText()).toEqual('this button was clicked 3 times') // текст может быть еще не обновлен на момент утверждения, что приведет к ошибке ("this button was clicked 2 times" не соответствует ожидаемому "this button was clicked 3 times")
expect(await elem.isDisplayed()).toBe(true) // может быть еще не отображен

Для решения этой проблемы следует использовать асинхронные утверждения. Приведенные выше примеры будут выглядеть так:

await expect(elementList).toBeElementsArrayOfSize(7)
await expect(elem).toHaveText('this button was clicked 3 times')
await expect(elem).toBeDisplayed()

Используя эти утверждения, WebdriverIO будет автоматически ждать, пока условие не совпадет. При утверждении текста это означает, что элемент должен существовать, и текст должен быть равен ожидаемому значению. Мы подробнее говорим об этом в нашем Руководстве по лучшим практикам.

Welcome! How can I help?

WebdriverIO AI Copilot