В автоматизированном тестировании часто возникает необходимость остановить выполнение теста или даже всей тестовой сессии при достижении определённого условия. WebdriverIO предоставляет несколько инструментов для реализации таких сценариев, позволяя управлять потоком тестов гибко и безопасно.
browser.pause() и условных операторовМетод browser.pause(ms) останавливает выполнение на
заданное количество миллисекунд. В сочетании с условными проверками это
позволяет приостанавливать тест в нужный момент для дополнительной
проверки состояния:
it('должен остановиться при определённом условии', async () => {
await browser.url('https://example.com');
const title = await browser.getTitle();
if (title !== 'Ожидаемый заголовок') {
console.log('Условие не выполнено, тест остановлен');
await browser.pause(5000); // пауза перед завершением
return; // прерывание выполнения теста
}
await $('#element').click();
});
Ключевой момент — использование return для выхода из
функции теста. Это простой способ остановить выполнение текущего
it блока, если условие не выполнено.
throwДля более строгого контроля можно использовать выброс исключения, что приведёт к неуспешному завершению теста. Это удобно для условий, когда продолжение теста не имеет смысла:
it('должен прекратить выполнение при ошибочном состоянии', async () => {
const isElementDisplayed = await $('#criticalElement').isDisplayed();
if (!isElementDisplayed) {
throw new Error('Критический элемент не найден, тест остановлен');
}
await $('#criticalElement').click();
});
В отличие от простого return, использование
throw сигнализирует системе тестирования о
фейле, что особенно полезно при интеграции с CI/CD.
browser.call() для асинхронных проверокИногда необходимо проверить условие с внешним API или базой данных.
WebdriverIO позволяет выполнять произвольные асинхронные операции через
browser.call:
it('останавливается при внешней проверке', async () => {
const shouldSkip = await browser.call(async () => {
const response = await fetch('https://api.example.com/check');
const data = await response.json();
return data.skipTest;
});
if (shouldSkip) {
console.log('Тест пропущен по внешнему условию');
return;
}
await $('#button').click();
});
browser.call делает возможным синхронное использование
асинхронного кода внутри теста, сохраняя читаемость и последовательность
выполнения.
process.exit()В редких случаях требуется остановить всю тестовую сессию, например,
при критической ошибке окружения. Для этого можно использовать Node.js
метод process.exit(code):
before(async () => {
const envReady = await checkEnvironment();
if (!envReady) {
console.error('Окружение не готово, прерывание всех тестов');
process.exit(1);
}
});
Такой подход следует применять осторожно, так как он прерывает весь запуск WebdriverIO, включая другие тестовые файлы.
skip и onlyWebdriverIO поддерживает функции Mocha/Jasmine для условного пропуска тестов:
it.skip('тест, который пропускается при условии', async () => {
const condition = true;
if (condition) return;
await $('#element').click();
});
it('тест с условным выполнением', async function () {
const condition = false;
if (!condition) this.skip(); // Mocha метод skip
await $('#element').click();
});
Использование this.skip() удобно для динамического
пропуска на этапе выполнения, сохраняя корректную статистику тестов.
expect из
@wdio/expectWebdriverIO предоставляет встроенные assertion методы, которые автоматически останавливают тест при несоответствии ожиданиям:
it('должен прекратить выполнение при неправильном тексте', async () => {
const text = await $('#message').getText();
await expect(text).toBe('Success'); // тест остановится при несоответствии
});
Ключевое преимущество — чистый код без явных if/throw
конструкций, с чёткой интеграцией в отчётность тестов.
process.exit(): предпочтительно ограничивать
прерывание текущим тестом.throw и assertion для
критических проверок.this.skip() для условного
пропуска тестов без фейла.Прерывание тестов в WebdriverIO позволяет повысить надёжность
автоматизации, избегать ложных действий при критических сбоях и
управлять потоком тестов в сложных сценариях. Правильное сочетание
методов return, throw,
this.skip() и assertion делает тесты безопасными,
информативными и удобными для интеграции в CI/CD.