javascript - 评估失败 : TypeError: Cannot read properties of null (reading 'firstElementChild' )

标签 javascript node.js ubuntu puppeteer

我正在尝试触发单击事件,但在 Ubuntu 服务器中它不起作用。

....
  await page.evaluate(() => {
    document.querySelector(".phone").firstElementChild.click();
  });
 .....
enter image description here

最佳答案

如果 DOM 中不存在元素( Document Object Model ),则评估失败。 TypeError: Cannot read properties of null (reading '...')是这种情况下的一般错误,我可以推荐this StackOverflow question/answer关于这个话题。
(1) 由于您的脚本仅在本地工作,您需要找出在本地打开的抓取页面与在服务器上打开的抓取页面有什么区别的原因:

  • 为什么带有 .phone 的元素类不渲染到 DOM?
  • 你是公认的刮刀吗?
  • 你会立即得到验证码吗?
  • 抓取的页面在 Ubuntu 服务器和本地计算机上看起来是否不同(很少见,但页面可以基于 User-Agent 有不同的内容)?

  • 为此,您可以:
  • 记录页面的 HTML 源代码 ( console.log(await page.content()) )
  • 以 Base64 格式保存页面截图:

  • await page.screenshot({ path: __dirname + '/screen.png' })
    const screenBase64 = fs.readFileSync(__dirname + '/screen.png', 'base64')
    console.log('data:image/png;base64, ' + screenBase64)
    
    您需要自己找到答案,解决方案应该解决这个问题。

    (2) 如果您的脚本即使在本地也会抛出相同的错误,它会告诉您尝试评估 .phone在它被渲染到 DOM 之前为时过早。这可以通过等待元素来处理:
    await page.waitForSelector('.phone')
    await page.evaluate(() => {
      document.querySelector('.phone').firstElementChild.click()
    })
    

    关于javascript - 评估失败 : TypeError: Cannot read properties of null (reading 'firstElementChild' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71779657/

    相关文章:

    javascript - 使用 Q.promises : how to catch an async throw?

    javascript - 从表单内部获取 javascript 函数的返回值

    node.js - 我的应用程序在 heroku 免费包中可以存活多久?

    node.js - React Native Ios 错误 - ENOENT : no such file or directory, uv_cwd (null))

    ubuntu - 在 Ubuntu+Nginx+Tomcat 中部署 Geoserver 的问题

    ubuntu - Vagrant guest 机器进入无效状态

    javascript - Gremlin 暂停响应写入,因为 RequestMessage 超出了 writeBufferHighWaterMark

    javascript - RxJS - 等待 5 个事件发生后再继续

    javascript - Sequelize 和嵌套结果?

    java - 在 ubuntu 中检查 java 版本时权限被拒绝