node.js - ubuntu 上 Raspberry PI 上的 Puppeteer 有时会给出“评估失败:TypeError:无法读取 null 的属性 'textContent'”
问题描述
此代码每次都在本地正确运行。但是,当我部署到服务器(使用 chromium-browser 在 Raspberry Pi 上的 ubuntu)时,有时会在 3/10 次尝试左右出现错误。此代码效果最好...
await page.goto('http://mywebsite.com')
const element = await page.$('div[class="user-tags"]')
const value = await page.evaluate(el => el.textContent, element)
但有时会返回...“错误获取经验级别错误:评估失败:TypeError:无法读取属性'textContent' of null”
所以我四处寻找解决方案并尝试了这个,但每次都失败(两个代码块都在本地运行良好)......
await page.goto('http://mywebsite.com')
await page.waitForSelector('div[class="user-tags"]')
const element = await page.$('div[class="user-tags"]')
const value = await page.evaluate(el => el.textContent, element)
抛出“错误获取体验级别 TimeoutError:等待选择器“div [class =“user-tags”]”失败:超时 30000 毫秒超过 9/10/2020 @ 06:02:35”
感谢您的任何建议!
解决方案
第一个和第二个代码片段之间的区别
在第二个代码示例中,您指示 puppeteer 等到div[class="user-tags"]
目标页面上存在:
await page.waitForSelector('div[class="user-tags"]')
这是从元素中获取数据的正确方法——首先确保它可用,然后查询它。
发生超时错误是因为在 30 秒内未找到给定元素(这是默认超时)。
解决这个问题的方法
首先,您需要弄清楚为什么木偶操作者找不到该元素。
- 也许
div.user-tags
不应该出现在每一页上? - 也许是树莓派不够强大,无法在 30 秒内加载和处理目标页面?- 可以增加超时。
- 您也可以等到页面完全加载,这样 puppeteer 将确保在继续执行脚本之前加载所有资源:
await page.goto(url, { waitUntil: 'networkidle0' })
推荐阅读
- c# - 如何从 LINQ to Entities 查询流式传输数据?
- node.js - 在 map() 中使用 axios 获取 api 的问题
- c# - ViewModel 未从 ActivateItem() 激活
- typescript - 返回 package.json 依赖项的各个值
- python - 对于 ws.rows[1:] 中的行:TypeError:“生成器”对象不可下标
- mysql - 从 sql 获取畅销产品
- ruby-on-rails - 为什么当 pgadmin 返回我期望的所有内容时,我只能从 Rails 中的 psql 查询中得到一个结果?
- sql - 在 CASE 语句中使用先前计算的值
- ios - 尝试从后台恢复时触发带有 AVAudioSessionInterruptionWasSuspendedKey 的 AVAudioSessionInterruptionNotification
- wordpress - 帖子 ID 链接结构不适用于自定义帖子类型