go模拟登陆

背景

之前使用了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/
然后进行一个登录操作 具体步骤如下:

  1. 使用chromedp.Navigate打开网页https://www.baidu.com/
  2. F12打开控制台
    在这里插入图片描述
    我们可以找到“登陆”按钮对应的位置,因为这里没有id 我们使用chromedp.ByJSPath的方式来定位。
    使用chromedp.Click点击登陆按钮,该操作后截图如下
    在这里插入图片描述
  3. 我们需要选择用户名登陆,同样在网页元素中找到这个位置。使用Click点击,操作后如下
    在这里插入图片描述
  4. 定位两个输入框 使用SendKeys输入用户名以及密码,操作后如下
    在这里插入图片描述
  5. 最后点击登陆按钮。完成登陆。
    一般来说就可以完成登陆了。但是百度做了防机器人登陆的校验。最后结果如下
    在这里插入图片描述
    虽然最后被百度的安全验证挡下,但通过这个小例子,使用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)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值