Блокировка рекламы в тестах

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

Причины блокировки рекламы в тестах

  • Неопределенное поведение интерфейса. Рекламные блоки могут перекрывать важные элементы страницы, что делает невозможным взаимодействие с ними.
  • Нестабильность тестов. Появление рекламы может изменить порядок загрузки элементов, вызвать случайные тайм-ауты или ошибки.
  • Производительность. Загрузка рекламы увеличивает время загрузки страницы, что может привести к замедлению выполнения тестов.
  • Точность тестов. Рекламные баннеры могут вводить в заблуждение при проверке визуального представления страницы или при сравнениях контента.

Способы блокировки рекламы в тестах

  1. Использование браузерных расширений для блокировки рекламы

Одним из наиболее простых методов блокировки рекламы является использование браузерных расширений, таких как AdBlock или uBlock Origin. Эти расширения могут быть установлены и активированы перед запуском тестов, что предотвратит загрузку рекламных элементов.

Для этого в WebdriverIO можно использовать настройки браузера с подключением нужного расширения:

const { remote } = require("webdriverio");

async function runTests() {
    const browser = await remote({
        capabilities: {
            browserName: 'chrome',
            'goog:chromeOptions': {
                extensions: ['path/to/adblock_extension.crx']
            }
        }
    });

    // Продолжение тестов...
}

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

  1. Модификация сетевых запросов для блокировки рекламы

Другим методом является блокировка рекламы путем модификации сетевых запросов. Это можно сделать с использованием WebDriver в сочетании с инструментами браузера, такими как DevTools Protocol. Этот метод позволяет блокировать запросы к определенным ресурсам, например, изображениям, скриптам или стилям, которые содержат рекламу.

Пример кода, использующего DevTools Protocol для блокировки запросов к рекламным серверам:

const { remote } = require('webdriverio');

async function runTests() {
    const browser = await remote({
        capabilities: {
            browserName: 'chrome',
            'goog:chromeOptions': {
                w3c: false
            }
        }
    });

    await browser.cdp('Network.enable', {});
    
    // Блокируем запросы к рекламным ресурсам
    await browser.cdp('Network.setBlockedURLs', {
        urls: [
            'https://*.adnetwork.com/*',
            'https://*.ads.com/*'
        ]
    });

    // Продолжение тестов...
}

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

  1. Использование настройок прокси-сервера

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

Для настройки прокси-сервера можно использовать такие инструменты, как BrowserMob Proxy или mitmproxy. Эти инструменты позволяют перехватывать и модифицировать HTTP-запросы в процессе тестирования.

Пример настройки прокси-сервера для блокировки рекламы:

const { remote } = require('webdriverio');
const BrowserMobProxy = require('browsermob-proxy');

async function runTests() {
    const proxy = new BrowserMobProxy();
    await proxy.start();

    // Настройка фильтрации рекламы
    await proxy.setRequestFilter((request) => {
        if (request.url.includes('ads')) {
            return { action: 'deny' };
        }
        return { action: 'allow' };
    });

    const browser = await remote({
        capabilities: {
            browserName: 'chrome',
            'goog:chromeOptions': {
                proxy: {
                    httpProxy: proxy.url()
                }
            }
        }
    });

    // Продолжение тестов...
}

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

  1. Проверка контента страницы

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

Пример удаления рекламных элементов:

const { remote } = require('webdriverio');

async function runTests() {
    const browser = await remote({
        capabilities: {
            browserName: 'chrome'
        }
    });

    // Удаление всех рекламных блоков на странице
    await browser.execute(() => {
        const ads = document.querySelectorAll('.ad-banner, .ad-container, .advertisement');
        ads.forEach(ad => ad.remove());
    });

    // Продолжение тестов...
}

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

Рекомендации по выбору метода блокировки рекламы

  • Использование расширений предпочтительно для простых тестов с браузерами, где необходимо блокировать рекламу, не внося изменений в сетевой трафик.
  • Модификация сетевых запросов с помощью DevTools Protocol подходит для более сложных сценариев, когда важно заблокировать рекламу на уровне запросов, а не только элементов DOM.
  • Прокси-серверы эффективны, когда необходимо фильтровать трафик для всех тестов или для нескольких браузеров.
  • Удаление DOM-элементов будет полезно, когда нужно просто очистить страницу от уже загруженных рекламных блоков, не меняя поведение сети.

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