使用Puppeteer Sharp调用dumpSkills()返回空数组问题求助
Puppeteer Sharp调用dumpSkills()返回空数组/对象的问题排查
可能的原因及解决方法:
- 页面未完全加载就执行脚本
GrimTools的技能数据是动态渲染的,若在页面资源未加载完成时调用dumpSkills(),大概率返回空结果。
- 解决:等待页面进入网络空闲状态,或等待技能相关元素加载完成:
// 等待网络空闲(所有请求完成后2秒内无新请求) await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle2 } }); // 或者等待技能面板核心元素出现 await page.WaitForSelectorAsync(".skill-container");
- 对象序列化限制
dumpSkills()返回的对象可能包含循环引用、不可枚举属性或浏览器特定内置对象,Puppeteer Sharp无法直接序列化这类内容,导致返回空数组/对象。
- 解决:在执行脚本时手动提取所需属性,或通过JSON序列化/解析规避限制:
// 方式1:精准提取目标属性(推荐,减少数据传输量) var skills = await page.EvaluateFunctionAsync(@"() => { return dumpSkills().map(skill => ({ name: skill.name, level: skill.level, points: skill.points, masteryName: skill.mastery.name })); }"); // 方式2:通过JSON转换处理复杂对象 var skills = await page.EvaluateFunctionAsync(@"() => { const rawSkills = dumpSkills(); return JSON.parse(JSON.stringify(rawSkills)); }");
完整示例代码
using PuppeteerSharp; using System.Collections.Generic; class GrimToolsScraper { static async Task Main(string[] args) { await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision); using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = false }); using var page = await browser.NewPageAsync(); await page.GoToAsync("https://www.grimtools.com/calc/Q2z07a9Z"); // 等待页面加载完成 await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle2 } }); // 获取处理后的技能数据(强类型接收) var skills = await page.EvaluateFunctionAsync<IEnumerable<Skill>>(@"() => { return dumpSkills().map(s => ({ Name: s.name, Level: s.level, PointsInvested: s.points, Mastery: s.mastery.name })); }"); // 输出结果 foreach (var skill in skills) { Console.WriteLine($"{skill.Mastery} - {skill.Name}: Level {skill.Level} ({skill.PointsInvested} points)"); } } } // 定义对应的数据类(用于强类型接收,可选) public class Skill { public string Name { get; set; } public int Level { get; set; } public int PointsInvested { get; set; } public string Mastery { get; set; } }
内容的提问来源于stack exchange,提问作者WyreZ
相关产品推荐
相关产品推荐

