我想要一张屏幕截图,显示发生错误(超出上下文截止日期)时浏览器的样子(最好是在无头模式和有头模式下)。
我将 chromedp.Screenshot(...) 添加到 chromedp.Run 流程中,并在运行通过时正确截取屏幕截图,但是当失败时,错误发生在屏幕截图步骤之前并导致浏览器关闭,所以它太迟到了截图。 谢谢!
解决方法是利用截屏功能并在出现问题时保存最后一帧(或几帧):
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)
}
}