分享一个 chrome headless 的库,目标是成为 Go 版的 Puppeteer

2020-04-06 18:11:19 +08:00
 ysmood

项目地址: https://github.com/ysmood/rod

目前我们自己的 QA 在用它做支付服务的集成测试和冒烟监控,之后还打算用到其他一些爬虫项目。相比用 Nodejs 对于 QA 来说 Go 的心智负担更小,不用教他们 Promise,异步 IO 等概念,而且要强类型的易维护性的话还得学 Typescript,过于繁杂。

下面是个简单的谷歌翻译示例:

package main

import (
	"fmt"
	"os"

	"github.com/ysmood/rod"
)

func main() {
	source := os.Args[1]

	browser := rod.New().Connect()

	page := browser.Page("https://translate.google.com/")

	wait := page.WaitRequestIdle()
	page.Element("#source").Input(source)
	wait()

	result := page.Element(".tlid-translation").Text()

	fmt.Println(result)
}

更多详细的使用示例可以看 https://github.com/ysmood/rod/blob/master/examples_test.go

感兴趣的话请试试。另外想来收集下需求和吸引一些想一起维护的人。

5848 次点击
所在节点    Go 编程语言
8 条回复
cumt21g
2020-04-06 20:13:14 +08:00
和 chromedp 有啥区别?
mingsz
2020-04-06 23:32:57 +08:00
看上去不错,先 star 一下
ysmood
2020-04-07 04:27:24 +08:00
@cumt21g 其实项目的 readme 里已经提到了和 chromedp,puppeteer,以及 cypress 的对比。

我们一开始也是使用的 chromedp,但是用了一段时间之后发现了很多它的根本设计问题,chromedp 为了并不常用的 context 设计了反直觉的 DSL 来绕开这个问题,这使得我们不得不大量重复的使用它设计不完全的语法操作网页内容,写个 if-else 都要多增一些代码,而且不小心写错了还容易出奇怪的 bug,debug 相当痛苦,每次断点到它的代码里基本就会迷路,原因就是它利用自己的 DSL 将 golang 的强类优点基本全屏蔽了,类型跳转根本没法用,基本就等于是在用 nodejs 了,那我何不直接用 puppeteer 呢?

另外一个要命的问题就是它底层设计时用了 chrome 自己的 json schema 来生自动成类型代码,而 chrome 自己的 json schema 本来就设计不好,比如最底层的 api call 其实是有个可选的 session id 字段的,然而 schema 里并没有表达,这导致 chromedp 等利用这个自动生成代码的库都没有把这个 session id 带上,这对于 iframe 的操作是很关键的。这也就是为什么这么多年了他们这个 issue 还没任何进展 https://github.com/chromedp/chromedp/issues/72
iframe 的支持对于我们支付服务的测试是必要的(比如 stripe 多层 iframe 套娃)关键是他们底层设计太繁杂,我觉得自己写个都比去改它代码省事。这也是我觉得有必要自己写个框架的主要原因。
hellos
2020-05-05 23:03:45 +08:00
支持。看着比 chromedp 简洁好多。
1314258
2020-06-04 21:18:27 +08:00
支持 ie11 吗?
ysmood
2020-06-04 22:33:34 +08:00
vansenb
2021-03-26 21:32:40 +08:00
用了一下,感觉很好。首先渲染速度很快,想必比 Selenium 速度提升明显。其他的 API 比较友好,大部分 Selenium 拥有的功能这边都具备了。我这边开始投入到商业项目了。
yqf0215
2022-09-01 13:30:21 +08:00
用了,非常好用,比 Chromedp 好用得不是一个级别。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/659884

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX