chromedp.Run失败如何截图?

问题描述 投票:0回答:1

我想要一张屏幕截图,显示发生错误(超出上下文截止日期)时浏览器的样子(最好是在无头模式和有头模式下)。

我将 chromedp.Screenshot(...) 添加到 chromedp.Run 流程中,并在运行通过时正确截取屏幕截图,但是当失败时,错误发生在屏幕截图步骤之前并导致浏览器关闭,所以它太迟到了截图。 谢谢!

screenshot artifacts chromedp
1个回答
0
投票

解决方法是利用截屏功能并在出现问题时保存最后一帧(或几帧):

package main

import (
    "context"
    "encoding/base64"
    "fmt"
    "os"

    "github.com/chromedp/cdproto/page"
    "github.com/chromedp/chromedp"
)

func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    var screenshot string

    chromedp.ListenTarget(ctx, func(ev interface{}) {
        if ev, ok := ev.(*page.EventScreencastFrame); ok {
            // Only keep the last frame.
            // You can modify the code to keep several frames or all the frames.
            screenshot = ev.Data

            go func() {
                _ = chromedp.Run(ctx, page.ScreencastFrameAck(ev.SessionID))
            }()
        }
    })

    if err := chromedp.Run(ctx,
        page.StartScreencast(),
        // Put your actions here.
        page.StopScreencast(),
    ); err != nil {
        if screenshot != "" {
            buf, err := base64.StdEncoding.DecodeString(screenshot)
            if err != nil {
                fmt.Printf("failed to decode the screenshot data: %v\n", err)
            } else {
                _ = os.WriteFile("screenshot.png", buf, 0o644)
            }
        }
        panic(err)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.