【问题标题】:how to execute a script in every window that gets loaded in puppeteer?如何在 puppeteer 中加载的每个窗口中执行脚本?
【发布时间】:2019-11-02 17:30:16
【问题描述】:
我需要在 Chrome 中创建的每个 Window 对象中执行一个脚本——即:
- 通过 puppeteer 打开的选项卡
- 在 puppeteer 中通过 click()ing 链接打开的链接
- 所有弹出窗口(例如 window.open 或“_blank”)
- 上面包含的所有 iframe
它必须在没有我明确评估特定Window对象的情况下执行...
我查看了 Chrome 的文档,我应该使用的是 Page.addScriptToEvaluateOnNewDocument。
但是,它似乎无法通过 puppeteer 使用。
有什么想法吗?谢谢。
【问题讨论】:
标签:
puppeteer
google-chrome-headless
【解决方案1】:
这会在所有浏览器上下文中搜索目标。
为打开的页面查找目标的示例
通过window.open() 或弹出窗口:
await page.evaluate(() => window.open('https://www.example.com/'))
const newWindowTarget = await browser.waitForTarget(async target => {
await page.evaluate(() => {
runTheScriptYouLike()
console.log('Hello StackOverflow!')
})
})
通过browser.pages() 或标签
此脚本在第二个选项卡中运行脚本评估:
const pageTab2 = (await browser.pages())[1]
const runScriptOnTab2 = await pageTab2.evaluate(() => {
runTheScriptYouLike()
console.log('Hello StackOverflow!')
})
通过page.frames() 或 iframe
从 iframe 元素获取 eval 的示例:
const frame = page.frames().find(frame => frame.name() === 'myframe')
const result = await frame.evaluate(() => {
return Promise.resolve(8 * 7);
});
console.log(result); // prints "56"
希望对你有帮助