簡體   English   中英

如何從puppeteer-sharp中獲取可讀的瀏覽器/頁面錯誤?

[英]How do I get readable browser/page errors out of puppeteer-sharp?

我正在使用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並在這些args上使用JsonValueAsync() ,但這似乎會導致一些異步怪異破壞devtools協議,因為我開始收到超時錯誤,然后錯誤抱怨Web套接字被破壞。

看來這是木偶戲本身的一個問題: 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;
    }
};

我從這里的一位木偶派出者的評論中得到了這個想法,並把它移植到了pupeteer-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); }); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM