ubuntu上Raspberry PI上的Puppeteer有时显示“评估失败:TypeError:无法读取null的属性'textContent'”

时间:2020-09-10 15:32:32

标签: node.js puppeteer

此代码每次都在本地正确运行。但是,当我部署到服务器时(使用铬浏览器的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:无法读取null的'textContent'属性”

所以我四处寻找解决方案并尝试了此方法,但是每次都失败(两个代码块都在本地运行良好)...

 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)

抛出“获取体验级别超时错误:等待选择器“ div [class =” user-tags“]”失败:超时30000ms超过9/10/2020 @ 06:02:35“

谢谢您的建议!

1 个答案:

答案 0 :(得分:1)

第一和第二代码段之间的区别

在第二个代码示例中,您指示伪装者等到目标页面上的div[class="user-tags"]存在:

await page.waitForSelector('div[class="user-tags"]')

这是从元素获取数据的正确方法-首先确保数据可用,然后查询。

发生超时错误是因为在30秒内找不到给定的元素(这是默认超时)。

解决此问题的方法

首先,您需要弄清楚伪造者为何找不到该元素。

  • 也许不是div.user-tags出现在每个页面上?
  • 也许Raspberry Pi的功能不足以在30秒内加载和处理目标页面? -可以increase the timeout
  • 您也可以等到页面完全加载为止,通过这种方式,puppeteer将确保所有资源都已加载,然后继续执行脚本:
await page.goto(url, { waitUntil: 'networkidle0' })