javascript - 使用 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 节点,因为它只能返回可序列化的数据。这是可以包装的数据,JSON.stringify
以将其从浏览器环境传输到 Node.js
相反,您需要使用page.$$
来获取 DOM 元素的列表。由于您也只是在寻找具有特定文本的按钮,因此我建议使用page.$x
which 运行 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”文本的按钮并遍历它们。它单击每个按钮,并在每次单击后查询模型对话框并单击它。
推荐阅读
- azure - 使用天蓝色密钥进入天蓝色服务器?
- scss-mixins - 在 scss 文件中使用 mixin
- power-automate - 按组织者过滤日历事件查询
- forms - TYPO3 Extbase createAction - 如何使用 f:form 创建新的 IRRE 关系?
- android - 如何反编译luajit二进制字节码?
- python - 需要身份验证令牌时从 Python 发送 Exchange 电子邮件的最佳方式
- python - 默认为特定 python 包的依赖项急切升级(pip)?
- javascript - 带有 PHP 和 JS/jQuery 的下载管理器
- javascript - 为什么值匹配时文本显示不正确
- python - 如何每次使用不同的代理运行带有 selenium 的 python 脚本