golang Chrome DevTools Protocol怎么判断网页加载完毕,不使用puppeteer,playwright,给个代码
时间: 2024-10-23 21:17:56 浏览: 19
go-chrome:用于与Chrome DevTools协议进行交互的golang库。 https:chromedevtools.github.iodevtools-protocol
在Go语言中,你可以使用`net/http`包结合Chrome DevTools Protocol (CDP) 来监控网页加载状态。CDP提供了一个API叫`Page.domContentEventFired`,这个事件会在DOMContentLoaded事件触发时发送。但是,由于CDP需要通过WebSocket连接到浏览器的DevTools,所以你需要编写一个简单的HTTP服务器来处理WebSocket连接,并监听所需的事件。
以下是一个简单的示例,使用`golang.org/x/net/websocket`库来创建WebSocket服务器:
```go
package main
import (
"context"
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
type CDPClient struct {
conn *websocket.Conn
}
func (c *CDPClient) Send(msg interface{}) error {
return c.conn.WriteJSON(msg)
}
func (c *CDPClient) Recv() (interface{}, error) {
var msg interface{}
err := c.conn.ReadJSON(&msg)
if err != nil {
return nil, err
}
return msg, nil
}
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
upgrades := []string{"websocket"}
if !websocket.IsUpgrade(r.Header) || !r.Method == "GET" || !websocket.Accept(r, upgrades...) {
w.WriteHeader(http.StatusUpgradeRequired)
return
}
conn, err := websocket.Upgrade(w, r, nil, 1024*1024, 1024*1024)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
client := &CDPClient{conn: conn}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// 启动一个goroutine来接收并处理消息
go func() {
for {
select {
case <-ctx.Done():
return
case event, ok := <-client.Recv():
if !ok {
break
}
// 检查是否为DOMContentLoaded事件
if event.Get("method") == "DOMContentLoaded" {
fmt.Printf("Received DOMContentLoaded event\n")
cancel()
}
}
}
}()
// 发送初始化请求
_, err = client.Send(map[string]interface{}{"id": 1, "method": "Network.enable"})
if err != nil {
log.Println(err)
return
}
// 等待DOMContentLoaded事件
}()
```
在这个例子中,服务器会等待`DOMContentLoaded`事件发生,然后关闭连接。请注意这只是一个基础示例,实际使用时可能需要处理更复杂的错误情况和事件解析。
阅读全文