我正在尝试使用 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/