При автоматизации тестирования веб-приложений с использованием WebdriverIO часто встречается необходимость отключать или блокировать рекламу. Рекламные блоки могут значительно влиять на результаты тестов, так как они могут вызывать непредсказуемое поведение интерфейса, изменять визуальное представление страницы и, что важнее, мешать выполнению тестов. Чтобы избежать этих проблем, важно разобраться, как блокировать рекламу во время выполнения автоматизированных тестов.
Одним из наиболее простых методов блокировки рекламы является использование браузерных расширений, таких как 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']
}
}
});
// Продолжение тестов...
}
Этот метод подходит для тестирования с реальными браузерами, когда важно имитировать поведение конечного пользователя, использующего блокировщик рекламы.
Другим методом является блокировка рекламы путем модификации сетевых запросов. Это можно сделать с использованием 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/*'
]
});
// Продолжение тестов...
}
Этот способ позволяет динамически управлять блокировкой определённых сетевых запросов и подходит для более сложных сценариев тестирования, когда важно исключить нежелательные ресурсы из процесса загрузки страницы.
Для более сложных тестовых сценариев можно использовать прокси-сервер, который будет фильтровать трафик и блокировать все запросы, связанные с рекламой. Это может быть полезно, если необходимо блокировать рекламу на уровне всей тестовой среды, а не только на уровне браузера.
Для настройки прокси-сервера можно использовать такие инструменты, как 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()
}
}
}
});
// Продолжение тестов...
}
Использование прокси-сервера позволяет контролировать весь трафик, включая запросы на рекламу, что делает блокировку более гибкой и универсальной.
В некоторых случаях, когда требуется только временно исключить рекламные блоки на уровне 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());
});
// Продолжение тестов...
}
Этот подход может быть полезен, если вы заранее знаете, что на странице есть элементы с определёнными классами или идентификаторами, которые нужно удалить.
Каждый метод имеет свои преимущества и может быть выбран в зависимости от особенностей тестируемого приложения, требуемой гибкости и сложности сценариев.