puppeteer - 如何在 puppeteer 中加载的每个窗口中执行脚本?
问题描述
我需要在 Chrome 中创建的每个 Window 对象中执行一个脚本——即:
- 通过 puppeteer 打开的标签
- 在 puppeteer 中通过 click()ing 链接打开的链接
- 所有弹出窗口(例如 window.open 或“_blank”)
- 以上包含的所有 iframe
它必须在没有我明确评估该特定Window
对象的情况下执行...
我检查了 Chrome 的文档,我应该使用的是Page.addScriptToEvaluateOnNewDocument
. 但是,它似乎无法通过 puppeteer 使用。
任何想法?谢谢。
解决方案
这会在所有浏览器上下文中搜索目标。
为打开的页面查找目标的示例
通过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"
希望这可以帮助你