首页 > 解决方案 > 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”

感谢您的任何建议!

标签: node.jspuppeteer

解决方案


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

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

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

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

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

解决这个问题的方法

首先,您需要弄清楚为什么木偶操作者找不到该元素。

  • 也许div.user-tags不应该出现在每一页上?
  • 也许是树莓派不够强大,无法在 30 秒内加载和处理目标页面?- 可以增加超时
  • 您也可以等到页面完全加载,这样 puppeteer 将确保在继续执行脚本之前加载所有资源:
await page.goto(url, { waitUntil: 'networkidle0' })

推荐阅读