javascript - 在 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);
}
解决方案
页面评估不是问题,它可以 100% 用作开发工具。问题很可能是等待选择器没有完成正确的工作,并且在继续之前没有等待元素正确加载。尝试通过添加一些睡眠而不是等待选择器来进行调试,以确认这是问题所在。
推荐阅读
- mqtt - 是否可以在同一 ESP8266 上运行 MQTT 代理和客户端
- python - conda环境激活报错:“系统找不到指定的路径。” (窗户 10)
- java - spring 如何从应用程序上下文中获取 BeanFactory
- android - 仅为一个 ConstraintLayout 链视图设置最大高度
- reactjs - 无法读取未定义的属性 .match(AWS Amplify 构建错误)
- android - 将flutter模块添加到由flutter制作的应用程序中
- batch-file - WMIC 卸载 Roblox
- android - 将字符串转换为 PrivateKey 不会在 android 中给出相同的密钥
- javascript - Shopify 语言选择器上的外部链接
- shell - 使用 YML 管道中的 shell 脚本更改 Jenkins 中的目录