V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ysmood
V2EX  ›  Go 编程语言

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

  •  1
     
  •   ysmood ·
    ysmood · 2020-04-06 18:11:19 +08:00 · 6106 次点击
    这是一个创建于 1685 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目地址: 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

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

    8 条回复    2022-09-01 13:30:21 +08:00
    cumt21g
        1
    cumt21g  
       2020-04-06 20:13:14 +08:00   ❤️ 1
    和 chromedp 有啥区别?
    mingsz
        2
    mingsz  
       2020-04-06 23:32:57 +08:00
    看上去不错,先 star 一下
    ysmood
        3
    ysmood  
    OP
       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
        4
    hellos  
       2020-05-05 23:03:45 +08:00 via Android
    支持。看着比 chromedp 简洁好多。
    1314258
        5
    1314258  
       2020-06-04 21:18:27 +08:00
    支持 ie11 吗?
    ysmood
        6
    ysmood  
    OP
       2020-06-04 22:33:34 +08:00 via Android
    vansenb
        7
    vansenb  
       2021-03-26 21:32:40 +08:00
    用了一下,感觉很好。首先渲染速度很快,想必比 Selenium 速度提升明显。其他的 API 比较友好,大部分 Selenium 拥有的功能这边都具备了。我这边开始投入到商业项目了。
    yqf0215
        8
    yqf0215  
       2022-09-01 13:30:21 +08:00
    用了,非常好用,比 Chromedp 好用得不是一个级别。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2653 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:28 · PVG 19:28 · LAX 03:28 · JFK 06:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.