Best Rod code snippet using rod.Element
examples_test.go
Source:examples_test.go  
...25	defer browser.MustClose()26	// Create a new page27	page := browser.MustPage("https://github.com")28	// We use css selector to get the search input element and input "git"29	page.MustElement("input").MustInput("git").MustType(input.Enter)30	// Wait until css selector get the element then get the text content of it.31	text := page.MustElement(".codesearch-results p").MustText()32	fmt.Println(text)33	// Get all input elements. Rod supports query elements by css selector, xpath, and regex.34	// For more detailed usage, check the query_test.go file.35	fmt.Println("Found", len(page.MustElements("input")), "input elements")36	// Eval js on the page37	page.MustEval(`() => console.log("hello world")`)38	// Pass parameters as json objects to the js function. This MustEval will result 339	fmt.Println("1 + 2 =", page.MustEval(`(a, b) => a + b`, 1, 2).Int())40	// When eval on an element, "this" in the js is the current DOM element.41	fmt.Println(page.MustElement("title").MustEval(`() => this.innerText`).String())42	// Output:43	// Git is the most widely used version control system.44	// Found 5 input elements45	// 1 + 2 = 346	// Search · git · GitHub47}48// Shows how to disable headless mode and debug.49// Rod provides a lot of debug options, you can set them with setter methods or use environment variables.50// Doc for environment variables: https://pkg.go.dev/github.com/go-rod/rod/lib/defaults51func Example_disable_headless_to_debug() {52	// Headless runs the browser on foreground, you can also use flag "-rod=show"53	// Devtools opens the tab in each new tab opened automatically54	l := launcher.New().55		Headless(false).56		Devtools(true)57	defer l.Cleanup() // remove launcher.FlagUserDataDir58	url := l.MustLaunch()59	// Trace shows verbose debug information for each action executed60	// Slowmotion is a debug related function that waits 2 seconds between61	// each action, making it easier to inspect what your code is doing.62	browser := rod.New().63		ControlURL(url).64		Trace(true).65		SlowMotion(2 * time.Second).66		MustConnect()67	// ServeMonitor plays screenshots of each tab. This feature is extremely68	// useful when debugging with headless mode.69	// You can also enable it with flag "-rod=monitor"70	launcher.Open(browser.ServeMonitor(""))71	defer browser.MustClose()72	page := browser.MustPage("https://github.com/")73	page.MustElement("input").MustInput("git").MustType(input.Enter)74	text := page.MustElement(".codesearch-results p").MustText()75	fmt.Println(text)76	utils.Pause() // pause goroutine77}78// Rod use https://golang.org/pkg/context to handle cancelations for IO blocking operations, most times it's timeout.79// Context will be recursively passed to all sub-methods.80// For example, methods like Page.Context(ctx) will return a clone of the page with the ctx,81// all the methods of the returned page will use the ctx if they have IO blocking operations.82// Page.Timeout or Page.WithCancel is just a shortcut for Page.Context.83// Of course, Browser or Element works the same way.84func Example_context_and_timeout() {85	page := rod.New().MustConnect().MustPage("https://github.com")86	page.87		// Set a 5-second timeout for all chained methods88		Timeout(5 * time.Second).89		// The total time for MustWaitLoad and MustElement must be less than 5 seconds90		MustWaitLoad().91		MustElement("title").92		// Methods after CancelTimeout won't be affected by the 5-second timeout93		CancelTimeout().94		// Set a 10-second timeout for all chained methods95		Timeout(10 * time.Second).96		// Panics if it takes more than 10 seconds97		MustText()98	// The two code blocks below are basically the same:99	{100		page.Timeout(5 * time.Second).MustElement("a").CancelTimeout()101	}102	{103		// Use this way you can customize your own way to cancel long-running task104		page, cancel := page.WithCancel()105		go func() {106			time.Sleep(time.Duration(rand.Int())) // cancel after randomly time107			cancel()108		}()109		page.MustElement("a")110	}111}112// We use "Must" prefixed functions to write example code. But in production you may want to use113// the no-prefix version of them.114// About why we use "Must" as the prefix, it's similar to https://golang.org/pkg/regexp/#MustCompile115func Example_error_handling() {116	page := rod.New().MustConnect().MustPage("https://mdn.dev")117	// We use Go's standard way to check error types, no magic.118	check := func(err error) {119		var evalErr *rod.ErrEval120		if errors.Is(err, context.DeadlineExceeded) { // timeout error121			fmt.Println("timeout err")122		} else if errors.As(err, &evalErr) { // eval error123			fmt.Println(evalErr.LineNumber)124		} else if err != nil {125			fmt.Println("can't handle", err)126		}127	}128	// The two code blocks below are doing the same thing in two styles:129	// The block below is better for debugging or quick scripting. We use panic to short-circuit logics.130	// So that we can take advantage of fluent interface (https://en.wikipedia.org/wiki/Fluent_interface)131	// and fail-fast (https://en.wikipedia.org/wiki/Fail-fast).132	// This style will reduce code, but it may also catch extra errors (less consistent and precise).133	{134		err := rod.Try(func() {135			fmt.Println(page.MustElement("a").MustHTML()) // use "Must" prefixed functions136		})137		check(err)138	}139	// The block below is better for production code. It's the standard way to handle errors.140	// Usually, this style is more consistent and precise.141	{142		el, err := page.Element("a")143		if err != nil {144			check(err)145			return146		}147		html, err := el.HTML()148		if err != nil {149			check(err)150			return151		}152		fmt.Println(html)153	}154}155// Example_search shows how to use Search to get element inside nested iframes or shadow DOMs.156// It works the same as https://developers.google.com/web/tools/chrome-devtools/dom#search157func Example_search() {158	browser := rod.New().MustConnect()159	defer browser.MustClose()160	page := browser.MustPage("https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe")161	// Click the zoom-in button of the OpenStreetMap162	page.MustSearch(".leaflet-control-zoom-in").MustClick()163	fmt.Println("done")164	// Output: done165}166func Example_page_screenshot() {167	page := rod.New().MustConnect().MustPage("https://github.com").MustWaitLoad()168	// simple version169	page.MustScreenshot("my.png")170	// customization version171	img, _ := page.Screenshot(true, &proto.PageCaptureScreenshot{172		Format:  proto.PageCaptureScreenshotFormatJpeg,173		Quality: gson.Int(90),174		Clip: &proto.PageViewport{175			X:      0,176			Y:      0,177			Width:  300,178			Height: 200,179			Scale:  1,180		},181		FromSurface: true,182	})183	_ = utils.OutputFile("my.jpg", img)184}185func Example_page_pdf() {186	page := rod.New().MustConnect().MustPage("https://github.com").MustWaitLoad()187	// simple version188	page.MustPDF("my.pdf")189	// customized version190	pdf, _ := page.PDF(&proto.PagePrintToPDF{191		PaperWidth:  gson.Num(8.5),192		PaperHeight: gson.Num(11),193		PageRanges:  "1-3",194	})195	_ = utils.OutputFile("my.pdf", pdf)196}197// Show how to handle multiple results of an action.198// Such as when you login a page, the result can be success or wrong password.199func Example_race_selectors() {200	const username = ""201	const password = ""202	browser := rod.New().MustConnect()203	page := browser.MustPage("https://leetcode.com/accounts/login/")204	page.MustElement("#id_login").MustInput(username)205	page.MustElement("#id_password").MustInput(password).MustType(input.Enter)206	// It will keep retrying until one selector has found a match207	elm := page.Race().Element(".nav-user-icon-base").MustHandle(func(e *rod.Element) {208		// print the username after successful login209		fmt.Println(*e.MustAttribute("title"))210	}).Element("[data-cy=sign-in-error]").MustDo()211	if elm.MustMatches("[data-cy=sign-in-error]") {212		// when wrong username or password213		panic(elm.MustText())214	}215}216// Rod uses mouse cursor to simulate clicks, so if a button is moving because of animation, the click may not work as expected.217// We usually use WaitStable to make sure the target isn't changing anymore.218func Example_wait_for_animation() {219	browser := rod.New().MustConnect()220	defer browser.MustClose()221	page := browser.MustPage("https://getbootstrap.com/docs/4.0/components/modal/")222	page.MustWaitLoad().MustElement("[data-target='#exampleModalLive']").MustClick()223	saveBtn := page.MustElementR("#exampleModalLive button", "Close")224	// Here, WaitStable will wait until the button's position and size become stable.225	saveBtn.MustWaitStable().MustClick().MustWaitInvisible()226	fmt.Println("done")227	// Output: done228}229// When you want to wait for an ajax request to complete, this example will be useful.230func Example_wait_for_request() {231	browser := rod.New().MustConnect()232	defer browser.MustClose()233	page := browser.MustPage("https://www.wikipedia.org/").MustWaitLoad()234	// Start to analyze request events235	wait := page.MustWaitRequestIdle()236	// This will trigger the search ajax request237	page.MustElement("#searchInput").MustClick().MustInput("lisp")238	// Wait until there's no active requests239	wait()240	// We want to make sure that after waiting, there are some autocomplete241	// suggestions available.242	fmt.Println(len(page.MustElements(".suggestion-link")) > 0)243	// Output: true244}245// Shows how to change the retry/polling options that is used to query elements.246// This is useful when you want to customize the element query retry logic.247func Example_customize_retry_strategy() {248	browser := rod.New().MustConnect()249	defer browser.MustClose()250	page := browser.MustPage("https://github.com")251	// sleep for 0.5 seconds before every retry252	sleeper := func() utils.Sleeper {253		return func(context.Context) error {254			time.Sleep(time.Second / 2)255			return nil256		}257	}258	el, _ := page.Sleeper(sleeper).Element("input")259	fmt.Println(el.MustProperty("name"))260	// If sleeper is nil page.ElementE will query without retrying.261	// If nothing found it will return an error.262	el, err := page.Sleeper(rod.NotFoundSleeper).Element("input")263	if errors.Is(err, &rod.ErrElementNotFound{}) {264		fmt.Println("element not found")265	} else if err != nil {266		panic(err)267	}268	fmt.Println(el.MustProperty("name"))269	// Output:270	// q271	// q272}273// Shows how we can further customize the browser with the launcher library.274// Usually you use launcher lib to set the browser's command line flags (switches).275// Doc for flags: https://peter.sh/experiments/chromium-command-line-switches276func Example_customize_browser_launch() {277	url := launcher.New().278		Proxy("127.0.0.1:8080").     // set flag "--proxy-server=127.0.0.1:8080"279		Delete("use-mock-keychain"). // delete flag "--use-mock-keychain"280		MustLaunch()281	browser := rod.New().ControlURL(url).MustConnect()282	defer browser.MustClose()283	// So that we don't have to self issue certs for MITM284	browser.MustIgnoreCertErrors(true)285	// Adding authentication to the proxy, for the next auth request.286	// We use CLI tool "mitmproxy --proxyauth user:pass" as an example.287	go browser.MustHandleAuth("user", "pass")()288	// mitmproxy needs a cert config to support https. We use http here instead,289	// for example290	fmt.Println(browser.MustPage("https://mdn.dev/").MustElement("title").MustText())291}292// When rod doesn't have a feature that you need. You can easily call the cdp to achieve it.293// List of cdp API: https://github.com/go-rod/rod/tree/master/lib/proto294func Example_direct_cdp() {295	page := rod.New().MustConnect().MustPage()296	// Rod doesn't have a method to enable AD blocking,297	// but you can call cdp interface directly to achieve it.298	// The two code blocks below are equal to enable AD blocking299	{300		_ = proto.PageSetAdBlockingEnabled{301			Enabled: true,302		}.Call(page)303	}304	{305		// Interact with the cdp JSON API directly306		_, _ = page.Call(context.TODO(), "", "Page.setAdBlockingEnabled", map[string]bool{307			"enabled": true,308		})309	}310}311// Shows how to listen for events.312func Example_handle_events() {313	browser := rod.New().MustConnect()314	defer browser.MustClose()315	page := browser.MustPage()316	done := make(chan struct{})317	// Listen for all events of console output.318	go page.EachEvent(func(e *proto.RuntimeConsoleAPICalled) {319		fmt.Println(page.MustObjectsToJSON(e.Args))320		close(done)321	})()322	wait := page.WaitEvent(&proto.PageLoadEventFired{})323	page.MustNavigate("https://mdn.dev")324	wait()325	// EachEvent allows us to achieve the same functionality as above.326	if false {327		// Subscribe events before they happen, run the "wait()" to start consuming328		// the events. We can return an optional stop signal to unsubscribe events.329		wait := page.EachEvent(func(e *proto.PageLoadEventFired) (stop bool) {330			return true331		})332		page.MustNavigate("https://mdn.dev")333		wait()334	}335	// Or the for-loop style to handle events to do the same thing above.336	if false {337		page.MustNavigate("https://mdn.dev")338		for msg := range page.Event() {339			e := proto.PageLoadEventFired{}340			if msg.Load(&e) {341				break342			}343		}344	}345	page.MustEval(`() => console.log("hello", "world")`)346	<-done347	// Output:348	// [hello world]349}350func Example_download_file() {351	browser := rod.New().MustConnect()352	page := browser.MustPage("https://file-examples.com/index.php/sample-documents-download/sample-pdf-download/")353	wait := browser.MustWaitDownload()354	page.MustElementR("a", "DOWNLOAD SAMPLE PDF FILE").MustClick()355	_ = utils.OutputFile("t.pdf", wait())356}357// Shows how to intercept requests and modify358// both the request and the response.359// The entire process of hijacking one request:360//361//	browser --req-> rod ---> server ---> rod --res-> browser362//363// The --req-> and --res-> are the parts that can be modified.364func Example_hijack_requests() {365	browser := rod.New().MustConnect()366	defer browser.MustClose()367	router := browser.HijackRequests()368	defer router.MustStop()...query_test.go
Source:query_test.go  
...10	"github.com/go-rod/rod/lib/proto"11	"github.com/go-rod/rod/lib/utils"12	"github.com/ysmood/gson"13)14func TestPageElements(t *testing.T) {15	g := setup(t)16	g.page.MustNavigate(g.srcFile("fixtures/input.html"))17	g.page.MustElement("input")18	list := g.page.MustElements("input")19	g.Eq("input", list.First().MustDescribe().LocalName)20	g.Eq("submit", list.Last().MustText())21}22func TestPagesQuery(t *testing.T) {23	g := setup(t)24	b := g.browser25	b.MustPage(g.srcFile("fixtures/click.html")).MustWaitLoad()26	pages := b.MustPages()27	g.True(pages.MustFind("button").MustHas("button"))28	g.Panic(func() { rod.Pages{}.MustFind("____") })29	g.True(pages.MustFindByURL("click.html").MustHas("button"))30	g.Panic(func() { rod.Pages{}.MustFindByURL("____") })31	_, err := pages.Find("____")32	g.Err(err)33	g.Eq(err.Error(), "cannot find page")34	g.Panic(func() {35		pages.MustFindByURL("____")36	})37	g.Panic(func() {38		g.mc.stubErr(1, proto.RuntimeCallFunctionOn{})39		pages.MustFind("button")40	})41	g.Panic(func() {42		g.mc.stubErr(1, proto.RuntimeCallFunctionOn{})43		pages.MustFindByURL("____")44	})45}46func TestPagesOthers(t *testing.T) {47	g := setup(t)48	list := rod.Pages{}49	g.Nil(list.First())50	g.Nil(list.Last())51	list = append(list, &rod.Page{})52	g.NotNil(list.First())53	g.NotNil(list.Last())54}55func TestPageHas(t *testing.T) {56	g := setup(t)57	g.page.MustNavigate(g.srcFile("fixtures/selector.html"))58	g.page.MustElement("body")59	g.True(g.page.MustHas("span"))60	g.False(g.page.MustHas("a"))61	g.True(g.page.MustHasX("//span"))62	g.False(g.page.MustHasX("//a"))63	g.True(g.page.MustHasR("button", "03"))64	g.False(g.page.MustHasR("button", "11"))65	g.mc.stubErr(1, proto.RuntimeCallFunctionOn{})66	g.Err(g.page.HasX("//a"))67	g.mc.stubErr(1, proto.RuntimeCallFunctionOn{})68	g.Err(g.page.HasR("button", "03"))69}70func TestElementHas(t *testing.T) {71	g := setup(t)72	g.page.MustNavigate(g.srcFile("fixtures/selector.html"))73	b := g.page.MustElement("body")74	g.True(b.MustHas("span"))75	g.False(b.MustHas("a"))76	g.True(b.MustHasX("//span"))77	g.False(b.MustHasX("//a"))78	g.True(b.MustHasR("button", "03"))79	g.False(b.MustHasR("button", "11"))80}81func TestSearch(t *testing.T) {82	g := setup(t)83	p := g.page.MustNavigate(g.srcFile("fixtures/click.html"))84	el := p.MustSearch("click me")85	g.Eq("click me", el.MustText())86	g.True(el.MustClick().MustMatches("[a=ok]"))87	_, err := p.Sleeper(rod.NotFoundSleeper).Search("not-exists")88	g.True(errors.Is(err, &rod.ErrElementNotFound{}))89	g.Eq(err.Error(), "cannot find element")90	// when search result is not ready91	{92		g.mc.stub(1, proto.DOMGetSearchResults{}, func(send StubSend) (gson.JSON, error) {93			return gson.New(nil), cdp.ErrCtxNotFound94		})95		p.MustSearch("click me")96	}97	// when node id is zero98	{99		g.mc.stub(1, proto.DOMGetSearchResults{}, func(send StubSend) (gson.JSON, error) {100			return gson.New(proto.DOMGetSearchResultsResult{101				NodeIds: []proto.DOMNodeID{0},102			}), nil103		})104		p.MustSearch("click me")105	}106	g.Panic(func() {107		g.mc.stubErr(1, proto.DOMPerformSearch{})108		p.MustSearch("click me")109	})110	g.Panic(func() {111		g.mc.stubErr(1, proto.DOMGetSearchResults{})112		p.MustSearch("click me")113	})114	g.Panic(func() {115		g.mc.stubErr(1, proto.RuntimeCallFunctionOn{})116		p.MustSearch("click me")117	})118}119func TestSearchElements(t *testing.T) {120	g := setup(t)121	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html"))122	{123		res, err := p.Search("button")124		g.E(err)125		c, err := res.All()126		g.E(err)127		g.Len(c, 4)128		g.mc.stubErr(1, proto.DOMGetSearchResults{})129		g.Err(res.All())130		g.mc.stubErr(1, proto.DOMResolveNode{})131		g.Err(res.All())132	}133	{ // disable retry134		sleeper := func() utils.Sleeper { return utils.CountSleeper(1) }135		_, err := p.Sleeper(sleeper).Search("not-exists")136		g.Err(err)137	}138}139func TestSearchIframes(t *testing.T) {140	g := setup(t)141	p := g.page.MustNavigate(g.srcFile("fixtures/click-iframes.html"))142	el := p.MustSearch("button[onclick]")143	g.Eq("click me", el.MustText())144	g.True(el.MustClick().MustMatches("[a=ok]"))145}146func TestSearchIframesAfterReload(t *testing.T) {147	g := setup(t)148	p := g.page.MustNavigate(g.srcFile("fixtures/click-iframes.html"))149	frame := p.MustElement("iframe").MustFrame().MustElement("iframe").MustFrame()150	frame.MustReload()151	el := p.MustSearch("button[onclick]")152	g.Eq("click me", el.MustText())153	g.True(el.MustClick().MustMatches("[a=ok]"))154}155func TestPageRace(t *testing.T) {156	g := setup(t)157	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html"))158	p.Race().Element("button").MustHandle(func(e *rod.Element) { g.Eq("01", e.MustText()) }).MustDo()159	g.Eq("01", p.Race().Element("button").MustDo().MustText())160	p.Race().ElementX("//button").MustHandle(func(e *rod.Element) { g.Eq("01", e.MustText()) }).MustDo()161	g.Eq("01", p.Race().ElementX("//button").MustDo().MustText())162	p.Race().ElementR("button", "02").MustHandle(func(e *rod.Element) { g.Eq("02", e.MustText()) }).MustDo()163	g.Eq("02", p.Race().ElementR("button", "02").MustDo().MustText())164	p.Race().MustElementByJS("() => document.querySelector('button')", nil).165		MustHandle(func(e *rod.Element) { g.Eq("01", e.MustText()) }).MustDo()166	g.Eq("01", p.Race().MustElementByJS("() => document.querySelector('button')", nil).MustDo().MustText())167	raceFunc := func(p *rod.Page) (*rod.Element, error) {168		el := p.MustElement("button")169		g.Eq("01", el.MustText())170		return el, nil171	}172	p.Race().ElementFunc(raceFunc).MustHandle(func(e *rod.Element) { g.Eq("01", e.MustText()) }).MustDo()173	g.Eq("01", p.Race().ElementFunc(raceFunc).MustDo().MustText())174	el, err := p.Sleeper(func() utils.Sleeper { return utils.CountSleeper(2) }).Race().175		Element("not-exists").MustHandle(func(e *rod.Element) {}).176		ElementX("//not-exists").177		ElementR("not-exists", "test").MustHandle(func(e *rod.Element) {}).178		Do()179	g.Err(err)180	g.Nil(el)181	el, err = p.Race().MustElementByJS(`() => notExists()`, nil).Do()182	g.Err(err)183	g.Nil(el)184}185func TestPageRaceRetryInHandle(t *testing.T) {186	g := setup(t)187	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html"))188	p.Race().Element("div").MustHandle(func(e *rod.Element) {189		go func() {190			utils.Sleep(0.5)191			e.MustElement("button").MustEval(`() => this.innerText = '04'`)192		}()193		e.MustElement("button").MustWait("() => this.innerText === '04'")194	}).MustDo()195}196func TestPageElementX(t *testing.T) {197	g := setup(t)198	g.page.MustNavigate(g.srcFile("fixtures/selector.html"))199	g.page.MustElement("body")200	txt := g.page.MustElementX("//div").MustElementX("./button").MustText()201	g.Eq(txt, "02")202}203func TestPageElementsX(t *testing.T) {204	g := setup(t)205	g.page.MustNavigate(g.srcFile("fixtures/selector.html"))206	g.page.MustElement("body")207	list := g.page.MustElementsX("//button")208	g.Len(list, 4)209}210func TestElementR(t *testing.T) {211	g := setup(t)212	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html"))213	el := p.MustElementR("button", `\d1`)214	g.Eq("01", el.MustText())215	el = p.MustElement("div").MustElementR("button", `03`)216	g.Eq("03", el.MustText())217	p = g.page.MustNavigate(g.srcFile("fixtures/input.html"))218	el = p.MustElementR("input", `submit`)219	g.Eq("submit", el.MustText())220	el = p.MustElementR("input", `placeholder`)221	g.Eq("blur", *el.MustAttribute("id"))222	el = p.MustElementR("option", `/cc/i`)223	g.Eq("CC", el.MustText())224}225func TestElementFromElement(t *testing.T) {226	g := setup(t)227	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html"))228	el := p.MustElement("div").MustElement("button")229	g.Eq("02", el.MustText())230}231func TestElementsFromElement(t *testing.T) {232	g := setup(t)233	p := g.page.MustNavigate(g.srcFile("fixtures/input.html"))234	el := p.MustElement("form")235	list := p.MustElement("form").MustElements("option")236	g.Len(list, 4)237	g.Eq("B", list[1].MustText())238	g.mc.stubErr(1, proto.RuntimeCallFunctionOn{})239	g.Err(el.Elements("input"))240}241func TestElementParent(t *testing.T) {242	g := setup(t)243	p := g.page.MustNavigate(g.srcFile("fixtures/input.html"))244	el := p.MustElement("input").MustParent()245	g.Eq("FORM", el.MustEval(`() => this.tagName`).String())246}247func TestElementParents(t *testing.T) {248	g := setup(t)249	p := g.page.MustNavigate(g.srcFile("fixtures/input.html"))250	g.Len(p.MustElement("option").MustParents("*"), 4)251	g.Len(p.MustElement("option").MustParents("form"), 1)252}253func TestElementSiblings(t *testing.T) {254	g := setup(t)255	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html"))256	el := p.MustElement("div")257	a := el.MustPrevious()258	b := el.MustNext()259	g.Eq(a.MustText(), "01")260	g.Eq(b.MustText(), "04")261}262func TestElementFromElementX(t *testing.T) {263	g := setup(t)264	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html"))265	el := p.MustElement("div").MustElementX("./button")266	g.Eq("02", el.MustText())267}268func TestElementsFromElementsX(t *testing.T) {269	g := setup(t)270	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html"))271	list := p.MustElement("div").MustElementsX("./button")272	g.Len(list, 2)273}274func TestElementTracing(t *testing.T) {275	g := setup(t)276	g.browser.Trace(true)277	g.browser.Logger(utils.LoggerQuiet)278	defer func() {279		g.browser.Trace(defaults.Trace)280		g.browser.Logger(rod.DefaultLogger)281	}()282	p := g.page.MustNavigate(g.srcFile("fixtures/click.html"))283	g.Eq(`rod.element("code") html`, p.MustElement("html").MustElement("code").MustText())284}285func TestPageElementByJS(t *testing.T) {286	g := setup(t)287	p := g.page.MustNavigate(g.srcFile("fixtures/click.html"))288	g.Eq(p.MustElementByJS(`() => document.querySelector('button')`).MustText(), "click me")289	_, err := p.ElementByJS(rod.Eval(`() => 1`))290	g.Is(err, &rod.ErrExpectElement{})291	g.Eq(err.Error(), "expect js to return an element, but got: {\"type\":\"number\",\"value\":1,\"description\":\"1\"}")292}293func TestPageElementsByJS(t *testing.T) {294	g := setup(t)295	p := g.page.MustNavigate(g.srcFile("fixtures/selector.html")).MustWaitLoad()296	g.Len(p.MustElementsByJS("() => document.querySelectorAll('button')"), 4)297	_, err := p.ElementsByJS(rod.Eval(`() => [1]`))298	g.Is(err, &rod.ErrExpectElements{})299	g.Eq(err.Error(), "expect js to return an array of elements, but got: {\"type\":\"number\",\"value\":1,\"description\":\"1\"}")300	_, err = p.ElementsByJS(rod.Eval(`() => 1`))301	g.Eq(err.Error(), "expect js to return an array of elements, but got: {\"type\":\"number\",\"value\":1,\"description\":\"1\"}")302	_, err = p.ElementsByJS(rod.Eval(`() => foo()`))303	g.Err(err)304	g.mc.stubErr(1, proto.RuntimeGetProperties{})305	_, err = p.ElementsByJS(rod.Eval(`() => [document.body]`))306	g.Err(err)307	g.mc.stubErr(4, proto.RuntimeCallFunctionOn{})308	g.Err(p.Elements("button"))309}310func TestPageElementTimeout(t *testing.T) {311	g := setup(t)312	page := g.page.MustNavigate(g.blank())313	start := time.Now()314	_, err := page.Timeout(300 * time.Millisecond).Element("not-exists")315	g.Is(err, context.DeadlineExceeded)316	g.Gte(time.Since(start), 300*time.Millisecond)317}318func TestPageElementMaxRetry(t *testing.T) {319	g := setup(t)320	page := g.page.MustNavigate(g.blank())321	s := func() utils.Sleeper { return utils.CountSleeper(5) }322	_, err := page.Sleeper(s).Element("not-exists")323	g.Is(err, &utils.ErrMaxSleepCount{})324}325func TestElementsOthers(t *testing.T) {326	g := setup(t)327	list := rod.Elements{}328	g.Nil(list.First())329	g.Nil(list.Last())330}...use_gorod.go
Source:use_gorod.go  
...91	// Custom function to add script tag with its content to body92	addScriptTagToBody := func(p *rod.Page, value string) error {93		var addScriptHelper = &js.Function{94			Name:         "addScriptTagToBody",95			Definition:   `function(e,t,n){if(!document.getElementById(e))return new Promise((i,o)=>{var s=document.createElement("script");t?(s.src=t,s.onload=i):(s.type="text/javascript",s.text=n,i()),s.id=e,s.onerror=o,document.body.appendChild(s)})}`,96			Dependencies: []*js.Function{},97		}98		hash := md5.Sum([]byte(value))99		id := hex.EncodeToString(hash[:])100		script := rod.EvalHelper(addScriptHelper, id, "", value)101		_, err := p.Evaluate(script.ByPromise())102		return err103	}104	headElement := page.MustElement("head")105	// prevent execution of tracking such as google analytics, gtm, or facebook106	// let's start by scanning the head section107	for _, s := range headElement.MustElements("script") {108		if strings.Contains(s.MustHTML(), "googletagmanager.com") {109			s.MustRemove()110		}111	}112	bodyElement := page.MustElement("body")113	bodyElement.MustElement("noscript").MustRemove()114	err = addScriptTagToBody(page, jsInjection)115	//err = page.AddScriptTag("", jsInjection) // this one adding script tag on head section116	if err != nil {117		_, _ = fmt.Fprint(w, "")118		return119	}120	wait()121	page.MustWaitIdle().MustElement("body.page-completed")122	htmlRootElement, err2 := bodyElement.Parent()123	if err2 != nil {124		_, _ = fmt.Fprint(w, "")125		return126	}127	htmlResult := htmlRootElement.MustHTML()128	//_ = ioutil.WriteFile("rendered.html", []byte(htmlResult), os.ModePerm)129	_, _ = fmt.Fprintln(w, htmlResult)130}Element
Using AI Code Generation
1import (2func main() {3	browser := rod.New().Connect()4	page.Element("input[name=q]").Input("rod").Press(input.Enter)5	page.Screenshot("screenshot.png")6	fmt.Println("Screenshot saved to screenshot.png")7	browser.Close()8}Element
Using AI Code Generation
1import (2func main() {3	l := launcher.New().Bin("/usr/bin/chromium").Headless(false).MustLaunch()4	defer l.Close()5	browser := rod.New().ControlURL(l).MustConnect()6	defer browser.MustClose()7	page.MustElement("input[name=q]").MustInput("rod")8	page.MustElement("input[name=btnK]").MustClick()9	fmt.Println(page.MustElement("h3").MustText())10}11import (12func main() {13	l := launcher.New().Bin("/usr/bin/chromium").Headless(false).MustLaunch()14	defer l.Close()15	browser := rod.New().ControlURL(l).MustConnect()16	defer browser.MustClose()17	page.MustElement("input[name=q]").MustInput("rod")18	page.MustElement("input[name=btnK]").MustClick()19	page.MustElement("h3").MustElement("a").MustClick()20	fmt.Println(page.MustElement("h1").MustText())21}22import (23func main() {24	l := launcher.New().Bin("/usr/bin/chromium").Headless(false).MustLaunch()25	defer l.Close()26	browser := rod.New().ControlURL(l).MustConnect()27	defer browser.MustClose()28	page.MustElement("input[name=q]").MustInput("rod")29	page.MustElement("input[name=btnK]").MustClick()30	page.MustElement("h3").MustElement("a").MustClick()31	fmt.Println(page.MustElement("h1").MustText())32}33import (34func main() {35	l := launcher.New().Bin("/usrElement
Using AI Code Generation
1import (2func main() {3	browser := rod.New().Connect()4	title := page.Element("title").Text()5	fmt.Println(title)6}7import (8func main() {9	browser := rod.New().Connect()10	title := page.Element("title").Text()11	fmt.Println(title)12}13import (14func main() {15	browser := rod.New().Connect()16	links := page.Elements("a")17	for _, link := range links {18		fmt.Println(link.Text())19	}20}21import (22func main() {23	browser := rod.New().Connect()24	fmt.Println(title)25}26import (27func main() {28	browser := rod.New().Connect()Element
Using AI Code Generation
1import (2func main() {3	browser := rod.New().Connect()4	element := page.Element("input[name=q]")5	fmt.Println(element)6}7import (8func main() {9	browser := rod.New().Connect()10	element := page.ElementX("/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input")11	fmt.Println(element)12}13import (14func main() {15	browser := rod.New().Connect()16	elements := page.Elements("input[name=q]")17	fmt.Println(elements)18}19import (20func main() {21	browser := rod.New().Connect()22	elements := page.ElementsX("/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input")23	fmt.Println(elements)24}25import (26func main() {27	browser := rod.New().Connect()Element
Using AI Code Generation
1import (2func main() {3    browser := rod.New().MustConnect()4    defer browser.MustClose()5    page := browser.MustPage("")6    defer page.MustClose()7    title := page.MustNavigate("Element
Using AI Code Generation
1import (2func main() {3	el := page.Element("input[name=q]")4	fmt.Println(el)5}6import (7func main() {8	el := page.Elements("input[name=q]")9	fmt.Println(el)10}11import (12func main() {13	el := page.ElementR("input[name=q]")14	fmt.Println(el)15}16import (17func main() {18	el := page.ElementsR("input[name=q]")19	fmt.Println(el)20}21import (22func main() {23	el := page.ElementX("input[name=q]")24	fmt.Println(el)25}26import (27func main() {28	el := page.ElementsX("input[name=q]")29	fmt.Println(el)30}31import (32func main() {33	el := page.ElementXFrom("input[name=q]", page)34	fmt.Println(el)35}36import (Element
Using AI Code Generation
1import (2func main() {3	browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()4	input := page.MustElement("input[name=q]")5	input.MustInput("rod").MustPress(input.Enter)6	page.MustWaitLoad()7	stats := page.MustElement(".g").MustText()8	fmt.Println(stats)9}10import (11func main() {12	browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()13	input.MustInput("rod").MustPress(input.Enter)14	page.MustWaitLoad()15	stats := page.MustElement(".g").MustText()16	fmt.Println(stats)17}18import (19func main() {Element
Using AI Code Generation
1import (2func main() {3	browser := rod.New().MustConnect()4	element := page.MustElement("input[name=q]")5	fmt.Println(element.MustText())6}Element
Using AI Code Generation
1func main() {2	r.Element()3}4func main() {5	r.Element()6}7func main() {8	r.Element()9}10func main() {11	r.Element()12}13func main() {14	r.Element()15}16func main() {17	r.Element()18}19func main() {20	r.Element()21}22func main() {23	r.Element()24}Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
