javascript - 使用 puppeteer 遍历列表并单击按钮

标签 javascript node.js puppeteer

我正在尝试使用 puppeteer 来:

  • ul 列表中创建一个数组
  • 遍历列表并点击一个按钮。
  • 每次单击按钮都会打开一个模式。在模式中,必须单击另一个按钮。
  • 在继续之前延迟下一个循环。

我已尝试使用 page.evaluate 以多种方式执行此操作,但我的数组似乎始终为空。有人可以告诉我我在这里做错了什么吗。

<ul>
  <li><button>Connect</button></li>
  <li><button>Wait</button></li>
  <li><button>Connect</button></li>
  <li><button>Connect</button></li>
</ul>

路径:puppeteer.js

const buttons = await page.evaluate(() =>
  Array.from(document.querySelectorAll("ul > li button"))
);

for (let button of buttons) {
  if (button.innerText === "Connect") {
    button.click();
    document
      .querySelector(
        "div.artdeco-modal"
      )
      .click();
  }
}

最佳答案

page.evaluate不能返回 DOM Node ,因为它只能返回可序列化的数据。这是可以包装 JSON.stringify 以将其从浏览器环境传输到 Node.js

的数据

相反,您需要使用 page.$$获取 DOM 元素列表。由于您也只是在寻找带有特定文本的按钮,因此我建议使用 page.$x它运行 XPath 查询,还可以根据按钮的文本进行过滤。

代码示例

const buttons = await page.$x("//ul/li//button[contains(text(), 'Connect')]");
for (let button of buttons) {
    await button.click();
    const modal = await page.$('div.artdeco-modal');
    await model.click();
}

上面的代码,首先查询页面上所有带有“Connect”文本的按钮并遍历它们。它单击每个按钮,并在每次单击后查询模型对话框并单击它。

关于javascript - 使用 puppeteer 遍历列表并单击按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57966508/

相关文章:

node.js - 无法让 Puppeteer 工作和安装

javascript - 如何在任何测试失败时运行函数 - Jest

javascript - 为什么通过 javascript 更改事件的字体大小需要关闭?

javascript - 对象没有方法 'setupState'

node.js - 在 Windows 10(64 位)上使用 virtualbox 5.2.8 在 ubuntu 16.04 LTS 中执行 "npm install"命令时出错

javascript - i18next 在 jquery 中不起作用

javascript - 用于更改 backgroundPosition 的动态变量

Javascript 和 Firefox - 检测 window.open 是否在选项卡中打开?

c# - 以编程方式从命令提示符启动 Node js 脚本

javascript - 如何将数组和函数传递给 Page.evaluate