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())
;
我正在尝试在 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())
;