Обработка disconnections

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

WebdriverIO предоставляет несколько инструментов и подходов для обработки разрывов соединения (disconnections), что позволяет тестам продолжать выполнение или корректно завершаться при таких ошибках.

Причины disconnections

Существует несколько причин, по которым может произойти потеря соединения при использовании WebdriverIO:

  • Проблемы с интернет-соединением: В случае нестабильного или временного отсутствия соединения с сетью тесты могут неожиданно завершаться ошибкой.
  • Сетевые тайм-ауты: Время ожидания ответа от сервера или браузера может истечь из-за большого количества запросов или медленного отклика сервера.
  • Перегрузка веб-драйвера: Когда драйвер не может справиться с количеством одновременных соединений или с их обработкой, он может обрывать соединение.
  • Внутренние ошибки WebDriver: Некоторые ошибки, связанные с WebDriver, такие как неправильные параметры в запросах или сбои в сервере WebDriver, могут привести к потерям соединений.

Настройка обработки disconnections

WebdriverIO позволяет настроить параметры, которые помогают минимизировать или обрабатывать ошибки, связанные с потерей соединения. Одним из таких параметров является waitforTimeout.

Использование waitforTimeout

Для того чтобы избежать обрыва соединения при долгих ожиданиях, можно использовать параметр waitforTimeout. Этот параметр задает максимальное время ожидания при выполнении команд, таких как waitForVisible или waitForExist. Когда время ожидания истекает, возникает ошибка, однако этот параметр позволяет заранее настроить тест, чтобы дать системе достаточно времени на ответ.

Пример настройки:

browser.setTimeout({ 'implicit': 10000, 'pageLoad': 20000, 'script': 3000 })

В данном примере:

  • implicit — максимальное время ожидания для поиска элементов.
  • pageLoad — максимальное время ожидания для полной загрузки страницы.
  • script — максимальное время выполнения скриптов в браузере.

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

Использование try-catch для обработки ошибок

Одним из способов обрабатывать потери соединения является использование блока try-catch. Это позволяет тестам продолжать выполнение, несмотря на возникающие ошибки. В случае ошибки можно либо попытаться повторить попытку подключения, либо завершить тест с обработкой ошибки.

Пример:

try {
    const title = await browser.getTitle();
    console.log('Title of the page:', title);
} catch (error) {
    console.error('Ошибка при получении титула страницы:', error);
    // Действия для повторной попытки или завершения теста
}

В случае возникновения ошибки в блоке try, управление передается в блок catch, где можно зафиксировать ошибку и предпринять шаги для восстановления соединения или завершения теста.

Использование WebdriverIO hooks

Для более гибкой настройки обработки disconnections, можно использовать хуки WebdriverIO, такие как before, after, beforeTest, и afterTest. Эти хуки позволяют выполнить дополнительные действия, например, повторить попытку подключения, если произошло временное разъединение.

Пример использования хука для повторных попыток:

let retries = 0;
const maxRetries = 3;

beforeTest: async function(test) {
    // Ваша логика перед запуском теста
}

afterTest: async function(test) {
    if (test.error) {
        if (retries < maxRetries) {
            retries++;
            console.log(`Попытка №${retries}...`);
            await browser.reloadSession(); // Повторная инициализация сессии WebDriver
        } else {
            console.error('Тест не прошел после максимального числа попыток');
        }
    }
}

В этом примере тест будет перезапускаться несколько раз (не более трех), если возникла ошибка соединения или другая непредвиденная ошибка в ходе выполнения теста.

Перезапуск сессий

WebdriverIO предоставляет метод browser.reloadSession(), который может быть использован для перезапуска сессии WebDriver. Это полезно, когда соединение теряется, и необходимо восстановить состояние перед выполнением следующих шагов.

try {
    await browser.url('https://example.com');
} catch (error) {
    console.error('Ошибка при загрузке страницы. Перезапускаем сессию...');
    await browser.reloadSession();
    await browser.url('https://example.com');
}

Этот метод может быть полезен для восстановления нормальной работы тестов в случае, если сессия WebDriver была потеряна из-за сетевой проблемы или другой непредвиденной ошибки.

Обработка disconnections через ожидания и тайм-ауты

В случае потери соединения важно настроить адекватные ожидания и тайм-ауты, чтобы тесты не застревали в ожидании. Одним из подходов является использование WebDriver wait-методов с определенным временем ожидания, например, browser.waitUntil.

Пример использования waitUntil для обработки непредвиденных ситуаций:

await browser.waitUntil(async () => {
    const isConnected = await browser.execute(() => navigator.onLine);
    return isConnected;
}, {
    timeout: 30000,
    timeoutMsg: 'Сеть не доступна в течение 30 секунд'
});

Этот метод будет ожидать, пока соединение с интернетом не станет доступным. Если за 30 секунд этого не происходит, тест завершится с сообщением об ошибке.

Логирование и диагностика

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

browser.on('error', (err) => {
    console.error('Произошла ошибка WebDriver:', err);
});

Собранные логи могут быть полезны для дальнейшего анализа и улучшения стабильности тестов.

Заключение

Обработка разрывов соединения в WebdriverIO является важным аспектом автоматизированного тестирования. Использование различных подходов, таких как настройка тайм-аутов, обработка ошибок с помощью блоков try-catch, хуков для повторных попыток, а также методы перезапуска сессий позволяют создать более устойчивую систему тестирования, минимизируя количество ложных сбоев из-за временных проблем с сетью или соединением.