node.js - 单击页面 puppeteer 中的每个“a”标签
问题描述
我试图让 puppeteer 转到页面中的所有标签并加载它们,将它们添加到数组中并返回它。我的 puppeteer 版本是 1.5.0。这是我的代码:
module.exports.scrapeLinks = async (page, linkXpath) => {
page.waitForNavigation();
linksElement = await page.$x(linkXpath);
var url_list_arr = [];
console.log(linksElement.length);
i=1;
for(linksElementItem in linksElement)
{
const linksData = await page.$x('(' + linkXpath + ')[' + (i + 1) +']');
if (linksData.length > 0) {
linksData[0].click();
console.log(page.url());
url_list_arr.push(page.url());
}
else {
throw new Error('Link not found');
}
}
return url_list_arr;
};
但是,使用此代码,我得到了
UnhandledPromiseRejectionWarning:错误:节点不可见或不是 HTMLElement
我还通过文档发现无法在 page.click 函数上使用 xpath。有没有办法做到这一点?
如果有从页面获取所有链接的功能也可以,但我在文档中找不到它。
解决方案
要获取a
数组中所有 -tags 的句柄:
const aTags= await page.$$('a')
通过它们循环:
for (const aTag of aTags) {...}
在循环内部,您可以elementHandle
分别与其中的每一个进行交互。
注意
await aTag.click()
elementHandles
导航页面上下文时将全部销毁(垃圾收集) 。在这种情况下,您需要一种解决方法,例如在循环中加载初始页面以始终从新实例开始。
推荐阅读
- reactjs - 是否可以在formik的密码字段上显示大写锁定指示器?
- c# - C# 客户端应用程序中的命令按钮未显示下划线快捷方式
- android-databinding - 数据绑定通用变量和 livedata
- php - 使用PHPExcel导出为excel后无法打开文件
- python - 如何在 Python 中杀死由 subprocess.Popen 运行的子进程(附代码)
- firebase - 如何使用下载 url 删除具有云功能的图像?
- rest - 邮递员“自签名 SSL 证书被阻止”
- c# - 如何通过脚本切片精灵?(不使用编辑器)
- f# - 此表达式应为 bool 类型,但此处有类型单元错误
- mysql - Docker 构建失败