Puppeteer предоставляет мощные инструменты для автоматизации браузера, в том числе возможность создания и взаимодействия с несколькими страницами (tabs) одновременно. В этой главе рассмотрим, как работать с несколькими страницами в Puppeteer, какие возможности предоставляет данный подход и как эффективно управлять несколькими вкладками.
Основной подход к созданию нескольких страниц в Puppeteer заключается в
использовании метода browser.newPage(). Каждый вызов этого
метода открывает новую вкладку в браузере, с которой можно
взаимодействовать как с отдельной страницей.
Пример кода для открытия двух страниц:
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch();
const page1 = await browser.newPage(); // Первая вкладка
const page2 = await browser.newPage(); // Вторая вкладка
await page1.goto('https://example.com');
await page2.goto('https://example.org');
// Дополнительные действия с каждой страницей
await browser.close();
})();
В данном примере создаются две страницы (page1 и
page2), каждая из которых загружает свой сайт. Важно
помнить, что каждая страница независима и может выполнять различные
действия одновременно.
После того как страницы созданы, можно взаимодействовать с каждой из них
независимо. Например, для получения данных или выполнения действий на
разных страницах можно использовать методы Puppeteer, такие как
page.click(), page.type(),
page.screenshot(), и другие.
Пример параллельного выполнения действий на разных страницах:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page1 = await browser.newPage();
const page2 = await browser.newPage();
const [response1, response2] = await Promise.all([
page1.goto('https://example.com'),
page2.goto('https://example.org')
]);
// Ожидание загрузки страниц и дальнейшее взаимодействие
const title1 = await page1.title();
const title2 = await page2.title();
console.log('Title of page 1:', title1);
console.log('Title of page 2:', title2);
await browser.close();
})();
В этом примере оба сайта загружаются одновременно с использованием
Promise.all(), что позволяет параллельно выполнять
действия, экономя время. После загрузки страниц мы извлекаем их
заголовки и выводим их в консоль.
При работе с несколькими вкладками важно правильно управлять ресурсами и контролировать жизненный цикл каждой страницы. Например, можно закрыть вкладку после завершения работы с ней или откатить изменения, если они больше не нужны.
Пример закрытия вкладок:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page1 = await browser.newPage();
const page2 = await browser.newPage();
await page1.goto('https://example.com');
await page2.goto('https://example.org');
// Закрытие второй вкладки
await page2.close();
// Действия с первой вкладкой
const title1 = await page1.title();
console.log('Title of page 1:', title1);
await browser.close();
})();
Закрытие вкладки выполняется через метод page.close(),
который освобождает ресурсы, связанные с конкретной вкладкой. Это может
быть полезно для уменьшения нагрузки при работе с большим количеством
страниц.
Работа с несколькими страницами может быть связана с риском ошибок, связанных с сетевыми запросами, доступом к элементам на странице или сбоем самого браузера. Для предотвращения таких ситуаций важно использовать обработку ошибок и гарантировать, что каждая страница корректно закрыта в случае непредвиденной ситуации.
Пример обработки ошибок:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
try {
const page1 = await browser.newPage();
const page2 = await browser.newPage();
await Promise.all([
page1.goto('https://example.com'),
page2.goto('https://example.org')
]);
// Параллельная работа с обеими страницами
} catch (error) {
console.error('Ошибка при работе с одной из страниц:', error);
} finally {
await browser.close();
}
})();
Этот подход обеспечивает безопасность выполнения кода, гарантируя, что в случае ошибки браузер будет закрыт, а ресурсы освобождены.
В тестировании с использованием Puppeteer создание нескольких страниц может быть полезным для проверки взаимодействия между различными частями веб-приложения. Например, если необходимо протестировать работу с несколькими вкладками или окнами, можно использовать Puppeteer для эмуляции такого взаимодействия и проверять корректность работы в многозадачной среде.
Пример имитации взаимодействия между страницами:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page1 = await browser.newPage();
const page2 = await browser.newPage();
await page1.goto('https://example.com');
await page2.goto('https://example.org');
// Переход по ссылке на странице 1, которая откроет новую вкладку
await page1.click('a[target="_blank"]');
const newPage = await browser.pages().then(pages => pages[2]);
// Проверка данных на новой странице
const newPageTitle = await newPage.title();
console.log('Title of new page:', newPageTitle);
await browser.close();
})();
Этот код демонстрирует, как можно управлять новой страницей, открывшейся через переход по ссылке на первой странице. Важно отметить, что Puppeteer позволяет получать доступ ко всем страницам, которые находятся в контексте браузера.
Работа с несколькими страницами в Puppeteer предоставляет гибкие возможности для автоматизации тестирования, сбора данных и выполнения сложных взаимодействий. Управление вкладками, выполнение параллельных действий и корректная обработка ошибок делают Puppeteer мощным инструментом для тестирования веб-приложений в многозадачной среде.