使用操纵up循环显示列表,然后单击一个按钮

时间:2019-09-17 02:15:18

标签: 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();
  }
}

1 个答案:

答案 0 :(得分:1)

page.evaluate无法返回DOM节点,因为它只能返回可序列化的数据。这是可以包装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”的所有按钮,并对其进行迭代。它单击每个按钮,并在每次单击后查询模型对话框,然后单击它。