首页 > 其他分享 >Go-Rod #1 Basic

Go-Rod #1 Basic

时间:2024-03-24 22:37:42浏览次数:25  
标签:fmt Rod MustEval Basic Go input browser page 页面

这个例子是打开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元素,即页面的标题元素。

总结一下,这个例子一共展示了这样几个功能:

  1. 启动浏览器并建立连接:rod.New().MustConnect()
  2. 创建页面,等待渲染完成并访问:browser.MustPage("URL").MustWaitStable()
  3. 在页面上键盘按下按键操作:page.Keyboard.MustType(Key)
  4. 检索页面元素:page.MustElement(CSS选择器)page.MustElementR(正则表达式)
  5. 获取文本:Element.MustText()
  6. 在页面上运行JS代码:page.MustEval()page.Element.Eval()

标签:fmt,Rod,MustEval,Basic,Go,input,browser,page,页面
From: https://www.cnblogs.com/Edward6/p/18093220

相关文章

  • django脚本orm中使用原生sql
    fromdjango.core.management.baseimportBaseCommandfromchat_greeting_messages.modelsimportGreetingimportosfromdjango.dbimportconnectionclassCommand(BaseCommand):help="Patchinitializationrecruiternotsuitablegretting"......
  • 基于 HttpRunner + Django + Vue + Element UI 的接口自动化测试平台,生产可用
    LunarLink平台简介基于HttpRunner+Django+Vue+ElementUI的接口自动化测试平台,生产可用。此外,非常感谢花菜。没有AnotherFasterRunner就不会有LunarLink......
  • python趣味编程-使用 Django 和 WebSockets 的 Python 简单实时聊天室网站
    在Python中使用Django的简单实时聊天室系统该项目名为“简单实时聊天室系统”。这是一个使用Python和DjangoFramework开发的基于Web的应用程序。该应用程序是一个供随机用户使用的简单聊天室。所有人都可以在一个聊天框或对话框中进行交流。聊天消息会自动更新到所......
  • python趣味编程-使用 Django 的 Python 大学考勤管理系统
    在Python中使用Django的大学考勤管理系统该项目的名称为《大学考勤管理系统》。这是一个使用DjangoFramework用Python开发的基于Web的应用程序。该项目帮助某些大学学院存储/记录和管理学生每堂课的出勤情况。使用该应用程序,他们可以轻松列出班级学生名单并记录每......
  • Pedagogic metalguage
    Atthebeginning,thedirectoradoptedamediumshotsocialcloseandanoutoffocusangletoshowthegraybackgroundafterashipwreck.Thegrayenvironmentemphasizesthespiritlessandgrievedatmospherebecausemanypeoplelefttheirlivesinthetr......
  • Go语言进阶:深入理解深拷贝与浅拷贝
    Go语言进阶:深入理解深拷贝与浅拷贝原创 lipeilun 海天二路搬砖工 2024-03-1719:01 福建 听全文一、引言在Go语言的编程实践中,内存管理和数据复制是经常遇到的问题。特别是在处理复杂数据结构或自定义类型时,如何正确、高效地复制数据变得尤为重要。深拷贝与浅拷贝是......
  • Pedagogic metalanguage of Harry Potter
    ✨TheimagesbelowisallfromHarryPotter.Prominence(visual)2.Size:small3.Sharpnessforegroundcolor:Harryisoutoffocusandthesnakeisinfocus4.Address(visual):indirectgaze5.Angle:noangle6.Distance/shot:closeshot......
  • Pedagogic Metalanguage about Spider Man: The Universe
    MyfavoritevideoisfromasceneinthemovieSpiderMan:TheUniverse.WhenMilesandhisfavoriteUncleAllenconfronteachotherduetotheirdifferentidentities,Miles'seyeswidenbecausehecan'tbelievetheenemyishismostrespectedU......
  • Pedagogic metalanguage
    ThemovieIwanttoshareandanalyzeisFlipped,whichtellsastorybetweenagirlandaboy.Atthebeginningofthemovie,withjoyfulbackgroundmusic,thegirlhasacrushontheboy.subsequently,theheroinewenttodothemafavor.Butthereis......
  • pedagogic metalanguage
    MyfavoriteEnglishvideoclipisfromthemovieFlyingringtravel.Therearetwomaincharactersinthevideoclip:CarlFredricksenandRussell.Underthecontinuousdevelopmentofthecity.CarlFredricksenmadeashockingmovetorealizeadreamheshar......