javascript - Puppeteer 在页面中查找数组元素,然后单击
问题描述
您好,我有一个 url 由 javascript 呈现的网站。我想在我的网站中找到所有脚本标签,然后是数学脚本 src 并只返回有效的标签。接下来找到脚本的父级,最后单击链接。这就是我所拥有的:
const scripts = await page.$$('script').then(scripts => {
return scripts.map(script => {
if(script.src.indexOf('aaa')>0){
return script
}
});
});
scripts.forEach(script => {
let link = script.parentElement.querySelector('a');
link.click();
});
我的问题是我的 script.src 未定义。当我删除该条件时,我移至 forEach 循环,但我得到 querySelector 未定义。我可以在调试模式控制台内的 js 中编写该代码,但我无法将其移动到 Puppeteer API。
从控制台我得到了预期的结果
let scripts = document.querySelectorAll('script');
scripts.forEach(script=>{
let el = script.parentElement.querySelector('a');
console.log(el)
})
解决方案
当你使用$$
or$
时,它会返回一个 JSHandle,它与你在querySelector
里面运行时返回的 HTML Node 或 NodeList 不同evaluate
。所以script.src
总是会返回未定义的。
您可以改用以下内容,$$eval
将评估选择器并为您映射节点列表/节点数组。
page.$$eval('script', script => {
const valid = script.getAttribute('src').indexOf('aaa') > 0 // do some checks
const link = valid && script.parentElement.querySelector('a') // return the nearby anchor element if the check passed;
if (link) link.click(); // click if it exists
})
还有其他方法可以实现这一点,但我将它们合并为一个。即,如果它适用于浏览器,那么您也可以使用.evaluate
并运行确切的代码并获得确切的预期结果。
page.evaluate(() => {
let scripts = document.querySelectorAll('script');
scripts.forEach(script => {
let el = script.parentElement.querySelector('a');
console.log(el) // it won't show on your node console, but on your actual browser when it is running;
el.click();
})
})
推荐阅读
- r - 数据框聚合并保留字符列
- mysql - 列前缀从某处添加到列
- dataframe - 如何在python中运行和查看概率回归
- javascript - 在 console.log 的最后一行打印额外的空间
- assembly - 在 rax 而不是 rdi 中组装 x64 函数参数
- kdb - 在 DolphinDB 数据库中重写 kdb 脚本
- c# - 尝试在空对象引用 Xamarin LockScreen 上调用虚拟方法
- go - Go中的问题是附加到[]字节,写入文件并读取它
- android-studio - Android Studio 不断为我的项目禁用 Dart 支持
- mysql - Spring Repository 中的自定义查询