Работа с CAPTCHA

CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) — это механизм защиты от автоматических запросов, который активно используется на веб-сайтах для предотвращения спама и других форм злоупотреблений. CAPTCHA заставляет пользователя пройти тест, который сложно выполнить автоматизированному скрипту. Однако в контексте автоматизированного тестирования веб-приложений, когда требуется взаимодействовать с такими элементами, может возникнуть потребность в обходе CAPTCHA.

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

Особенности работы с CAPTCHA в Puppeteer

  1. Блокировка CAPTCHA в тестах Первый и наиболее эффективный способ обхода CAPTCHA при тестировании — это её блокировка на уровне браузера. Для этого в Puppeteer можно использовать моки (mock) или подмену запросов, предотвращая загрузку CAPTCHA. Такая практика полезна, если необходимо протестировать функционал без необходимости решения CAPTCHA.

    Пример:

    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    
    await page.setRequestInterception(true);
    
    page.on(&
      if (request.url().includes('captcha')) {
        request.abort();  // Прерывание запроса на CAPTCHA
      } else {
        request.continue();
      }
    });
    
    await page.goto('https://example.com');

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

  2. Использование сторонних сервисов для решения CAPTCHA В некоторых случаях блокировка CAPTCHA невозможна, и нужно находить решения для обхода тестов, которые требуют человеческого вмешательства. В таких случаях можно использовать внешние сервисы для автоматического решения CAPTCHA, такие как 2Captcha или AntiCaptcha. Эти сервисы позволяют отправлять изображения CAPTCHA и получать решение через API.

    Пример использования 2Captcha с Puppeteer:

    const puppeteer = require('puppeteer');
    const axios = require('axios');
    
    const solveCaptcha = async (siteKey, url) => {
      const response = await axios.post('http://2captcha.com/in.php', {
        key: 'your-2captcha-api-key',
        method: 'userrecaptcha',
        googlekey: siteKey,
        pageurl: url,
        json: 1
      });
    
      const requestId = response.data.request;
    
      // Получаем решение
      const solution = await axios.get(`http://2captcha.com/res.php?key=your-2captcha-api-key&action=get&id=${requestId}&json=1`);
      return solution.data.request;
    };
    
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com/captcha-page');
    
    // Разбираем сайт на наличие CAPTCHA
    const siteKey = await page.$eval('div.g-recaptcha', el => el.getAttribute('data-sitekey'));
    
    // Решаем CAPTCHA через 2Captcha
    const captchaSolution = await solveCaptcha(siteKey, page.url());
    
    // Вводим решение CAPTCHA в форму
    await page.type('#g-recaptcha-response', captchaSolution);
    
    // Отправляем форму
    await page.click('#submit-button');

    В этом примере используется API сервиса 2Captcha для получения решения CAPTCHA, которое затем отправляется на сайт. Таким образом, можно продолжать тестирование без ручного вмешательства.

  3. Ручное решение CAPTCHA в ходе тестирования В некоторых случаях может быть полезным тестировать решение CAPTCHA вручную. Для этого Puppeteer может быть настроен на паузу, чтобы тестировщик мог вручную решить CAPTCHA. Для этого можно использовать метод page.pause(), который приостановит выполнение теста, давая возможность решить задачу вручную.

    Пример:

    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    
    await page.goto('https://example.com/captcha-page');
    
    // Останавливаем тест на момент решения CAPTCHA
    await page.pause();

    После того как CAPTCHA будет решена, тест можно продолжить вручную, используя метод page.continue() для продолжения выполнения скрипта.

  4. Использование прокси-серверов для обхода защиты В некоторых случаях проблема с CAPTCHA может возникать из-за большого количества запросов с одного IP-адреса. В таких ситуациях может быть полезно использование прокси-серверов. Это позволит изменять IP-адреса, чтобы избежать блокировок, связанных с частыми запросами и подозрительным поведением.

    Пример использования прокси в Puppeteer:

    const browser = await puppeteer.launch({
      args: ['--proxy-server=http://your-proxy-server.com:8080']
    });
    const page = await browser.newPage();
    await page.goto('https://example.com');

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

Лучшие практики

  • Избегание решения CAPTCHA в тестах: В идеале стоит избегать тестирования функционала, который требует взаимодействия с CAPTCHA, так как это увеличивает сложность и длительность тестирования. Лучше настроить инфраструктуру таким образом, чтобы CAPTCHA не загружалась во время тестов.

  • Использование флагов или режимов тестирования на серверной стороне: Если CAPTCHA используется только для предотвращения автоматических запросов, можно настроить сервер для пропуска защиты в случае тестирования. Например, можно передавать в запросах специальный заголовок или параметр, который будет означать, что запрос выполнен в тестовом режиме.

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

Заключение

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