Отмена операций

В тестировании веб-приложений нередко возникает необходимость отмены ранее запущенных операций, например, из-за ошибок в выполнении или изменения условий выполнения теста. WebdriverIO предоставляет несколько способов для реализации отмены операций на разных уровнях тестового фреймворка. Понимание того, как и когда можно отменить операцию, позволяет более гибко управлять выполнением тестов и повышать стабильность тестовой среды.

Ошибки и исключения

WebdriverIO позволяет обрабатывать ошибки с помощью стандартных механизмов JavaScript. В случае, если операция не может быть выполнена или произошла ошибка в процессе тестирования, можно выбросить исключение с помощью ключевого слова throw.

it('Должен отменить операцию при ошибке', () => {
    try {
        browser.url('http://example.com');
        const button = $('#non-existent-button');
        if (!button.isDisplayed()) {
            throw new Error('Кнопка не найдена, операция отменена');
        }
    } catch (error) {
        console.error('Ошибка выполнения:', error.message);
    }
});

В данном примере выбрасывается исключение, если элемент кнопки не найден на странице. Это позволяет остановить дальнейшие действия и сообщить об ошибке.

Ожидания и таймауты

WebdriverIO предоставляет возможности для работы с ожиданиями элементов и таймаутами, что также может быть использовано для отмены выполнения операций. Использование методов ожидания, таких как waitForExist, waitForDisplayed или waitForClickable, позволяет установить лимиты времени для проверки состояния элементов на странице. Если элемент не появляется в течение установленного времени, операция автоматически отменяется.

it('Ожидание кнопки с таймаутом', () => {
    const button = $('#submit-button');
    button.waitForExist({ timeout: 5000, timeoutMsg: 'Кнопка не появилась за 5 секунд, операция отменена' });
    button.click();
});

В данном примере операция отменяется, если кнопка не появляется на странице в течение 5 секунд. Таймаут задаётся с помощью параметра timeout, а сообщение об ошибке в случае неудачи — через timeoutMsg.

Операции, не завершённые в срок

Для работы с тестами, в которых требуется завершение операций в определённое время, можно использовать таймауты на уровне всего теста. Если тест выполняется дольше, чем указано в настройках, WebdriverIO автоматически завершит его.

describe('Тест с таймаутом', () => {
    it('Должен завершиться в пределах таймаута', () => {
        browser.url('http://example.com');
        browser.pause(10000); // Пауза на 10 секунд, но тест должен завершиться за меньшее время
    });
}, 5000);  // Таймаут в 5 секунд

В примере выше, несмотря на наличие паузы в 10 секунд, тест завершится автоматически через 5 секунд, что позволяет отменить операцию, если она выполняется слишком долго.

Прерывание тестов с использованием skip и only

WebdriverIO интегрируется с фреймворками Mocha и Jasmine, что позволяет использовать различные методы для контроля за выполнением тестов, включая их пропуск или фокусировку на отдельных частях.

  • Использование .skip() позволяет пропустить тест в случае возникновения ошибки или других условий.
it.skip('Тест, который нужно пропустить', () => {
    const button = $('#submit-button');
    button.click();
});
  • Использование .only() позволяет выполнить только один тест в рамках сессии.
it.only('Тест, на котором сосредоточен фокус', () => {
    const inputField = $('#input-field');
    inputField.setValue('test input');
});

Эти методы полезны для временной отмены или фокусировки на определённых тестах, что позволяет упростить процесс отладки.

Прерывание выполнения с помощью browser.reload

Если возникает ситуация, когда необходимо полностью перезапустить страницу или браузер для отмены текущих операций, можно использовать метод browser.reload().

it('Перезагрузка страницы для отмены текущих действий', () => {
    browser.url('http://example.com');
    browser.reload();  // Перезагрузка страницы
    const title = browser.getTitle();
    console.log('Новый заголовок страницы: ', title);
});

В таких случаях перезагрузка страницы помогает сбросить все текущее состояние, отменяя действия, которые могли быть неудачно завершены.

Завершение работы с сессией

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

afterEach(() => {
    if (someCriticalErrorOccurred) {
        browser.deleteSession();
    }
});

Метод browser.deleteSession() позволяет завершить сессию браузера и остановить выполнение всех операций. Это полезно, если возникает критическая ошибка, которая требует немедленного завершения теста.

Совмещение различных методов отмены

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

it('Использование нескольких методов отмены', () => {
    try {
        browser.url('http://example.com');
        const element = $('#non-existent-element');
        element.waitForExist({ timeout: 3000, timeoutMsg: 'Элемент не найден, операция отменена' });

        element.click();
    } catch (error) {
        console.error('Произошла ошибка:', error.message);
        throw new Error('Операция отменена из-за ошибки');
    }
});

Этот подход позволяет гибко управлять выполнением тестов и обеспечивать отмену операций в случае непредвиденных ситуаций.

Заключение

Отмена операций является неотъемлемой частью процесса тестирования в WebdriverIO. Возможности для обработки ошибок, настройки таймаутов и использования различных механизмов управления выполнением тестов позволяют создавать более устойчивые и надежные тесты. Знание всех инструментов для отмены операций и их правильное применение помогает снизить количество сбоев и повысить стабильность тестовой среды.