Puppeteer:如何捕获弹出窗口并可靠地等待其加载事件?

时间:2018-03-10 00:32:59

标签: puppeteer

使用Puppeteer捕获弹出窗口并等待其初始加载的可靠方法是什么?

在我的测试中,以下代码大部分时间都有效,除非在tgt.page()结算之前加载页面。如果发生这种情况,那么在添加侦听器时已经触发了load事件,因此等待load事件的最后一个promise只会超时。

我无法弄清楚如何在开始加载之前获取对页面的引用以添加侦听器。

export async function waitForPopupMatching(
  browser: Puppeteer.Browser,
  regex: RegExp,
  openAction: () => Promise<void>,
  timeout: number = 30000,
): Promise<Puppeteer.Page> {
  let timer: NodeJS.Timer;
  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;
  const page = await tgt.page();

  await new Bluebird(resolve => {
    page.once('load', () => resolve());
  }).timeout(timeout);

  return page;
}

0 个答案:

没有答案