我有一个程序正在使用PhantomJS onInitialized方法来设置页面可以在首次加载时使用的窗口全局变量。我还没有找到办法用木偶操作者做到这一点。在创建页面之后但在转到页面之前调用evaluate会重置变量。在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);
答案 0 :(得分:2)
我认为PhantomJS onInitialized
的等效API实际上是通过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();
})();
答案 1 :(得分:1)
显然页面框架已经开始了#39;活动是胜利者:
page.on('framenavigated', msg => {
page.evaluate(pageParams => {
window.sharedConfig = 3;
}, pageParams);
});