Перейти до основного вмісту

Відлагодження

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

Для початку, надзвичайно корисно обмежити паралелізм, встановивши 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 швидший за оновлення з фронтенд-фреймворка / браузера. Це відбувається при використанні синхронних тверджень, оскільки 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