背景
之前使用了chromedp对网页进行了截图操作
这次需要对网页的按钮、输入框进行点击和输入操作
我们对每一次操作进行截图 可以清晰的看到每次的操作结果
备忘
参考:
https://github.com/chromedp/chromedp
https://pkg.go.dev/github.com/chromedp/chromedp#pkg-overview
具体实现
先简单的列举一些常见的使用到的api,具体的说明可以参见上面参考链接
名字 | 说明 |
---|---|
Navigate | 进入某个页面 |
Run | 运行各类操作 |
Screenshot | 截屏 |
Click | 模拟鼠标点击 |
WaitVisible | 等候某元素出现 |
ActionFunc | 执行自定义函数 |
SendKeys | 模拟键盘输入 |
这里简单的模拟点开百度网页https://www.baidu.com/
然后进行一个登录操作 具体步骤如下:
- 使用chromedp.Navigate打开网页https://www.baidu.com/
- F12打开控制台
我们可以找到“登陆”按钮对应的位置,因为这里没有id 我们使用chromedp.ByJSPath的方式来定位。
使用chromedp.Click点击登陆按钮,该操作后截图如下 - 我们需要选择用户名登陆,同样在网页元素中找到这个位置。使用Click点击,操作后如下
- 定位两个输入框 使用SendKeys输入用户名以及密码,操作后如下
- 最后点击登陆按钮。完成登陆。
一般来说就可以完成登陆了。但是百度做了防机器人登陆的校验。最后结果如下
虽然最后被百度的安全验证挡下,但通过这个小例子,使用chromedp完成了对网页的点击,输入,截屏等操作。
具体代码如下
func Test_baidu(t *testing.T) {
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
ctx, cancel = context.WithTimeout(ctx, 30*time.Second)
defer cancel()
if err := chromedp.Run(ctx,
//打开网页
chromedp.Navigate(`http://www.baidu.com`),
//定位登录按钮
chromedp.Click(`document.querySelector(".s-top-login-btn.c-btn.c-btn-primary.c-btn-mini.lb")`, chromedp.ByJSPath),
//使用用户名密码登录
//chromedp.SendKeys(`input[name=userName]`, "15377004790"),
//chromedp.Click(`input[type=submit]`),
chromedp.Click(`TANGRAM__PSP_11__footerULoginBtn`, chromedp.ByID),
//输入用户名
chromedp.SendKeys(`TANGRAM__PSP_11__userName`, "username", chromedp.ByID),
//输入密码
chromedp.SendKeys(`TANGRAM__PSP_11__password`, "password", chromedp.ByID),
//点击登录按钮
chromedp.Click(`TANGRAM__PSP_11__submit`, chromedp.ByID),
//截全屏
chromedp.ActionFunc(func(ctx context.Context) error {
time.Sleep(time.Second)
cookies, err := network.GetAllCookies().Do(ctx)
if err != nil {
return err
}
s := ""
for _, cookie := range cookies {
if cookie.Name == "cert_common" {
s += cookie.Name + "=" + cookie.Value + "; "
}
}
var buf []byte
_, _, contentSize, err := page.GetLayoutMetrics().Do(ctx)
if err != nil {
return err
}
width, height := int64(math.Ceil(contentSize.Width)), int64(math.Ceil(contentSize.Height))
// force viewport emulation
err = emulation.SetDeviceMetricsOverride(width, height, 1, false).
WithScreenOrientation(&emulation.ScreenOrientation{
Type: emulation.OrientationTypePortraitPrimary,
Angle: 0,
}).
Do(ctx)
if err != nil {
return err
}
// capture screenshot
buf, err = page.CaptureScreenshot().
WithQuality(90).
WithClip(&page.Viewport{
X: contentSize.X,
Y: contentSize.Y,
Width: contentSize.Width,
Height: contentSize.Height,
Scale: 1,
}).Do(ctx)
if err != nil {
return err
}
if err := ioutil.WriteFile("4.png", buf, 0644); err != nil {
Error(err)
return err
}
return nil
}),
); err != nil {
Debug(err)
}
}