Puppeteer предоставляет множество инструментов для управления браузером,
но одна из важнейших возможностей заключается в работе с отдельными
страницами и вкладками, что достигается через объекты типа
target. target представляет собой процесс или
открытое окно браузера, которое может быть использовано для
взаимодействия с конкретной вкладкой или новым контекстом в браузере.
В контексте Puppeteer объект target представляет собой
ссылку на “цель”, такую как окно, вкладка или даже фрейм. Это базовый
элемент, через который происходит работа с страницами браузера. Каждый
target ассоциирован с процессом браузера, и позволяет отслеживать,
управлять и взаимодействовать с окнами и вкладками.
Когда браузер запускается, Puppeteer создает несколько target-ов: одно для самого браузера, одно для главной страницы и дополнительные для открытых вкладок. Все эти targets могут быть использованы для взаимодействия с вкладками и выполнения различных операций.
Для получения списка всех открытых targets используется метод
page.target(). Он возвращает объект, представляющий текущую
вкладку или окно.
const browser = await puppeteer.launch();
const page = await browser.newPage();
const target = page.target();
console.log(target._targetId); // Выводим ID текущего target
Создание нового target-а происходит через вызов метода
browser.newPage(). Это открывает новую вкладку, которая
становится новым target-ом.
const browser = await puppeteer.launch();
const page1 = await browser.newPage(); // Новый target
const page2 = await browser.newPage(); // Новый target
Каждая новая вкладка или окно в браузере будет ассоциироваться с отдельным target-ом, и можно работать с ними параллельно.
Каждый объект target имеет метод page(),
который позволяет переключиться на страницу, ассоциированную с этим
target-ом.
const page1 = await browser.newPage();
const page2 = await browser.newPage();
const target1 = page1.target();
const target2 = page2.target();
// Переключаемся на target1
const pageFromTarget1 = await target1.page();
await pageFromTarget1.goto(&
// Переключаемся на target2
const pageFromTarget2 = await target2.page();
await pageFromTarget2.goto('https://google.com');
Можно работать с несколькими target-ами одновременно, что удобно при тестировании мульти-вкладочных сценариев.
Puppeteer поддерживает событийную модель для работы с targets. Например, можно отслеживать создание и закрытие новых targets, что полезно при тестировании приложений, где вкладки открываются или закрываются динамически.
Для отслеживания событий создания новых targets используется метод
browser.on(‘targetcreated’). Он срабатывает каждый раз,
когда создается новый target (вкладка или окно).
browser.on('targetcreated', (target) => {
console.log('Создан новый target:', target._targetId);
});
Аналогично, для отслеживания закрытия target-а можно использовать
событие targetdestroyed.
browser.on('targetdestroyed', (target) => {
console.log('Закрыт target:', target._targetId);
});
Эти события полезны для динамичного мониторинга состояния браузера, особенно когда приложение активно открывает и закрывает вкладки.
Каждая вкладка может содержать несколько фреймов. В Puppeteer можно
работать с фреймами через методы target и
page. Это полезно, например, при автоматизации тестирования
для сайтов с динамическими фреймами (например, с embedded content).
Чтобы получить доступ к фреймам внутри страницы, можно использовать
метод page.frames(), который возвращает все фреймы на
странице, включая главный фрейм.
const frames = page.frames();
frames.forEach((frame) => {
console.log('Frame ID:', frame._frameId);
});
Так можно работать с каждым фреймом отдельно, например, взаимодействовать с элементами внутри него.
Поскольку каждый target представляет собой отдельный процесс, можно управлять его поведением, например, закрывать его или получать информацию о статусе. Это полезно, если необходимо контролировать ресурсы браузера при тестировании.
Для закрытия target-а можно использовать метод
target.close(), который завершает работу с этим объектом и
закрывает вкладку.
await target.close(); // Закрыть вкладку
Метод target.close() может быть полезен, когда необходимо
завершить работу с вкладкой после выполнения тестов или автоматических
действий.
Понимание работы с объектами target в Puppeteer
предоставляет гибкость в автоматизации тестирования и управления
браузерными процессами. Это важный инструмент для создания более сложных
и многозадачных сценариев тестирования, таких как работа с несколькими
вкладками, фреймами, или динамически создаваемыми страницами.