Puppeteer 不拾取对话框

Puppeteer not picking up dialog box

我正在尝试在 Puppeteer 中测试警告框:

    msg = '';
    await page.goto('http://localhost:8080/', {
      waitUntil: 'networkidle2'
    });
    await page.$eval('#value', el => el.value = '<script>alert("BLEH")</script>');
    page.on('dialog', async dialog => {
      msg = dialog.message();
      await dialog.dismiss()
    })
    // submit comment
    await page.$eval('#message', form => form.submit());
    expect(msg).toEqual('BLEH');

但是,return 警告框内的消息似乎没有显示(尽管我已经确认它可以手动执行)。知道为什么没有输入 page.on('dialog', async dialog => { 吗?

我不确定您的页面发生了什么 -- 看起来您正在测试 XSS,但无论如何,您可以承诺对话框处理程序解析为 dialog.message() 值,如这个例子。

请注意,我正在使用 Enter 提交表单——调用 form.submit() 似乎覆盖了默认的预防措施,终止了页面,但如果它在您的站点上有效,则该修改不会改变根本下面的代码点。

请记住,await dialogDismissed; 永远不会超时,因为它不是 Puppeteer 函数。如果需要,请在承诺中调用 setTimeout(reject, someDelay)

const puppeteer = require("puppeteer");

let browser;
(async () => {
  const html = `
    <form id="message"><input id="value"></form>
    <script>
      document
        .getElementById("message")
        .addEventListener("submit", e => {
          e.preventDefault();
          alert(document.getElementById("value").value);
        })
      ;
    </script>
  `;
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  const dialogDismissed = new Promise((resolve, reject) => {
    const handler = async dialog => {
      await dialog.dismiss();
      resolve(dialog.message());
    };
    page.once("dialog", handler);
  });
  await page.setContent(html);
  const inputEl = await page.$("#value");
  await inputEl.type("hello world");
  await inputEl.press("Enter");
  const msg = await dialogDismissed;
  console.log(msg); // => hello world
  await page.close();
})()
  .catch(err => console.error(err))
  .finally(async () => await browser.close())
;