У меня есть программа, которая использует метод PhantomJS onInitialized для установки глобальная переменная окна, которую страница может использовать при первой загрузке. Я пока не смог найти способ сделать это с кукольником. Вызов оценки после создания страницы, но перед переходом на страницу сбрасывает переменную. Делать это в domcontentloaded, похоже, уже слишком поздно.
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.evaluate(pageParams => {
window.sharedConfig = 1; // Sets it but gets reset when the page loads
}, pageParams);
page.on('domcontentloaded', msg => {
page.evaluate(pageParams => {
window.sharedConfig = 2; // Sets it but it's too late
}, pageParams);
});
let pageResult = await page.goto(url);
await page.evaluate(pageParams => {
window.sharedConfig = 3; // Def too late
}, pageParams);
2 ответа
Я думаю, что эквивалентный API для PhantomJS onInitialized
на самом деле достигается с помощью событие Browser :: targetcreated
:
Излучается при создании цели, например, когда новая страница открывается с помощью
window.open
илиbrowser.newPage
.
Пример инициализации window.sharedConfig
для всех вновь созданных страниц:
(async () => {
const browser = await puppeteer.launch();
browser.on('targetcreated', async target => {
const page = await target.page();
await page.evaluate(() => {
window.sharedConfig = 0;
});
});
const page = browser.newPage();
await page.evaluate(() => console.log(window.sharedConfig)); // => 0
await browser.close();
})();
Если вам нужна дополнительная настройка страницы при навигации, вы можете использовать page.evaluateOnNewDocument()
:
Функция вызывается после создания документа, но до запуска любого из его сценариев. Это полезно для изменения среды JavaScript, например для заполнения
Math.random
.
Пример, который инициализирует window.sharedConfig
, а затем изменяет это начальное значение при навигации по странице:
(async () => {
const browser = await puppeteer.launch();
browser.on('targetcreated', async target => {
const page = await target.page();
// Initialize window.sharedConfig for new page
await page.evaluate(() => {
window.sharedConfig = 0;
});
// Set window.sharedConfig when the page is navigated (before page loads)
await page.evaluateOnNewDocument(() => {
// window.sharedConfig === 0
window.sharedConfig = 1;
});
});
const page = browser.newPage();
await page.evaluate(() => console.log(window.sharedConfig)); // => 0
await page.goto('http://google.com');
await page.evaluate(() => console.log(window.sharedConfig)); // => 1
await browser.close();
})();
Судя по всему, здесь побеждает событие с переходом по рамке:
page.on('framenavigated', msg => {
page.evaluate(pageParams => {
window.sharedConfig = 3;
}, pageParams);
});
Похожие вопросы
Новые вопросы
node.js
Node.js - это неблокирующая асинхронная среда ввода-вывода, основанная на событиях, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на клиенте, так и на стороне сервера, и, следовательно, выигрывают от повторного использования кода и отсутствия переключения контекста.