【问题标题】:How to handle popups in puppeteer如何处理 puppeteer 中的弹出窗口
【发布时间】:2018-03-22 00:58:47
【问题描述】:

如何处理弹出窗口并访问弹出窗口以对其进行一些操作。

const puppeteer = require('puppeteer');

async function run() {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://example.com');
    await page.click(Launchpopup);
}

【问题讨论】:

    标签: node.js google-chrome-headless puppeteer


    【解决方案1】:

    所以我要做的就是在他们的主页上登录 facebook,然后导航到我想去的页面,我点击了使用 facebook 登录按钮的位置。然后,一旦弹出窗口发生,下面的代码将单击使用 facebook 按钮登录。

            await page.click('[service_name="facebook"]')
            const newPagePromise = new Promise(x => browser.once('targetcreated', target => x(target.page()))); 
            const popup = await newPagePromise;
            await popup.waitForSelector('[name="__CONFIRM__"]')
            const confirm = await popup.$('[name="__CONFIRM__"]')
            await popup.click('[name="__CONFIRM__"]')
            await page.waitFor(2000);
            await page.goto('your login page'); $
    

    【讨论】:

      【解决方案2】:

      从0.13.0版本开始,可以使用如下代码:

      ... code to open popup...
      const pages = await browser.pages(); // get all open pages by the browser
      const popup = pages[pages.length - 1]; // the popup should be the last page opened
      

      【讨论】:

      • 不适用于 puppeteer@1.14.0,只有 @luneth777 有效
      【解决方案3】:

      这段代码是 Typescript,但你明白了:

      async function waitForPopupMatching(
        browser: Puppeteer.Browser,
        regex: RegExp,
        openAction: () => Promise<void>,
        timeout: number = 30000,
      ): Promise<Puppeteer.Page> {
        const promise = new Bluebird<Puppeteer.Target>(resolve => {
          const listener = async (target: Puppeteer.Target) => {
            if (target.type() === 'page' && regex.test(target.url())) {
              browser.removeListener('targetcreated', listener);
              resolve(target);
            }
          };
          browser.addListener('targetcreated', listener);
        }).timeout(timeout);
      
        await openAction(); // Typically a mouse click
      
        const tgt = await promise;
        return await tgt.page();
      }
      

      【讨论】:

        【解决方案4】:

        您应该查看 v0.12.0-alpha 的文档,它描述了如何与对话框交互。

        const puppeteer = require('puppeteer');
        
        puppeteer.launch().then(async browser => {
          const page = await browser.newPage();
          await page.goto('https://example.com');
          page.on('dialog', async dialog => {
            console.log(dialog.message());
            await dialog.dismiss();
            await browser.close();
          });
          page.evaluate(() => alert('1'));
        });
        

        相关docs can be found here

        【讨论】:

        • 是的,我可以与对话框交互,但我如何处理弹出窗口
        • 你说的是不是浏览器原生的弹出窗口,而是使用 html 和 css 生成的?
        • 抱歉不清楚,我说的是弹出窗口
        • 找到解决办法了吗?
        • @Kaelinator 不,我相信。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-09
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 2021-01-11
        相关资源
        最近更新 更多