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

标签 javascript puppeteer

为什么在 VS Code 中手动单击调试 session 时, anchor 上的单击事件未触发?

总的来说,这是我的目标:

  • headful Chrome 中使用 Puppeteer 访问 linkedin.com
  • 登录
  • 前往 linkedin.com/jobs
  • 为页面上的所有链接附加点击事件处理程序
  • 附加事件处理程序后暂停 node.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 调试支持,我在 await page.screenshot({ path: "bla" }) 行上放置了一个断点onclick之后事件<a>附有标签。在打开的浏览器中(因为 headless 设置为 false),在代码等待恢复时,我单击了 <a> <body> 中的标签用我的鼠标,期望在全神贯注的调试 Chrome 浏览器的控制台中看到“有人点击了该链接”。但我在浏览器或 VS Code 的调试控制台中都没有看到日志。我在这里遗漏了什么吗?

最佳答案

那是因为您实际上并没有单击 anchor 标记。您已将一个事件“单击”附加到它并定义了单击它时会发生什么,但您实际上并没有单击它。只需添加 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,您正在附加一个事件监听器,而不是实际单击它

关于javascript - 无法使用 Puppeteer 在 HTML 元素上附加新的单击事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50895177/

相关文章:

javascript - 加载图像到 document.body 背景

javascript - 如何在 Angular 2 中填充表单数组?

javascript - 卸载事件之前的 iframe

javascript - 如何使用 puppeteer 从选定的选项(不是值)中获取文本

javascript - Puppeteer HTML to PDF 不应用外部 css 文件

javascript - mustache 条件语句(if/else)不起作用

javascript - 使用 Javascript 和 REST 登录

javascript - 如何使用 Puppeteer 选择具有同一类的所有子 div?

node.js - headless false - 始终关注地址栏

node.js - 表单提交后如何使用 PUPPETEER 下载 PDF 文件? NodeJS | puppeteer 师