这个例子是打开https://github.com/,搜索“git”,然后获取给出git描述的header元素。
package main
import (
"fmt"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/input"
)
func main() {
// Launch a new browser with default options, and connect to it.
browser := rod.New().MustConnect()
// Even you forget to close, rod will close it after main process ends.
defer browser.MustClose()
// Create a new page
page := browser.MustPage("https://github.com").MustWaitStable()
// Trigger the search input with hotkey "/"
page.Keyboard.MustType(input.Slash)
// We use css selector to get the search input element and input "git"
page.MustElement("#query-builder-test").MustInput("git").MustType(input.Enter)
// Wait until css selector get the element then get the text content of it.
text := page.MustElementR("span", "most widely used").MustText()
fmt.Println(text)
// Get all input elements. Rod supports query elements by css selector, xpath, and regex.
// For more detailed usage, check the query_test.go file.
fmt.Println("Found", len(page.MustElements("input")), "input elements")
// Eval js on the page
page.MustEval(`() => console.log("hello world")`)
// Pass parameters as json objects to the js function. This MustEval will result 3
fmt.Println("1 + 2 =", page.MustEval(`(a, b) => a + b`, 1, 2).Int())
// When eval on an element, "this" in the js is the current DOM element.
fmt.Println(page.MustElement("title").MustEval(`() => this.innerText`).String())
}
官方已经给出了比较详细的注释,但是由于是英文,也因为是初学,为了方便以后回翻查看。因此在这里稍微翻译一下,并作适当的补充。
browser := rod.New().MustConnect()
- 定义一个browser变量,以默认选项启动一个新的浏览器并且连接。
.MustConnect():
使用Must
开头是go的一种特殊写法,表示这些函数在遇到错误时不返回错误给调用者,而是会直接引发程序崩溃(例如抛出panic)。这种写法简化了错误处理,因为免去了检查错误返回值的需要,使得代码更加简洁易读。但在使用时也需要格外注意。
defer browser.MustClose()
defer
语句的常见用法,用于关闭或清理某种资源。defer
修饰的语句,会确保在当前函数结束前执行(即使发生错误),有点类似Java中的finally
。- 如果有多个
defer
,执行顺序遵循先进后出,类似于栈的执行顺序。
page := browser.MustPage("https://github.com").MustWaitStable()
- 创建一个新的页面,用于访问指定的URL,这里是Github的首页。
.MustWaitStable()
: 等待页面稳定,即页面上的网络请求和渲染完成,确保页面加载完全后再继续执行后续操作。这对于动态内容加载的页面特别重要。
page.Keyboard.MustType(input.Slash)
- 按"/"键聚焦搜索框
.Keyboard.MustType(key):
用来在指定页面上按下指定的按键后释放的操作。Slash
对应的按键是键盘的"/",具体全部的按键映射可以查看Go-Rod的KeyMap
page.MustElement("#query-builder-test").MustInput("git").MustType(input.Enter)
- 使用CSS选择器找到搜索框,并且输入"git"。
.MustElement():
返回第一个匹配CSS选择器的子元素,参数类型是string
。.MustInput():
聚焦元素并向其中输入。在执行这个动作之前,它会滚动到这个元素,等待它可见、可用并且可写。如果要清空输入可以使用el.SelectAllText().MustInput("")
text := page.MustElementR("span", "most widely used").MustText()
- 等到CSS选择器找到元素,获取这个元素中的文本
.MustElementR():
返回匹配CSS选择器并且匹配js正则表达式的第一个子元素。.MustText():
元素中渲染的文本。
fmt.Println(text)
标准库打印,没什么好说的
fmt.Println("Found", len(page.MustElements("input")), "input elements")
-
统计
input
标签的个数。 -
Rod supports query elements by css selector, xpath, and regex.
这三个分别是CSS选择器、xpath和正则表达式。
page.MustEval(`() => console.log("hello world")`)
- 运行JS代码,在控制台打印“hello world”
.MustEval():
Eval
方法是Page.Evaluate
方法的简化形式,用于在页面上运行JavaScript代码。
fmt.Println("1 + 2 =", page.MustEval(`(a, b) => a + b`, 1, 2).Int())
- 打印1+2的结果,使用js方法计算结果
- 将参数作为JSON对象传给JS函数,MustEval将会返回3
fmt.Println(page.MustElement("title").MustEval(`() => this.innerText`).String())
- 获取了页面标题的文本内容,并将其转换成字符串输出。
- 这里的
this
关键字在JavaScript函数中引用的是当前被MustElement
选中的DOM元素,即页面的标题元素。
总结一下,这个例子一共展示了这样几个功能:
- 启动浏览器并建立连接:
rod.New().MustConnect()
- 创建页面,等待渲染完成并访问:
browser.MustPage("URL").MustWaitStable()
- 在页面上键盘按下按键操作:
page.Keyboard.MustType(Key)
- 检索页面元素:
page.MustElement(CSS选择器)
、page.MustElementR(正则表达式)
- 获取文本:
Element.MustText()
- 在页面上运行JS代码:
page.MustEval()
、page.Element.Eval()