Best Rod code snippet using rod.EachEvent
browser.go
Source:browser.go  
...254	// Such as proto.PageAddScriptToEvaluateOnNewDocument won't work.255	page.EnableDomain(&proto.PageEnable{})256	return page, nil257}258// EachEvent is similar to Page.EachEvent, but catches events of the entire browser.259func (b *Browser) EachEvent(callbacks ...interface{}) (wait func()) {260	return b.eachEvent("", callbacks...)261}262// WaitEvent waits for the next event for one time. It will also load the data into the event object.263func (b *Browser) WaitEvent(e proto.Event) (wait func()) {264	return b.waitEvent("", e)265}266// waits for the next event for one time. It will also load the data into the event object.267func (b *Browser) waitEvent(sessionID proto.TargetSessionID, e proto.Event) (wait func()) {268	valE := reflect.ValueOf(e)269	valTrue := reflect.ValueOf(true)270	if valE.Kind() != reflect.Ptr {271		valE = reflect.New(valE.Type())272	}273	// dynamically creates a function on runtime:274	//275	// func(ee proto.Event) bool {276	//   *e = *ee277	//   return true278	// }279	fnType := reflect.FuncOf([]reflect.Type{valE.Type()}, []reflect.Type{valTrue.Type()}, false)280	fnVal := reflect.MakeFunc(fnType, func(args []reflect.Value) []reflect.Value {281		valE.Elem().Set(args[0].Elem())282		return []reflect.Value{valTrue}283	})284	return b.eachEvent(sessionID, fnVal.Interface())285}286// If the any callback returns true the event loop will stop.287// It will enable the related domains if not enabled, and restore them after wait ends.288func (b *Browser) eachEvent(sessionID proto.TargetSessionID, callbacks ...interface{}) (wait func()) {289	cbMap := map[string]reflect.Value{}290	restores := []func(){}291	for _, cb := range callbacks {292		cbVal := reflect.ValueOf(cb)293		eType := cbVal.Type().In(0)294		name := reflect.New(eType.Elem()).Interface().(proto.Event).ProtoEvent()295		cbMap[name] = cbVal296		// Only enabled domains will emit events to cdp client.297		// We enable the domains for the event types if it's not enabled.298		// We restore the domains to their previous states after the wait ends.299		domain, _ := proto.ParseMethodName(name)300		if req := proto.GetType(domain + ".enable"); req != nil {301			enable := reflect.New(req).Interface().(proto.Request)302			restores = append(restores, b.EnableDomain(sessionID, enable))303		}304	}305	b, cancel := b.WithCancel()306	messages := b.Event()307	return func() {308		if messages == nil {309			panic("can't use wait function twice")310		}311		defer func() {312			cancel()313			messages = nil314			for _, restore := range restores {315				restore()316			}317		}()318		for msg := range messages {319			if !(sessionID == "" || msg.SessionID == sessionID) {320				continue321			}322			if cbVal, has := cbMap[msg.Method]; has {323				e := reflect.New(proto.GetType(msg.Method))324				msg.Load(e.Interface().(proto.Event))325				args := []reflect.Value{e}326				if cbVal.Type().NumIn() == 2 {327					args = append(args, reflect.ValueOf(msg.SessionID))328				}329				res := cbVal.Call(args)330				if len(res) > 0 {331					if res[0].Bool() {332						return333					}334				}335			}336		}337	}338}339// Event of the browser340func (b *Browser) Event() <-chan *Message {341	src := b.event.Subscribe()342	dst := make(chan *Message)343	go func() {344		defer b.event.Unsubscribe(src)345		defer close(dst)346		for {347			select {348			case <-b.ctx.Done():349				return350			case e, ok := <-src:351				if !ok {352					return353				}354				select {355				case <-b.ctx.Done():356					return357				case dst <- e.(*Message):358				}359			}360		}361	}()362	return dst363}364func (b *Browser) initEvents() {365	b.event = goob.New()366	go func() {367		defer b.event.Close()368		for e := range b.client.Event() {369			b.event.Publish(&Message{370				SessionID: proto.TargetSessionID(e.SessionID),371				Method:    e.Method,372				lock:      &sync.Mutex{},373				data:      e.Params,374			})375		}376	}()377}378func (b *Browser) pageInfo(id proto.TargetTargetID) (*proto.TargetTargetInfo, error) {379	res, err := proto.TargetGetTargetInfo{TargetID: id}.Call(b)380	if err != nil {381		return nil, err382	}383	return res.TargetInfo, nil384}385// IgnoreCertErrors switch. If enabled, all certificate errors will be ignored.386func (b *Browser) IgnoreCertErrors(enable bool) error {387	return proto.SecuritySetIgnoreCertificateErrors{Ignore: enable}.Call(b)388}389// GetCookies from the browser390func (b *Browser) GetCookies() ([]*proto.NetworkCookie, error) {391	res, err := proto.StorageGetCookies{BrowserContextID: b.BrowserContextID}.Call(b)392	if err != nil {393		return nil, err394	}395	return res.Cookies, nil396}397// SetCookies to the browser. If the cookies is nil it will clear all the cookies.398func (b *Browser) SetCookies(cookies []*proto.NetworkCookieParam) error {399	if cookies == nil {400		return proto.StorageClearCookies{BrowserContextID: b.BrowserContextID}.Call(b)401	}402	return proto.StorageSetCookies{403		Cookies:          cookies,404		BrowserContextID: b.BrowserContextID,405	}.Call(b)406}407// WaitDownload returns a helper to get the next download file.408// The file path will be:409//     filepath.Join(dir, info.GUID)410func (b *Browser) WaitDownload(dir string) func() (info *proto.PageDownloadWillBegin) {411	var oldDownloadBehavior proto.BrowserSetDownloadBehavior412	has := b.LoadState("", &oldDownloadBehavior)413	_ = proto.BrowserSetDownloadBehavior{414		Behavior:         proto.BrowserSetDownloadBehaviorBehaviorAllowAndName,415		BrowserContextID: b.BrowserContextID,416		DownloadPath:     dir,417	}.Call(b)418	var start *proto.PageDownloadWillBegin419	waitProgress := b.EachEvent(func(e *proto.PageDownloadWillBegin) {420		start = e421	}, func(e *proto.PageDownloadProgress) bool {422		return start.GUID == e.GUID && e.State == proto.PageDownloadProgressStateCompleted423	})424	return func() *proto.PageDownloadWillBegin {425		defer func() {426			if has {427				_ = oldDownloadBehavior.Call(b)428			} else {429				_ = proto.BrowserSetDownloadBehavior{430					Behavior:         proto.BrowserSetDownloadBehaviorBehaviorDefault,431					BrowserContextID: b.BrowserContextID,432				}.Call(b)433			}...main.go
Source:main.go  
...31	save.MustEval(`document.getElementById('autoCloseInput').click()`)32	save.MustNavigate("chrome-extension://cpneebmdjnifhgajfhmcjmdkoknohimd/src/extension/core/bg/background.html").MustWaitLoad()33	var wg sync.WaitGroup34	var pages sync.Map35	go b.EachEvent(func(e *proto.TargetTargetCreated) {36		switch e.TargetInfo.Type {37		case proto.TargetTargetInfoTypePage:38			{39				_, loaded := pages.LoadOrStore(e.TargetInfo.TargetID, e.TargetInfo)40				if !loaded {41					wg.Add(1)42				}43			}44		}45	})()46	go b.EachEvent(func(e *proto.TargetTargetDestroyed) {47		_, loaded := pages.Load(e.TargetID)48		if loaded {49			wg.Done()50		}51	})()52	// create a new page53	p := b.MustPage().Context(ctx)54	// inject js for some special usage55	p.MustEvalOnNewDocument(preScript)56	p.MustNavigate(defaultUrl).MustWaitLoad()57	//p.EnableDomain(proto.NetworkEnable{})58	//go p.EachEvent(func(e *proto.NetworkRequestWillBeSent) {59	//	fmt.Printf("NetworkRequestWillBeSent %+v\n", e)60	//})()61	//go p.EachEvent(func(e *proto.NetworkResponseReceived) {62	//	fmt.Printf("NetworkResponseReceived  %+v\n", e)63	//})()64	// in this example, it slowly scrolls to the bottom for those lazy loading images65	duration := p.MustEval(postScript)66	// the post script can define how long we wait67	time.Sleep(time.Millisecond * time.Duration(duration.Int()))68	// save page with singlefile69	// https://github.com/puppeteer/puppeteer/issues/2486#issuecomment-60211604770	save.MustEval(`chrome.tabs.query({ active: true }, tabs => {71	chrome.browserAction.onClicked.dispatch(tabs[0]);72})`)73	wg.Wait()74	// check the file path75}...pdq.go
Source:pdq.go  
...14	return browser15}16//Listens for a page load event and gets pageload metrics and memory usage17func onPageLoadEventFired(page *rod.Page, quit chan bool) func() {18	wait := page.EachEvent(19		func(p *proto.PageLoadEventFired) {20			select {21			case <-quit:22				close(quit)23				return24			default:25				getPageLoadTimingsOverlay(page)26				logMemoryUsage(page)27				quit <- true28				break29			}30		})31	return wait32}33//Listens for a target change event, gets FPS overlay, and waits for page load events34func onTargetInfoChanged(browser *rod.Browser) func() {35	wait := browser.EachEvent(36		func(t *proto.TargetTargetInfoChanged) {37			quit := make(chan bool)38			if url != t.TargetInfo.URL {39				page, err := browser.PageFromTarget(t.TargetInfo.TargetID)40				explain(err)41				getShowFPSCounterOverlay(page)42				w := onPageLoadEventFired(page, quit)43				go w()44				url = t.TargetInfo.URL45			}46		})47	return wait48}...EachEvent
Using AI Code Generation
1import (2func main() {3		Set("disable-web-security", true)4	url := l.MustLaunch()5	page.MustElement("input[name=q]").MustInput("rod")6	page.MustElement("input[name=q]").MustPress(proto.InputKeyEventEnter)7	page.MustEachEvent("Page.frameNavigated", func(e *proto.PageFrameNavigated) {8		fmt.Println(e.Frame.Id)9	})10	kit.Sleep(5 * time.Second)11}EachEvent
Using AI Code Generation
1import (2func main() {3    l := launcher.New().Headless(false)4    defer l.Cleanup()5    browser := rod.New().ControlURL(l).MustConnect()6    defer browser.MustClose()7    page.MustElement("input").MustInput("rod")8    page.MustElement("input").MustPress("Enter")9    page.MustWaitLoad().MustElement("h3").MustWaitVisible()10    fmt.Println(page.MustElement("h3").MustText())11    page.MustElement("h3").MustClick()12    page.MustWaitLoad()13    fmt.Println(page.MustTitle())14    page.MustEachEvent(func(e *proto.NetworkResponseReceived) {15        fmt.Println(e.RequestId, e.Response.Url)16    })17    page.MustEachEvent(func(e *proto.NetworkResponseReceived) bool {18        fmt.Println(e.RequestId, e.Response.Url)19    })20    page.MustEachEvent(func(e *proto.NetworkResponseReceived) bool {21        fmt.Println(e.RequestId, e.Response.Url)22    })23    page.MustEachEvent(func(e *proto.NetworkResponseReceived) bool {24        fmt.Println(e.RequestId, e.Response.Url)25    }, proto.NetworkResponseReceived)26    page.MustEachEvent(func(e *proto.NetworkResponseReceived) bool {27        fmt.Println(e.RequestId, e.Response.Url)28    }, proto.NetworkResponseReceived, proto.NetworkLoadingFinished)29    page.MustEachEvent(func(e *proto.NetworkResponseReceived) bool {30        fmt.Println(e.RequestId, e.Response.Url)31    }, proto.NetworkResponseReceived, proto.NetworkLoadingFinished, proto.NetworkLoadingFailed)32    page.MustEachEvent(func(e *proto.NetworkResponseReceived) bool {33        fmt.Println(e.RequestId, e.Response.Url)EachEvent
Using AI Code Generation
1import (2func main() {3    l := launcher.New().Headless(false).Delete(true)4    defer l.Cleanup()5    browser := rod.New().ControlURL(l).MustConnect()6    page.MustWaitLoad()7    input := page.MustElement("input[name='q']")8    input.MustFocus()9    input.MustInput("rod")10    input.MustPress(input.Enter)11    page.MustWaitLoad()12    el := page.MustElement(".g>.rc>.r>a")13    link := el.MustProperty("href")14    fmt.Println(link)15    page.MustElement("body").MustClick("middle", input.Shift)16    page.MustWaitLoad()17    browser.MustClose()18}19import (20func main() {21    l := launcher.New().Headless(false).Delete(true)22    defer l.Cleanup()23    browser := rod.New().ControlEachEvent
Using AI Code Generation
1import (2func main() {3	browser := rod.New().Connect()4	page := browser.Page("")5	page.WaitLoad()6	input := page.Element("#lst-ib")7	input.Input("Hello world")8	page.Element("#tsf > div.tsf-p > div.jsb > center > input[type=\"submit\"]:nth-child(1)").Click()9	page.WaitLoad()10	fmt.Println(page.Title())11	links := page.Elements("a")12	for _, link := range links {13		fmt.Println(link.Text())14	}15	links = page.Elements("a")16	for _, link := range links {17		fmt.Println(link.Text())18	}19	page.EachEvent(func(e *proto.NetworkRequestWillBeSent) {20		fmt.Println(e.Request.URL)21	})22}EachEvent
Using AI Code Generation
1import (2func main() {3	browser := rod.New().MustConnect()4	defer browser.MustClose()5	page.MustElement("#tsf > div:nth-child(2) > div > div.RNNXgb > div > div.a4bIc > input").MustInput("Rod Page")6	page.MustElement("#tsf > div:nth-child(2) > div > div.FPdoLc.lJ9FBc > center > input.gNO89b").MustClick()EachEvent
Using AI Code Generation
1import (2func main() {3	browser := rod.New().Connect()4	page.EachEvent("console", func(e *rod.Event) {5		fmt.Println(e)6	})7}EachEvent
Using AI Code Generation
1import (2func main() {3	l := launcher.New().Headless(false)4	defer l.Cleanup()5	browser := rod.New().Client(l.Client()).Connect()6	page.WaitLoad()7	title := page.Element("title").Text()8	fmt.Println(title)9	url := page.URL()10	fmt.Println(url)11	links := page.Elements("a")12	fmt.Println(links)13	source := page.HTML()14	fmt.Println(source)15	cookies := page.Cookies()16	fmt.Println(cookies)17	size := page.Viewport()18	fmt.Println(size)19	screenshot := page.Screenshot()20	fmt.Println(screenshot)21	pdf := page.PDF()22	fmt.Println(pdf)23	element := page.Element("body")24	fmt.Println(element)25	elements := page.Elements("body")26	fmt.Println(elements)27	text := page.Element("body").Text()28	fmt.Println(text)29	html := page.Element("body").HTML()30	fmt.Println(html)31	attribute := page.Element("body").Attribute("class")32	fmt.Println(attribute)33	property := page.Element("body").Property("class")34	fmt.Println(property)35	style := page.Element("body").Style("color")36	fmt.Println(style)37	visibleText := page.Element("body").VisibleText()38	fmt.Println(visibleText)39	boundingBox := page.Element("body").BoundingBoxLearn 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!!
