无法使用 Puppeteer 在 HTML 元素上附加新的单击事件处理程序



为什么在 VS Code 的调试会话中手动单击时未触发锚点上的单击事件?

大致上这是我的目标:

  • 转到在有头的Chrome 中使用 Puppeteer 的 linkedin.com
  • 登录
  • 转到 linkedin.com/jobs
  • 为页面上的所有链接附加单击事件处理程序
  • 附加事件处理程序后暂停节点.js执行
  • 用鼠标手动单击链接以观察这个新事件处理程序的运行
  • 情况

在代码中,这就是我得到的

const puppeteer = require('puppeteer')
async function main() {
const browser = await puppeteer.launch({ headless: false })
const page = await browser.newPage();
await page.goto('https://www.linkedin.com/');
await login(page);
await page.goto('https://www.linkedin.com/jobs/');
await attachLinks(page);
await page.screenshot({ path: "bla" })
browser.close();
};
async function attachLinks(page) {
const bodyHandle = await page.$('body');
await page.evaluate( (body, numLinks=3) => {
let anchors = Array.from( body.querySelectorAll("a") ).
filter( (e, i) => i < numLinks );
for(let i = 0; i < anchors.length; i++) {
let a = anchors[i];
console.log(`Binding for ${a.href}`);
// This event does not trigger!!!!!
a.addEventListener("click", e => { 
console.log("some one clicked the link");
e.preventDefault(); 
e.stopPropagation(); 
return false; 
});
};
}, bodyHandle);
await bodyHandle.dispose();
}
main();

然后使用 VS Code 和 node.js 调试支持,我在附加<a>标记的onclick事件后,在行await page.screenshot({ path: "bla" })上放置了一个断点。在打开的浏览器中(因为无头设置为 false(,当代码等待恢复时,我用鼠标单击了<body>中的<a>标签,希望在有头的调试 Chrome 浏览器的控制台中看到"有人点击了链接"。但是我在浏览器或VS Code的调试控制台中都没有看到日志。我在这里错过了什么吗?

这是因为您实际上并没有单击锚标记。您已将事件附加到其"单击"并定义了单击它时将发生的情况,但实际上您并没有单击它。只需添加a.click()喜欢

// This event will now trigger
a.addEventListener("click", e => { 
console.log("some one clicked the link");
e.preventDefault(); 
e.stopPropagation(); 
return false; 
});
a.click();

查看名称addEventListener,您正在附加事件侦听器,而不是实际单击它

相关内容

最新更新