我正在尝试测试 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');
但是,它似乎没有在警报框中返回消息(即使我已经确认它可以手动执行)。任何想法为什么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(() => browser?.close())
;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)