protocol.devtools_client
这里是底层封装、暂时无需知道函数的作用、我只列一些,有可能会用到的函数
*protocol.DevToolsConn 这个对象、实际是底层一个sockets连接的对象,无需关注他的实现;
仅需知道他的常用函数、和如何获取他、以及使用场景即可。
如何获取?
chromiumPath := "/Users/xxxx/Documents/workspace/Chromium.app/Contents/MacOS/Chromium"
browserObj := devtools.NewBrowser(chromiumPath, &devtools.BrowserOptions{
CachePath: luna_utils.CreateCacheDirInSubDir("/Users/xxxx/Documents/workspace/cache"),
Headless: false,
})
//第一组种获取方式,这个基本上用不上,他并不是全局的,不要误解
browserObj.DevToolsConn
//第二种获取方式//作用域当前页面
err,p0:=browserObj.OpenPage("https://www.google.com")
p0.DevToolsConn
browserObj.OpenPageAndListen("https://www.google.com", func(devToolsConn *protocol.DevToolsConn) {
//devToolsConn 第三种获取方式//作用域当前页面
})
//第四种获取方式//作用域当前页面
for _,itemPage:=range browserObj.GetPages(){
itemPage.DevToolsConn
}
如何使用?
凡是base_devtools这个包下的所有函数几乎都需要传入这个参数。
举例:
var wg sync.WaitGroup // 同步等待
wg.Add(1) // 增加等待的数量
err, p1 := browserObj.OpenPageAndListen("https://www.baidu.com/", func(devToolsConn *protocol.DevToolsConn) {
//第一个处理
devToolsConn.ShowLogJson(true)
page.PageEnable(devToolsConn)
network.EnableNetwork(devToolsConn)
network.RequestResponseAsync(devToolsConn, func(requestId string, request, response map[string]interface{}) {
})
devToolsConn.SubscribeOneTimeEvent("Page.loadEventFired", func(param interface{}) {
wg.Done() // 标记回调函数执行完成
runtime.Evaluate(devToolsConn," your js ")
runtime.EvaluateWithResultSync(devToolsConn," your js ",time.Minute)
page.PageDisable(devToolsConn)
})
})
ShowLog
ShowLogJson
均为显示日志、这里主要说明的是和devtools通信的日子信息是否需要显示,区别就是一个是json格式显示,另一个map格式显示。
订阅一次性事件
SubscribeOneTimeEvent
订阅永久事件、
SubscribePersistentEvent
解除订阅永久事件
UnsubscribePersistentEvent
这里没有写的很详细是因为我暂时觉得你应该用不到这个场景,“订阅一次性事件”指的是订阅一次触发后,如果后面依然有这样的事件也不会在触发这个回掉函数了。作用域均是当前页面。
“订阅永久事件” 是需要手动释放的,而一次性事件不需要,“订阅永久事件”指的是,无论重复多少次,这样的事件,他都会再次回掉。
当然一般除了网络请求的事件,也不会一直触发。
举例说明:
err, itemPage := browserObj.OpenPageAndListen("https://www.baidu.com", func(devToolsConn *protocol.DevToolsConn) {
devToolsConn.ShowLog(true)
//先打开页面监听
page.PageEnable(devToolsConn)
//如果触发Page.loadEventFired页面加载完毕事件、那么就会触发这个一次性订阅事件。
devToolsConn.SubscribeOneTimeEvent("Page.loadEventFired", func(param interface{}) {
runtime.Evaluate(devToolsConn, script.ShowMousePosition())
})
//新窗口打开也是一样,
devToolsConn.SubscribeOneTimeEvent("Page.windowOpen", func(param interface{}) {
runtime.Evaluate(devToolsConn, script.ShowMousePosition())
})
})
注:如果你并不清楚他到底有哪些事件,这个很容易。你只需要devToolsConn.ShowLog(true)把日志开起来,自然就可以看见他所有的
细节了。