CAPTCHA обход и обработка

CAPTCHA — это система, которая используется для различения человека и автоматической программы (бота). Задача обхода CAPTCHA в автоматизированном тестировании часто возникает при работе с веб-приложениями, которые активно защищают свои формы регистрации, логина и другие важные элементы. WebdriverIO, как инструмент для автоматизации веб-тестирования, предоставляет возможности для работы с такими элементами, но обход CAPTCHA требует особых подходов и решений.

Зачем обходить CAPTCHA в тестах?

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

Подходы к обходу CAPTCHA

1. Использование API сервисов для решения CAPTCHA

Существуют сторонние сервисы, которые предоставляют решение CAPTCHA через API. Например, такие платформы, как 2Captcha, AntiCaptcha или DeathByCaptcha, предлагают API для автоматического решения капчи. Эти сервисы подключаются через WebdriverIO, позволяя отправить изображение CAPTCHA на сервер, который решает её и возвращает ответ.

Для интеграции с таким сервисом можно использовать несколько простых шагов:

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

Пример взаимодействия с сервисом 2Captcha:

const axios = require('axios');
const apiKey = 'YOUR_API_KEY';

async function solveCaptcha(captchaImageUrl) {
    const response = await axios.post('http://2captcha.com/in.php', {
        key: apiKey,
        method: 'base64',
        body: captchaImageUrl, // Здесь передаём изображение CAPTCHA в формате base64
    });

    const requestId = response.data.request;
    
    const resultResponse = await axios.get(`http://2captcha.com/res.php?key=${apiKey}&action=get&id=${requestId}`);
    
    return resultResponse.data;
}

// Пример использования в тесте WebdriverIO
describe('CAPTCHA тест', () => {
    it('должен решать CAPTCHA через 2Captcha', async () => {
        const captchaImageUrl = await $('img.captcha').getAttribute('src');
        const captchaSolution = await solveCaptcha(captchaImageUrl);
        await $('#captcha-input').setValue(captchaSolution);
        await $('#submit-button').click();
    });
});

Этот метод требует наличия ключа API и может быть зависим от качества работы сервисов, что необходимо учитывать при тестировании.

2. Обход с использованием рекапчи (reCAPTCHA)

Google reCAPTCHA — популярная система защиты от ботов, которая представлена в нескольких версиях. Важно понимать, что версии reCAPTCHA 2 и 3 требуют разных подходов для обхода:

  • reCAPTCHA v2 (чекбокс “Я не робот”) может быть решена через API-сервисы или с помощью автоматического клика на чекбокс, если это возможно.
  • reCAPTCHA v3 основывается на анализе поведения пользователя и не имеет явного элемента для обхода. Однако существует возможность использования “политики” сайта, разрешающей обход через настройки браузера.

Для обхода reCAPTCHA v2 с помощью WebdriverIO необходимо использовать метод, который будет взаимодействовать с чекбоксом или фреймом reCAPTCHA. Однако многие сайты могут использовать скрытую reCAPTCHA, что затрудняет автоматизацию.

Пример для взаимодействия с reCAPTCHA v2:

describe('Обход reCAPTCHA v2', () => {
    it('должен решать reCAPTCHA v2 через сервис', async () => {
        await browser.url('https://example.com/with-captcha');

        // Найдем iframe, содержащий reCAPTCHA
        const iframe = await $('iframe[src*="recaptcha"]');
        await browser.switchToFrame(iframe);

        // Найдем элемент чекбокса reCAPTCHA и кликаем по нему
        const recaptchaCheckbox = await $('#recaptcha-anchor');
        await recaptchaCheckbox.click();

        // Вернемся к основной странице
        await browser.switchToParentFrame();
        await $('#submit-button').click();
    });
});

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

3. Включение реального взаимодействия

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

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

4. Отключение CAPTCHA для тестовых сред

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

Пример настройки в конфигурации сервера:

{
    "captchaEnabled": false
}

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

Заключение

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