首页 > 解决方案 > 在 DevTools 上工作但在 page.evaluate() 内不工作的代码

问题描述

我对 javascript 和 Puppeteer 也很陌生。

我正在尝试从论坛内的一系列网页中获取一些 innerHTML。页面的 URL 遵循具有前缀和结尾的“/page-N”的模式,N 是页码。

因此,我决定使用 for 循环和模板文字遍历页面,以在每个循环上加载新的页面 URL,直到达到最终的页面数,包含在变量 C.numberOfPages 中。

问题是:page.evaluate() 函数中的代码不起作用,当我运行我的代码时,我得到 TypeError:无法读取未定义的属性。我已经检查过,问题的根源是 document.getElementById('discussion_subentries') 返回未定义。

我已经测试了 Chrome 开发工具中 page.evaluate() 函数内部的相同代码,它工作正常,返回了我想要的 innerHTML。由于我正在抓取的页面的结构,所有这些 .children[] 连接都是必要的,并且它们在浏览器上运行良好,返回正确的值。

那么如何让它在我的 Puppeteer 脚本中工作呢?

for (let i = 1; i <= C.numberOfPages; i++) {
      let URL = `${C.url}page-${i}`;
      await page.goto(URL);
      await page.waitForSelector('#discussion_subentries');

      let pageData = await page.evaluate(() => {
        let discussionEntries = document.getElementById('discussion_subentries')
          .children[1];

        let discussionEntryMessages = [];
        for (let j = 0; j < discussionEntries.childElementCount; j++) {
          let thisEntryMessage =
            discussionEntries.children[j].children[0].children[1].children[1]
              .children[1].innerHTML;
          discussionEntryMessages.push(thisEntryMessage);
        }

        return discussionEntryMessages;
      });

      entryData.discussionEntryMessages.push(pageData);
    }

标签: javascriptnode.jspuppeteer

解决方案


页面评估不是问题,它可以 100% 用作开发工具。问题很可能是等待选择器没有完成正确的工作,并且在继续之前没有等待元素正确加载。尝试通过添加一些睡眠而不是等待选择器来进行调试,以确认这是问题所在。


推荐阅读