Служба перехоплення
wdio-intercept-service це сторонній пакет, для отримання додаткової інформації, будь ласка, відвідайте GitHub | npm
🕸 Перехоплюйте та перевіряйте HTTP ajax-запити в webdriver.io
Це плагін для webdriver.io. Якщо ви ще не знайомі з ним, перевірте його, він досить крутий.
Хоча selenium і webdriver використовуються для e2e і особливо для UI-тестування, ви можете захотіти оцінити HTTP-запити, зроблені вашим клієнтським кодом (наприклад, коли у вас немає безпосереднього відгуку UI, як у метриках або відстеженні викликів). З wdio-intercept-service ви можете перехоплювати ajax HTTP-виклики, ініційовані деякою дією користувача (наприклад, натисканням кнопки тощо) і робити твердження про запит і відповідні відповіді пізніше.
Але є одне застереження: ви не можете перехоплювати HTTP-виклики, які ініціюються при завантаженні сторінки (як у більшості SPA), оскільки це вимагає деяких налаштувань, які можуть бути виконані тільки після завантаження сторінки (через обмеження в selenium). Це означає, що ви можете просто захоплювати запити, які були ініційовані всередині тесту. Якщо вас це влаштовує, цей плагін може бути для вас, тому читайте далі.
Передумови
- webdriver.io v5.x або новіший.
Увага! Якщо ви все ще використовуєте webdriver.io v4, будь ласка, використовуйте гілку v2.x цього плагіна!
Встановлення
npm install wdio-intercept-service -D
Використання
Використання з WebDriver CLI
Це повинно бути так само просто, як додавання wdio-intercept-service до вашого wdio.conf.js:
exports.config = {
// ...
services: ['intercept']
// ...
};
і все готово.
Використання з WebDriver Standalone
При використанні WebdriverIO Standalone, функції before та beforeTest / beforeScenario потрібно викликати вручну.
import { remote } from 'webdriverio';
import WebdriverAjax from 'wdio-intercept-service'
const WDIO_OPTIONS = {
port: 9515,
path: '/',
capabilities: {
browserName: 'chrome'
},
}
let browser;
const interceptServiceLauncher = WebdriverAjax();
beforeAll(async () => {
browser = await remote(WDIO_OPTIONS)
interceptServiceLauncher.before(null, null, browser)
})
beforeEach(async () => {
interceptServiceLauncher.beforeTest()
})
afterAll(async () => {
await client.deleteSession()
});
describe('', async () => {
... // See example usage
});
Після ініціалізації, деякі пов'язані функції додаються до ланцюга команд вашого браузера (див. API).
Швидкий старт
Приклад використання:
browser.url('http://foo.bar');
browser.setupInterceptor(); // capture ajax calls
browser.expectRequest('GET', '/api/foo', 200); // expect GET request to /api/foo with 200 statusCode
browser.expectRequest('POST', '/api/foo', 400); // expect POST request to /api/foo with 400 statusCode
browser.expectRequest('GET', /\/api\/foo/, 200); // can validate a URL with regex, too
browser.click('#button'); // button that initiates ajax request
browser.pause(1000); // maybe wait a bit until request is finished
browser.assertRequests(); // validate the requests
Отримати деталі про запити:
browser.url('http://foo.bar')
browser.setupInterceptor();
browser.click('#button')
browser.pause(1000);
var request = browser.getRequest(0);
assert.equal(request.method, 'GET');
assert.equal(request.response.headers['content-length'], '42');
Підтримувані браузери
Повинно працювати з досить новими версіями всіх браузерів. Будь ласка, повідомте про проблему, якщо щось не працює з вашим браузером.
API
Зверніться до файлу декларації TypeScript для повного синтаксису користувацьких команд, доданих до об'єкта браузера WebdriverIO. Загалом, будь-який метод, який приймає об'єкт "options" як параметр, може бути викликаний без цього параметра для отримання поведінки за замовчуванням. Ці "необов'язкові" об'єкти options позначені ?: = {} і їхні значення за замовчуванням описані для кожного методу.
Опис опцій
Ця бібліотека пропонує невелику кількість конфігурацій при виклику команд. Тут описані параметри конфігурації, які використовуються багатьма методами (дивіться визначення кожного методу, щоб визначити конкретну підтримку).
orderBy('START' | 'END'): Ця опція контролює порядок запитів, перехоплених перехоплювачем, коли вони повертаються до вашого тес ту. Для зворотної сумісності з існуючими версіями цієї бібліотеки, порядок за замовчуванням -'END', що відповідає моменту завершення запиту. Якщо ви встановите опціюorderByна'START', тоді запити будуть впорядковані відповідно до часу їх початку.includePending(boolean): Ця опція контролює, чи будуть повертатися ще не завершені запити. Для зворотної сумісності з існуючими версіями цієї бібліотеки, значення за замовчуваннямfalse, і будуть повертатися тільки завершені запити.
browser.setupInterceptor()
Перехоплює ajax-виклики в браузері. Ви завжди повинні викликати функцію налаштування, щоб пізніше оцінити запити.
browser.disableInterceptor()
Запобігає подальшому перехопленню ajax-викликів у браузері. Вся інформація про перехоплені запити видаля ється. Більшість користувачів не потребують відключення перехоплювача, але якщо тест працює особливо довго або перевищує ємність сесійного сховища, то відключення перехоплювача може бути корисним.
browser.excludeUrls(urlRegexes: (string | RegExp)[])
Виключає запити з певних URL-адрес з записування. Він приймає масив рядків або регулярних виразів. Перед записом у сховище, перевіряє URL запиту на кожен рядок або регулярний вираз. Якщо він відповідає, запит не записується в сховище. Як і disableInterceptor, це може бути корисно якщо виникають проблеми з перевищенням ємності сесійного сховища.
browser.expectRequest(method: string, url: string, statusCode: number)
Створює очікування щодо ajax-запитів, які будуть ініційовані під час тесту. Може (і повинно) бути ланцюговим. Порядок очікувань повинен відповідати порядку запитів, що виконуються.
method(String): HTTP-метод, який очікується. Може бути будь-яким, щоxhr.open()приймає як перший аргумент.url(String|RegExp): точний URL, який викликається в запиті, як рядок або RegExp для збігуstatusCode(Number): очікуваний код статусу відповіді
browser.getExpectations()
Допоміжний метод. Повертає всі очікування, які ви створили до цього моменту
browser.resetExpectations()
Допоміжний метод. Скидає всі очікування, які ви створили до цього моменту