Как обрабатывать всплывающие окна в кукольнике

как обрабатывать всплывающее окно и получить доступ к всплывающему окну, чтобы выполнить с ним некоторые операции.

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);
}

person vinay kumar    schedule 10.10.2017    source источник


Ответы (4)


Этот код - 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();
}
person Sam    schedule 10.03.2018

Итак, что я делаю, я вхожу в 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'); $
person luneth777    schedule 29.07.2019

Начиная с версии 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
person user3453261    schedule 03.03.2018
comment
Не работает с [email protected], работает только @ luneth777 - person Gilles Quenot; 13.09.2019

Вам следует ознакомиться с документацией для 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'));
});

Соответствующие документы можно найти здесь.

person tomahaug    schedule 13.10.2017
comment
Да, я могу взаимодействовать с диалогами, но как мне обрабатывать всплывающие окна? - person vinay kumar; 02.11.2017
comment
Вы говорите о всплывающих окнах, которые не являются встроенными в браузер, но создаются с использованием HTML и CSS? - person tomahaug; 02.11.2017
comment
Извините за непонятность, да, я говорил о всплывающих окнах - person vinay kumar; 03.11.2017
comment
Решение найдено? - person Kaelinator; 17.12.2017
comment
@Kaelinator Нет, я верю. - person vinay kumar; 18.12.2017
comment
Это помогло получить текст и сосредоточиться. Сейчас я работаю над нажатием кнопки ОК, но вы меня заставили, так что большое спасибо. - person SteveB; 01.07.2020