C# 如何从Puppeter sharp中获取可读的浏览器/页面错误?

C# 如何从Puppeter sharp中获取可读的浏览器/页面错误?,c#,error-handling,puppeteer,puppeteer-sharp,C#,Error Handling,Puppeteer,Puppeteer Sharp,我正在使用Puppeter sharp将一些页面渲染为PDF。我想知道页面在运行时在浏览器中呈现时是否存在任何问题,因此我设置了一些事件处理程序: _page.Error += (sender, args) => { _logger.LogCritical(args.Error); }; _page.PageError += (sender, args) => { _logger.LogError(args.Message); }; _page.Console +

我正在使用Puppeter sharp将一些页面渲染为PDF。我想知道页面在运行时在浏览器中呈现时是否存在任何问题,因此我设置了一些事件处理程序:

_page.Error += (sender, args) =>
{
    _logger.LogCritical(args.Error);
};

_page.PageError += (sender, args) =>
{
    _logger.LogError(args.Message);
};

_page.Console += (sender, args) =>
{
    switch (args.Message.Type)
    {
        case ConsoleType.Error:
            _logger.LogError(args.Message.Text);
            break;
        case ConsoleType.Warning:
            _logger.LogWarning(args.Message.Text);
            break;
        default:
            _logger.LogInformation(args.Message.Text);
            break;
    }
};
当我在页面上遇到错误时,
args.Message.Text
似乎只包含
“错误JSHandle@error“
。这不是很有帮助

我在页面上测试了正常的
console.log
,结果很好,似乎是有错误的问题

我需要做些什么才能从这些错误中获得可读性

更新:我尝试访问
args.Message.args
并在这些args上使用
JsonValueAsync()
,但这似乎导致了一些异步异常,破坏了devtools协议,因为我开始收到超时错误,然后错误抱怨web套接字被破坏


这似乎是Puppeter本身的一个问题:

所以我的问题发生了,因为错误显然不能在javascript中序列化,所以我们需要让浏览器运行一个函数,从错误中提取消息和我们需要的任何其他详细信息,并返回该信息

这就是我现在的工作:

_page.Console += async (sender, args) =>
{
    switch (args.Message.Type)
    {
        case ConsoleType.Error:
            try
            {
                var errorArgs = await Task.WhenAll(args.Message.Args.Select(arg => arg.ExecutionContext.EvaluateFunctionAsync("(arg) => arg instanceof Error ? arg.message : arg", arg)));
                _logger.LogError($"{args.Message.Text} args: [{string.Join<object>(", ", errorArgs)}]");
            }
            catch { }
            break;
        case ConsoleType.Warning:
            _logger.LogWarning(args.Message.Text);
            break;
        default:
            _logger.LogInformation(args.Message.Text);
            break;
    }
};
page.on('console', async msg => {
  // serialize my args the way I want
  const args = await Promise.all(msg.args.map(arg => arg.executionContext().evaluate(arg => {
    // I'm in a page context now. If my arg is an error - get me its message.
    if (arg instanceof Error)
      return arg.message;
    // return arg right away. since we use `executionContext.evaluate`, it'll return JSON value of
    // the argument if possible, or `undefined` if it fails to stringify it.
    return arg;
  }, arg)));
  console.log(...args);
});