如何从 puppeteer-sharp 中获取可读的浏览器/页面错误?

2024-06-28

我正在使用 puppeteer-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似乎只包含"ERROR JSHandle@error"。这不是很有帮助。

我测试正常console.log在页面上并且日志正常,这似乎是一个错误问题。

我需要做些什么才能从这些错误中获得可读的内容吗?

更新:我尝试访问args.Message.Args并使用JsonValueAsync()在这些参数上,但这似乎会导致一些异步怪异现象,从而破坏了 devtools 协议,因为我开始收到超时错误,然后出现抱怨 Web 套接字被破坏的错误。

看来这是 puppeteer 本身的问题:https://github.com/GoogleChrome/puppeteer/issues/3397 https://github.com/GoogleChrome/puppeteer/issues/3397


所以我的问题发生了,因为错误在 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;
    }
};

我从一位木偶贡献者的评论中得到了这个想法here https://github.com/GoogleChrome/puppeteer/issues/3397#issuecomment-434970058并将其移植到 puppeteer-sharp。

atm 的操作方式应该是这样的:

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);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 puppeteer-sharp 中获取可读的浏览器/页面错误? 的相关文章

随机推荐

  • 创建视图中可用的自定义助手

    我有太多文本实用方法 例如MakeShortText string text int length RemoveTags string text TimeAgo DateTime date 和别的 我想从单独的助手访问它们 如下一个示例所示
  • Visual Studio Code - 基于 .gitignore 自动排除

    我希望 VSCode 根据我的情况自动排除文件 文件夹 gitignore配置 对于资源管理器排除 我找到了一个扩展 explorer excluded files它管理着files exclude设置 但对于快速打开文件 cmd p 我什
  • GitHub 的 README 支持哪些文件类型

    我注意到 GitHub README 使用了许多不同的文件类型 最常见的是 md and rst 查看 GitHub 文档和帮助页面后 我没有找到有关允许哪些文件类型的信息 我只是在寻找类型列表 以便我可以找出可以在下一个自述文件中使用哪些
  • AngularJS 与 Apache Tiles

    我在我的项目中使用 Spring MVC 和 AngularJS AngularJs 可以吗 routing和 ngView 被用来代替or与阿帕奇瓷砖框架 据我所知 使用 routing 和 ngView 我们创建模板并在单页应用程序中重
  • 使用 CSS2 将

    有没有一个好的跨浏览器解决方案来拆分单个 ul 分成两列 或者最好的方法仍然是使用两个相邻浮动的单独列表 我正在寻找单一的解决方案 因此如果需要替代 HTML 来支持旧版浏览器 则不允许使用 CSS3 优点 要求浏览器支持IE7 FF3 我
  • Elasticsearch 主分片不平衡

    我注意到我的 elasitcsearch 集群中有一个奇怪的行为 正如您在下面的屏幕截图中看到的 它显示了 kopf 插件 大多数主分片位于 nl 1 服务器上 我认为 elasitcsearch 在所有服务器上均匀地平衡了主分片 我错了吗
  • 如何反转 TextView 选取框的方向

    我想反转 TextView 中选取框的方向 默认情况下 文本从右向左移动 我希望它从左向右移动 我怎样才能做到这一点 我想出了一个非常简单易行的方法来做到这一点 我制作了一个选框效果 根据我们的选择向两个方向移动 所以 这里有一个技巧 我在
  • 在一项服务中引用多个 API 调用 (Angular)

    我正在通过 Angular http 请求访问 API 以收集不同足球队的信息 如果我只访问一个团队 那就没问题了 我将创建一个进行调用的服务 然后在我的控制器中引用该服务函数 但是 我希望在多个团队中执行此操作 而不必为每个团队创建单独的
  • 有没有办法调用需要 IEnumerable 且具有单个值的 C# 方法? ...通过基准测试[重复]

    这个问题在这里已经有答案了 我只是想知道我是否错过了一些语法糖或微优化 如果我调用一个需要 IEnumerable 值的方法 但我只有一个值 那么我将该单个值放入一个数组中 例如 var x 1 23 SquareAllTheNumbers
  • 在.NET Core中注入通用接口

    我想将此接口注入到我的控制器中 public interface IDatabaseService
  • 如何获取 Angular2 中元素的当前位置信息

    我有ElementRef我的导航栏 我试图找出它离我的窗口顶部有多近 这样我就可以让它粘起来 div class nav bar div ViewChild navBar navBarElement 我正在滚动事件中打印出它的 native
  • 如何确定 RecyclerView 最后一项在屏幕上可见?

    我有一个RecyclerView我将数据列表添加到RecyclerView 我想在列表中添加更多数据 最后一次RecyclerView项目在屏幕上可见 之后我想进行网络服务调用并更新RecyclerView数据 我怎样才能实现这个目标 有什
  • 有没有办法让控制台应用程序仅使用 .NET Core 中的单个文件运行?

    在 NET框架中 您可以制作一个 EXE将从命令行运行的文件 无需任何额外的配置文件 如果使用 ILMerge 您可以将所有 DLL参考文献1 EXE集会 我正在尝试使用 NET Core 来完成同样的事情 但到目前为止还没有成功 即使是最
  • 获取英汉对齐数据

    使用 TranslateArray2 我能够获取我想要的大多数语言的对齐数据 但不能获取英语到中文 zh 的对齐数据 我怎么才能得到它
  • 如何在 Mac v 10.7.2 上安装/使用 php

    我是对使用 PHP 感兴趣的普通大学生 谁能告诉我 101 如何使用简单明了的语言在 mac 版本 10 7 2 上安装 启用它 我将感谢任何和所有的帮助 Cheers 无需安装 PHP 或 Apache 它们已随 Mac 10 7 一起提
  • ios中的过滤器数组检查多个属性

    我有一系列自定义对象 自定义对象看起来像这样 interface User NSObject property nonatomic strong NSString user Id property nonatomic strong NSSt
  • 调用 GCMRegistrar.register() 时泄漏 IntentReceiver 错误

    我正在尝试完成以下入门步骤谷歌的GCM http developer android com guide google gcm gs html来自 Google 的 Android 开发者网站 当我的设备尝试注册时 由于以下原因而失败 Ac
  • 在 emacs 中移动区域或行

    我正在 emacs 中寻找一种将文本向右或向左移动的方法n空间 与 vim 中类似的功能 lt lt or gt gt 它应该在一个区域上工作 或者如果当前行上没有选择任何区域 并且不会将光标从当前位置移动 解决方案来自Emacs维基 ht
  • 如何用PHP显示分层的“NESTED SET”数据?

    我试图弄清楚如何使用 php 显示嵌套的 MySQL 数据 我已经设法搁置所有 叶节点 但后来我陷入困境 我需要显示一整棵树及其所有元素的关系 这是表格 category id name lft rgt 1 Saws 1 12 2 Chai
  • 如何从 puppeteer-sharp 中获取可读的浏览器/页面错误?

    我正在使用 puppeteer sharp 将某些页面呈现为 PDF 我想知道页面在浏览器中运行时渲染时是否存在任何问题 因此我设置了一些事件处理程序 page Error sender args gt logger LogCritical