一款可以完全替代 Selenium 的快速简洁无依赖的浏览器驱动框架

写过爬虫或者做过一些浏览器自动化测试工作的同学,一定对 Selenium 或者 PhantomJS 不陌生,他们都可以通过代码直接驱动浏览器去完成我们想要的工作,就像我们真正的在操作一样,非常的方便。

但是上述两个工具一般安装比较复杂,同时不是跨平台的,所以一般你在自己电脑配置好了,要发布到线上的时候,还需要再安装一遍,你完全不知道你会碰到什么样的坑。一定困恼了很多的同学吧?

今天要推荐的工具 Chromedp,同样可以驱动浏览器去完成我们想要的工作,但是他完全没有外部的依赖,同时该工具采用 Go 语言开发,解决了困恼我们的跨平台的问题。它使用起来非常的快速和简洁,我们来看几个例子。

点击事件

// Command click is a chromedp example demonstrating how to use a selector to
// click on an element.
package main

import (
	"context"
	"log"
	"time"

	"github.com/chromedp/chromedp"
)

func main() {
	// create chrome instance
	ctx, cancel := chromedp.NewContext(
		context.Background(),
		chromedp.WithLogf(log.Printf),
	)
	defer cancel()

	// create a timeout
	ctx, cancel = context.WithTimeout(ctx, 15*time.Second)
	defer cancel()

	// navigate to a page, wait for an element, click
	var example string
	err := chromedp.Run(ctx,
		chromedp.Navigate(`https://golang.org/pkg/time/`),
		// wait for footer element is visible (ie, page is loaded)
		chromedp.WaitVisible(`body > footer`),
		// find and click "Expand All" link
		chromedp.Click(`#pkg-examples > div`, chromedp.NodeVisible),
		// retrieve the value of the textarea
		chromedp.Value(`#example_After .play .input textarea`, &example),
	)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Go's time.After example:\n%s", example)
}

上面是一个点击并获取点击区域值的代码,可以看出除了一些初始化的代码,本身操作浏览器工作的代码非常的简洁。

模拟手机操作

看了示例代码,没想到还可以模拟手机 IPhone 7 操作。通过 chromedp.Emulate(device.IPhone7landscape) 就可以模拟 IPhone7 了,代码如下:

// Command emulate is a chromedp example demonstrating how to emulate a
// specific device.
package main

import (
	"context"
	"io/ioutil"
	"log"

	"github.com/chromedp/chromedp"
	"github.com/chromedp/chromedp/device"
)

func main() {
	// create context
	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	// run
	var b1, b2 []byte
	if err := chromedp.Run(ctx,
		// emulate iPhone 7 landscape
		chromedp.Emulate(device.IPhone7landscape),
		chromedp.Navigate(`https://www.whatsmyua.info/`),
		chromedp.CaptureScreenshot(&b1),

		// reset
		chromedp.Emulate(device.Reset),

		// set really large viewport
		chromedp.EmulateViewport(1920, 2000),
		chromedp.Navigate(`https://www.whatsmyua.info/?a`),
		chromedp.CaptureScreenshot(&b2),
	); err != nil {
		log.Fatal(err)
	}

	if err := ioutil.WriteFile("screenshot1.png", b1, 0644); err != nil {
		log.Fatal(err)
	}
	if err := ioutil.WriteFile("screenshot2.png", b2, 0644); err != nil {
		log.Fatal(err)
	}
}

通过访问 https://www.whatsmyua.info/ 可以知道具体是通过什么设备访问的。

下一个爬虫相关的工作,我就打算用这个工具了。

项目地址:https://github.com/chromedp/chromedp

示例地址:https://github.com/chromedp/examples


更多精彩请扫码关注如下公众号。

Written on October 27, 2019