如何在puppeteer中处理ajax请求后加载的元素



我正在尝试使用puppeteer进行网页抓取。我最近需要处理负载的元素。当我点击搜索按钮时,结果加载在AJAX中,我需要选择我试图选择的元素。它在搜索结果中,但不在页面的初始加载中。它正在生成的页面截图也包含搜索结果,如果它输出HTML源代码,我也可以在那里看到元素。但不确定为什么我不能选择它。

您可以使用await page.waitForSelector(cssSelector);要求Puppeter等待任何元素显示在UI中,然后再继续执行脚本中的进一步步骤。默认情况下,等待的超时时间为30秒,但您可以将其设置为任何您想要的超时时间。

所以在你的情况下,我会:

  • 在搜索栏中输入搜索文本
  • 单击搜索按钮(这将执行AJAX调用来加载结果(
  • 使用await page.waitForSelector(cssSelector);让Puppeteer等待,直到您确信执行搜索后会在UI中显示的某个元素可见为止
  • 既然Puppeter已经将元素注册为可见,那么您就知道您希望对其执行的任何操作也将正确执行

如果您不使用waitForSelector()调用,您可能会发现元素会被显示,但Puppeter会超时,例如,如果您希望对元素执行click命令。这是因为click事件(以及与元素交互的其他Puppeteer事件(的超时时间非常短,有时脚本(尤其是在无头模式下(可能会过快地移动到下一条指令,从而使UI更新得足够快。

因此,通过添加额外的waitForSelector调用,您还可以使脚本更加健壮。尤其是当数据是动态生成的,就像您的情况一样。

最新更新