Skip to main content

case_aoto


本案例基本上是比较常见的场景、包括鼠标点击、移动、滚轮、键盘输入、监听页面是否加载完成等。

这里有几个需要注意的点;

1、如果需要鼠标点各类操作基本上前提都需要配置ImgPath的路径;

2、如果你提供了匹配的小的截图、比如一个按钮的截图 button.png、一个文本框的截图、

比如你的路径是 ImgPath:/Users/xxxx/Documents/workspace/luna/baidu_img

他实际在这个路径下、根据你传入的 button.png名字,会自动生成2个图片;

一个是对应的大图、如button_big.png 这个是说他自动在页面截图的时候的样子。另一个是

button_test.png 这个是他会告诉你,他匹配的位置是什么,并且会用红色框框起来给你看,这个可以用于平时的

问题排查。

package test_case

import (
"fmt"
"luna/base_devtools/input"
"luna/base_devtools/page"
"luna/base_devtools/runtime"
"luna/devtools"
"luna/luna_utils"
"luna/protocol"
"luna/script"
"testing"
"time"
)



func TestBaidu(t *testing.T) {
luna_utils.KillProcess()
/********************************/
chromiumPath := "/Users/xxxx/Documents/workspace/golang/Chromium.app/Contents/MacOS/Chromium"
browserObj := devtools.NewBrowser(chromiumPath, &devtools.BrowserOptions{
CachePath: luna_utils.CreateCacheDirInSubDir("/Users/xxxx/Documents/workspace/golang/cache"),
ImgPath: "/Users/xxxx/Documents/workspace/luna/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(false)

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.RunJS(script.ShowMousePosition())
//本行代码是降低平均执行速度为、每个命令执行匀速降低10毫秒;只是为了演示,正常时候无需使用
itemPage.DevToolsConn.ReduceSpeed(10)
//下行代码、是通过页面找寻是否有与截图相似50%以上的,如果有就继续进行。
//home.png这个只是一个非常小的截图,并不是整个页面,其实这个和监听网络等待页面打开差不多、
//只不过、他是通过人的视角去看。 本截图在源码的test_img/baidu_img路径下,可以找到
//你看一下就知道什么意思了,其实非常简单
err, ok := itemPage.WaitForMatchOnPageSync("home.png", 0.5, time.Hour)
if err == nil && ok {
fmt.Println("说明、页面已经成功打开")
//这个是计算匹配的文本框的坐标是什么,代表边距,50, 200, 10, 10。为什么需要这个,因为如果你仅截图这个框,
//其实只有4个线,特征不明显容易找错、所以要截图稍大一些;但是我们实际需要的是文本框的范围、所以加几个边距。单位像素
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("随便")

//这个是找到那个按钮的坐标button_01.png、test_img/baidu_img路径下也可以找到
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)
}
//滚动到页面底部、bottom.png他回自动找这个图片,找到了为止。就停下来
err, ok := itemPage.ScrollToTargetImagePosition(imageCoordinates.RandomX, imageCoordinates.RandomY, input.DOWN, "bottom.png", 0.5, time.Minute)
fmt.Println(ok, err)

itemPage.Close()
browserObj.Close()
}

}
fmt.Println("~~~~~~~~~~>==============<~~~~~~~~~~~~~~")
} else {
fmt.Println(err, "错误了")
}
/********************************/
time.Sleep(1 * time.Minute)
}