Puppeteer предоставляет возможность управлять экземпляром браузера Chromium или Chrome в режиме без головы и с головой, что делает его мощным инструментом для автоматизированного тестирования и веб-скрейпинга. Одной из ключевых возможностей является загрузка расширений, что позволяет тестировать поведение сайтов с установленными расширениями или использовать функционал, недоступный стандартными методами Puppeteer.
Расширения в Chrome — это пакеты с определённой структурой, содержащие
HTML, CSS, JS и манифест (manifest.json). Puppeteer
поддерживает их загрузку только в режиме с интерфейсом
браузера, так как режим без головы (headless:
true) не допускает использование расширений.
Важно: Невозможность использования расширений в
headless-режиме ограничивает тестирование функционала, завязанного на
расширениях, и требует включения headless: false.
Для корректной работы с расширениями необходимо указать несколько параметров при запуске браузера:
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({
headless: false,
args: [
'--disable-extensions-except=/путь/к/расширению',
'--load-extension=/путь/к/расширению'
]
});
const page = await browser.newPage();
await page.goto('https://example.com');
})();
Разбор аргументов:
–disable-extensions-except: отключает все расширения, кроме
указанных. Полезно для изоляции тестируемого расширения.
–load-extension: загружает расширение из указанной
директории. Можно указать несколько путей, разделённых запятыми.
Любое расширение должно содержать manifest.json. Для
Puppeteer важно, чтобы манифест соответствовал стандарту Chrome Manifest
V2 или V3 (сейчас большинство расширений используют V3). Основные поля:
{
"manifest_version": 3,
"name": "Test Extension",
"version": "1.0",
"background": {
"service_worker": "background.js"
},
"permissions": ["tabs", "storage"],
"action": {
"default_popup": "popup.html"
}
}
Ключевые моменты:
permissions должны включать все необходимые API для
тестирования.
background.service_worker или
background.scripts содержит основную логику расширения.
Для одновременной загрузки нескольких расширений указываются пути через запятую:
args: [
'--disable-extensions-except=/path/ext1,/path/ext2',
'--load-extension=/path/ext1,/path/ext2'
]
Важно помнить, что порядок загрузки может влиять на работу расширений, особенно если они взаимодействуют с одними и теми же API или DOM.
После запуска браузера можно проверить, что расширение успешно загружено. Один из способов — открыть страницу расширения через специальный URL:
const extensionTarget = browser.targets().find(
target => target.type() === 'background_page' && target.url().includes('Test Extension')
);
if (extensionTarget) {
console.log('Расширение загружено');
} else {
console.log('Расширение не загружено');
}
Объяснение:
browser.targets() возвращает все вкладки и фоновые страницы
браузера.
background_page позволяет получить
именно фоновые скрипты расширения.
headless: false.
page, их взаимодействие требует использования
browser.targets() и target.page().
Загрузка расширения позволяет проверять:
background.js).
chrome.storage).
Пример теста взаимодействия с popup расширения:
const extensionName = 'Test Extension';
const targets = await browser.targets();
const extensionTarget = targets.find(
t => t.type() === 'background_page' && t.url().includes(extensionName)
);
const extensionPage = await extensionTarget.page();
await extensionPage.evaluate(() => {
chrome.storage.local.set({ key: 'value' });
});
Для удобства тестирования часто создают утилиты для автоматической загрузки расширений и получения их фоновых страниц. Такой подход позволяет централизованно управлять тестовыми расширениями и использовать их в разных сценариях без ручного поиска пути к папке.
Загрузка расширений в Puppeteer предоставляет гибкий инструмент для интеграционного тестирования веб-приложений, позволяя симулировать реальные условия работы пользователей, у которых установлены дополнительные функции браузера. Правильное управление аргументами запуска, проверка фоновых страниц и изоляция расширений обеспечивают стабильность и воспроизводимость тестов.