devtools.page
包 devtools.page
GetHtml 获取当前page对象的页面源代码。
注意:如果你发现页面源代码并不完整、可能是页面还未加载完成。
Usage
//干掉其他无关的chromium进程
luna_utils.KillProcess()
/********************************/
chromiumPath := "/Users/xxxx/Documents/workspace/Chromium.app/Contents/MacOS/Chromium"
//初始化浏览器对象
browserObj := devtools.NewBrowser(chromiumPath, &devtools.BrowserOptions{
CachePath: luna_utils.CreateCacheDirInSubDir("/Users/xxxx/Documents/workspace/golang/cache"),
Headless: false,
})
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)
devToolsConn.SubscribeOneTimeEvent("Page.loadEventFired", func(param interface{}) {
wg.Done() // 标记回调函数执行完成
page.PageDisable(devToolsConn)
})
})
wg.Wait() // 等待回调函数执行完成
//返回页面源代码、json格式
fmt.Println(p1.GetHtml())
//实际上我们这样用可能是更加符合我们的习惯的、而且他已经贴心的帮你处理好了编码问题。
fmt.Println(page.DecodeHTMLString(p1.GetHtml().Get("result.outerHTML").String()))
Returns
gjson.Result 页面返回的源代码、如果你不清楚这个gjson应该如何使用、建议先关注github.com/tidwall/gjson简单看一下。
他比你想象的要简单的多。
RunJS 在当前页面运行js
注意这是在你对应的页面运行js、其他页面互不影响。
Arguments
js 、string 就是你需要运行的js
//示例1
//显示鼠标移动轨迹
p1.RunJS(script.ShowMousePosition())
RunJSSync 在当前页面运行js,和RunJS唯一的区别是,他会等待并且返回结果、在你给定的时间范围内。超过时间、返回超时错误。
Arguments
1、js 、string 就是你需要运行的js
2、timeout time.Duration、超时时间、举例time.Minute、time.Second*10 都可以。
// 在当前页面执行js、并且获取返回结果,
err,result:=p1.RunJSSync(script.ScreenInfo(),time.Second*10)
fmt.Println(result)
Returns
gjson.Result js执行的结果。
SetViewportSize 设置当前页面的视口大小、建议不要设置、他仅对当前页面生效、而且只影响可视范围、 并不影响窗口范围
Arguments
width, height int64 分别是宽、高 , 单位像素。
WaitForMatchOnPageSync 等待找到匹配的目标图片、找到后返回true、或者超时未找到
Arguments
smallImgPath string 你需要匹配的目标截图路径
matchScore float64 你设置的匹配阈值0.0-1.0之间;
timeout time.Duration 超时阈值
示例:
luna_utils.KillProcess()
/********************************/
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"),
ImgPath: "/Users/xxxx/Documents/workspace/test_img/baidu_img",
Headless: false,
ProxyStr: "https://API1M5TV:9BFF49220D11@42.179.160.60:39349",
Fingerprint: []string{"fingerprint1", "fingerprint2"},
WindowSize: &devtools.WindowSize{
Width: 1496,
Height: 967,
},
})
//&{2 1496 967 1496 858}
fmt.Println()
browserObj.DevToolsConn.ShowLog(true)
err, itemPage := browserObj.OpenPageAndListen("https://www.baidu.com", func(devToolsConn *protocol.DevToolsConn) {
//第一个处理
devToolsConn.ShowLog(true)
page.PageEnable(devToolsConn)
devToolsConn.SubscribeOneTimeEvent("Page.loadEventFired", func(param interface{}) {
runtime.Evaluate(devToolsConn, script.ShowMousePosition())
})
devToolsConn.SubscribeOneTimeEvent("Page.windowOpen", func(param interface{}) {
runtime.Evaluate(devToolsConn, script.ShowMousePosition())
})
})
if err == nil {
//itemPage.SetViewportSize(1496, 967)
//fmt.Println(devtools.GetBrowserScreen(itemPage.DevToolsConn))
itemPage.RunJS(script.ShowMousePosition())
itemPage.DevToolsConn.ReduceSpeed(10)
//重点看这个函数、这个home.png 的实际路径应该是在ImgPath这个地方的设置
//也就是/Users/xxxx/Documents/workspace/test_img/baidu_img/home.png
//当他检测到有这个目标出现并且匹配到时候,就会返回。
err, ok := itemPage.WaitForMatchOnPageSync("home.png", 0.5, time.Hour)
if err == nil && ok {
fmt.Println("说明、页面已经成功打开")
}
}
Returns
error, 超时错误
bool,true是找到图片、false是未找到目标图片
SimulateMouseClickOnPage 模拟人类点击、内置了符合人类的点击习惯。
Arguments
x, y float64 分别为目标坐标的x坐标、y坐标
SimulateMouseMoveOnPage 模拟人类鼠标移动、内置了符合人类鼠标移动轨迹。
Arguments
startX, startY, endX, endY float64 分别为:起点坐标、重点坐标。
SimulateMouseScrollOnPage 模拟鼠标滚轮、内置符合人类的滚动特点
Arguments
x, y float64, 启始位置的x、y坐标
totalDistance int, 需要移动的总距离
direction input.Direction 滚动方向 、input.DOWN、input.UP、input.LEFT、input.RIGHT
ScrollToTargetImagePosition 模拟鼠标滚轮、内置符合人类滚动特点,他和SimulateMouseScrollOnPage的区别是
这个自己会根据你给定的滚动方向、一直滚动直到超时、或者找到目标图片为止。
Arguments
x, y float64, 启始点坐标
direction input.Direction,滚动方向input.DOWN、input.UP、input.LEFT、input.RIGHT
smallImgPath string, 目标小图的路径
matchScore float64, 匹配的阈值 0.0-1.0
timeout time.Duration 超时阈值
示例:
//bottom.png 这个的实际路径是 devtools.NewBrowser 设置的 ImgPath+bottom.png 路径
//如:ImgPath: "/Users/xxxx/Documents/workspace/baidu_img"
//这个的完整路径是/Users/xxxx/Documents/workspace/baidu_img/bottom.png
err, ok := itemPage.ScrollToTargetImagePosition(imageCoordinates.RandomX, imageCoordinates.RandomY, input.DOWN, "bottom.png", 0.5, time.Minute)
fmt.Println(ok, err)
Returns
error, 超时错误
bool、true为找到目标并且停止滚动、false是停止滚动、但是未找到目标
SimulateKeyboardInputOnPage 模拟人类的键盘输入
Arguments
text string 输入的内容
itemPage.SimulateKeyboardInputOnPage("luna")
ImageSimilarity 、计算图片相似度、他会实时截取你的页面图片、并且比对你传入的小图、在你设置的超时阈值内、找到最佳符合
的匹配结果返回,或者超时未找到匹配结果。
Arguments
smallImgPath string 小图路径
timeout time.Duration 超时阈值
//找到按钮的位置
err, imageCoordinates := itemPage.ImageSimilarity("button_01.png", time.Minute)
if err == nil && imageCoordinates.MatchScore > 0.5 {
//移动到目标点
itemPage.SimulateMouseMoveOnPage(targetX, targetY, imageCoordinates.RandomX, imageCoordinates.RandomY)
//点击按钮
itemPage.SimulateMouseClickOnPage(imageCoordinates.RandomX, imageCoordinates.RandomY)
}
Returns
error, 超时错误
*input.ImageCoordinates 是一个结构体、具体如下
type ImageCoordinates struct {
Err error
RandomX float64 //这个指的是 在大图中找到的小图位置;但是他是一个矩形,如果我们点击的时候需要点击这个矩形的任意点;所以这个是在这个矩形内随机产生的横坐标;
RandomY float64 //同上,只是是纵坐标
ImageWidth int64 //原始图片的真实宽度
ImageHeight int64 //原始图片真实高度
MatchScore float64 //返回的相似度,也就是他找到的小图和大图之间的相似度是多少.你可以根据这个值来调整输入参数的LunaThreshold值;
}
总结、一般你只需要判断是否err 不为nil 并且 MatchScore 匹配阈值满足你的需求、然后用他的坐标进行 鼠标、点击、滚动、键盘 等后续操作。
SimilarityWithMargin 计算图片相似度、他会实时截取你的页面图片、并且比对你传入的小图、在你设置的超时阈值内、找到最佳符合
的匹配结果返回,或者超时未找到匹配结果。和ImageSimilarity唯一区别是多了4个参数,主要用于比如输入框等,图片特征不明显的场景、作用就是缩小你最后匹配的图片矩形的范围,使得他可以准确的框定 输入框的范围。
说人话就是:文本框通常没什么特征、图片不好匹配、所以你需要截图稍微范围大一点、但是截图大了后发现超出了文本框范围
所以要给4个边距的距离,让他找到对应的文本框到底在哪。
Arguments
smallImgPath string, 小图路径
leftMargin, rightMargin, topMargin, bottomMargin float64, 边距 单位像素
timeout time.Duration 超时阈值
//示例:
//"home.png" 目标小图, 50, 200, 10, 10 4个边距, time.Minute 超时阈值
err, imageCoordinates := itemPage.SimilarityWithMargin("home.png", 50, 200, 10, 10, time.Minute)
if err == nil && imageCoordinates.MatchScore > 0.5 {
targetX, targetY := imageCoordinates.RandomX, imageCoordinates.RandomY
itemPage.SimulateMouseMoveOnPage(luna_utils.RandomInRange(-1, devtools.BrowserGlobal.ScreenAvailWidth), -1, targetX, targetY)
itemPage.SimulateMouseClickOnPage(targetX, targetY)
itemPage.SimulateKeyboardInputOnPage("随便")
}
Returns
error, 超时错误
*input.ImageCoordinates 是一个结构体、具体如下
type ImageCoordinates struct {
Err error
RandomX float64 //这个指的是 在大图中找到的小图位置;但是他是一个矩形,如果我们点击的时候需要点击这个矩形的任意点;所以这个是在这个矩形内随机产生的横坐标;
RandomY float64 //同上,只是是纵坐标
ImageWidth int64 //原始图片的真实宽度
ImageHeight int64 //原始图片真实高度
MatchScore float64 //返回的相似度,也就是他找到的小图和大图之间的相似度是多少.你可以根据这个值来调整输入参数的LunaThreshold值;
}
总结、一般你只需要判断是否err 不为nil 并且 MatchScore 匹配阈值满足你的需求、然后用他的坐标进行 鼠标、点击、滚动、键盘 等后续操作。
GetElementPositionByXpathOnPage 获取xpath选择器的元素位置信息、
Arguments
selector string 、这个其实就是你在页面任意元素、鼠标右键、复制他的完整xpath路径、或xpath路径,就可以找到对应的xpath
元素了
//示例
err, x, y := p1.GetElementPositionByXpathOnPage(`//*[@id="hotsearch-content-wrapper"]/li[1]/a/span[2]`)
p1.SimulateMouseClickOnPage(x, y)
Returns
err error, 找不到目标元素
randomX, randomY float64 找到目标元素的矩形内、任意点的x、y坐标、以便于你后续的点击、或者鼠标移动操作
GetElementPositionByCssOnPage 获取css选择器的元素位置信息
err, x, y := p1.GetElementPositionByCssOnPage(`#browser-new-page`)
p1.SimulateMouseClickOnPage(x, y)
Arguments
selector string 、这个其实就是你在页面任意元素、鼠标右键、复制他的selector,就可以找到对应的xpath
元素了
Returns
err error, 找不到目标元素
randomX, randomY float64 找到目标元素的矩形内、任意点的x、y坐标、以便于你后续的点击、或者鼠标移动操作