layout | title | tags |
---|---|---|
post |
一款可以完全替代 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/ 可以知道具体是通过什么设备访问的。
下一个爬虫相关的工作,我就打算用这个工具了。