【问题标题】: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"
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2022-01-01
      • 2017-06-19
      • 1970-01-01
      相关资源
      最近更新 更多