如何修复,错误:无法使用 puppeteer 读取 null 的 属性 'contentFrame'

How to fix , Bug: Cannot read property 'contentFrame' of null using puppeteer

我在请求我实施的 api 时遇到错误。一旦我使用了其中一个端点,它就会向我显示以下错误,如下所示。

将无法控制该错误。?

错误信息:

TypeError: Cannot read property 'contentFrame' of null
    at Object.getAnimeVideo (C:\Users\c\Desktop\ryuanime\src\api\scraper.ts:89:37)
    at process._tickCallback (internal/process/next_tick.js:68:7)

代码:

const getAnimeVideo = async (id: string, chapter: number) => {
  const BASE_URL = `${url}${id}/${chapter}/`;
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(BASE_URL);
  const elementHandle = await page.$('.player_conte');
  const frame = await elementHandle.contentFrame(); //line 89 error
  const video = await frame.$eval('#jkvideo_html5_api', el =>
    Array.from(el.getElementsByTagName('source')).map(e => e.getAttribute("src")));
  await browser.close();
  return video;
}

问题

elementHandlenull。这就是为什么您会收到 null 上没有函数 contentFrame 的错误。当找不到选择器时,page.$null

解决方案

要解决这个问题,你可以做两件事:

  • 选择器真的是您要找的选择器吗?它可能在框架内而不是在页面本身上,或者可能拼写错误?
  • 当您的脚本是 运行 时,也许该元素不存在?也许页面异步加载更多数据并更改 DOM?在这种情况下,您可以像这样使用 page.waitForSelector 来等待元素出现:

    const elementHandle = await page.waitForSelector('.player_conte');