javascript - 如何在 Puppeteer 中单击并按住

标签 javascript node.js automation puppeteer

我正在尝试使用 Puppeteer 单击并按住。我尝试使用 page.click里面while循环,但没有用。

let browserURL = `http://127.0.0.1:9222`;

let browser = await puppeteer.connect({ browserURL, defaultViewport: null });

const page = await browser.newPage();
while (pageContent.includes("hold")) {
  await page.click("div")
}
我也试过这个:
await page.mouse.click(132, 103, { button: 'left' })
任何想法如何做到这一点?

最佳答案

在 Puppeteer 中有一些工具可以触发鼠标保持: page.click , mouse.click , mouse.down mouse.up . page.hover 可用于将鼠标定位在选择器和 mouse.move 上可用于基于坐标的定位和实现单击和拖动。
然后,还有 page.evaluate (和系列),它允许您将浏览器代码运行到 trigger native mousedown and mouseup events在目标元素上。如果您在使用 Puppeteer 功能时难以单击(例如,由于 visibility issues ),evaluate是一个不错的下一个尝试选择。
您选择哪种方法取决于您的用例。如果您使用 .click()调用(这些是 page.hovermouse.move()mouse.down()mouse.up() 上的便利包装器),您需要设置 delay选项对象上的属性来模拟保持,文档描述为

delay <number> Time to wait between mousedown and mouseup in milliseconds. Defaults to 0.


这是以下按钮的概念证明:

const hms = () => ("" + Date()).slice(16, 24);
const btnEl = document.querySelector("button");
btnEl.addEventListener("mousedown", e => {
  document.querySelector("ul").innerHTML +=
    `<li>mousedown at ${hms()}</li>`
  ;
});
btnEl.addEventListener("mouseup", e => {
  document.querySelector("ul").innerHTML +=
    `<li>mouseup at ${hms()}</li>`
  ;
});
<button>click and hold me</button>
<ul></ul>

const puppeteer = require("puppeteer");

let browser;
(async () => {
  const html = `
    <button>click and hold me</button>
    <ul></ul>
    <script>
      const hms = () => ("" + Date()).slice(16, 24);
      const btnEl = document.querySelector("button");
      btnEl.addEventListener("mousedown", e => {
        document.querySelector("ul").innerHTML +=
          \`<li>mousedown at \${hms()}</li>\`
        ;
      });
      btnEl.addEventListener("mouseup", e => {
        document.querySelector("ul").innerHTML +=
          \`<li>mouseup at \${hms()}</li>\`
        ;
      });
    </script>
  `;
  browser = await puppeteer.launch({headless: false});
  const [page] = await browser.pages();
  await page.setContent(html);
  await page.click("button", {delay: 5000});
  await page.waitForFunction(() => 
    document.querySelector("ul").innerText.includes("mouseup")
  );
  console.log(await page.$eval("ul", el => el.innerText));
})()
  .catch(err => console.error(err))
  .finally(async () => await browser.close())
;
输出是这样的
mousedown at 12:53:23
mouseup   at 12:53:28
这表明鼠标在按钮上按住了 5 秒钟。

关于javascript - 如何在 Puppeteer 中单击并按住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68511327/

相关文章:

javascript - Angularjs +指令文件html内容点击事件在js文件中不起作用

javascript - 未捕获的语法错误 : Unexpected identifier in empty line?

java - 并行测试执行 Jenkins

html - 在 Netbeans 中插入元素的快捷方式

javascript - 如何构建用于计数的递归流

javascript - Highcharts yAxis 标题点击

javascript - 如何为 Node.js 创建模块?

node.js - AWS Lambda 容器销毁事件

node.js - 如何在node.js中构建特定查询以从mongodb获取数据?

com - 如何把IE9的WebBrowser控件纳入标准?