You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Puppeteer Sharp调用dumpSkills()返回空数组问题求助

Puppeteer Sharp调用dumpSkills()返回空数组/对象的问题排查

可能的原因及解决方法:

  1. 页面未完全加载就执行脚本
    GrimTools的技能数据是动态渲染的,若在页面资源未加载完成时调用dumpSkills(),大概率返回空结果。
  • 解决:等待页面进入网络空闲状态,或等待技能相关元素加载完成:
// 等待网络空闲(所有请求完成后2秒内无新请求)
await page.WaitForNavigationAsync(new NavigationOptions { WaitUntil = new[] { WaitUntilNavigation.Networkidle2 } });
// 或者等待技能面板核心元素出现
await page.WaitForSelectorAsync(".skill-container");
  1. 对象序列化限制
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 17:56:05