node.js - 等到 page.click 返回 true
问题描述
我正在抓取一个网站weather.com,我想点击一个 html 元素来获取数据并显示它,然后我抓取该数据。
但它并不总是对我有用,大多数时候点击不会发生,我在尝试抓取这些元素时遇到错误
await page.waitFor('#twc-scrollabe > table > tbody > tr:nth-child(1)')
await page.click('#twc-scrollabe > table > tbody > tr:nth-child(1)')
我应该怎么做才能确保点击发生?
解决方案
尝试指定您希望元素可见
await page.waitFor('#twc-scrollabe > table > tbody > tr:nth-child(1)', { visible:true })
(你注意到这个{visible:true}
选项了吗?)
因为该元素可能在页面中,但在waitFor
找到它时不可点击。
更多细节
等待一个元素出现在 DOM 中并且可见,即没有
display: none
或visibility: hidden
CSS 属性。默认为false
.
最后但同样重要的是:@FeliFong 向您询问了有关您的问题的更多信息,因为您没有提供足够的信息。你可以
- 指定您要从中获取的页面(如果它是公开的)
- 否则,您可以创建一个 GitHub 存储库,从您的项目中删除所有内容,只留下您正在谈论的表格和 Puppeteer 脚本
- 通常,当您进行回购时,您会自己发现问题(发生了很多次)
- 如果您自己制作 repo 时不解决问题……没关系,我们就是为此而存在的,但是下载 repo、启动它、解决问题、向您发出拉取请求要容易得多然后回到这里给你一些解释。
它对我们很有用,但主要是对你有用,因为我试图回复你......但我不知道我提供的解决方案是否适合你的需求......如果我有机会通过你的回购检查它,我会确定我已经解决了问题
[更新] 我在你提供给我的存储库上解决了这个问题,在 GitHub 上接受我的 PR。
我做了什么:我做了一些测试,但我不知道那个网站上的 Puppeteer 到底是什么“阻止”(或者,更好的是,停止等待)......但没关系,这是我的代码
let i = 0;
let found = false;
const maxRetries = 100;
do {
// waits for the element we need to click
await page.waitForSelector('#twc-scrollabe > table > tbody > tr:nth-child(1)')
// clicks it
await page.click('#twc-scrollabe > table > tbody > tr:nth-child(1)')
try {
// waits for the content we need
await page.waitForSelector('tr:nth-child(3) > td.sunrise > div > span:nth-child(2)', {timeout:1000});
// if the content won't be showed the code doesn't go on and the next line won't be reached
found = true;
} catch(e) {}
} while(!found || i > maxRetries) // the maxRetries variable is mere prudence
- 等待我们需要点击的元素
- 点击它
- 等待显示详细内容(超时1000毫秒)
- 如果它不会显示,只需重试(最多 100 次)
- 然后在第一次单击后继续,您的脚本会快速进行
推荐阅读
- garbage-collection - GCT(总垃圾回收时间)的定义
- microsoft-teams - 我的问题会出现在 Microsoft Teams 堆栈溢出连接器中吗?
- python - 在主循环外广播加速了矢量化的 numpy 操作?
- r - 如何根据上传的文件数量制作动态标签面板并在标签内呈现复杂的表格
- autodesk-forge - Forge 查看器模型 revit 位置
- gemfire - 更改 GemFire 查询 ResultSender 批量大小
- excel - 如何更改连接对象
- vba - 如何使用转换为 VBS 的 VBA 代码清除 MS Office 剪贴板
- python - 使用 format 方法打印一个整洁的乘法表
- javascript - 异步等待调用后反应状态不更新