How to use ElementsX method of rod Package

Best Rod code snippet using rod.ElementsX

query.go

Source:query.go Github

copy

Full Screen

...166// Elements returns all elements that match the css selector167func (p *Page) Elements(selector string) (Elements, error) {168 return p.ElementsByJS(evalHelper(js.Elements, selector))169}170// ElementsX returns all elements that match the XPath selector171func (p *Page) ElementsX(xpath string) (Elements, error) {172 return p.ElementsByJS(evalHelper(js.ElementsX, xpath))173}174// ElementsByJS returns the elements from the return value of the js175func (p *Page) ElementsByJS(opts *EvalOptions) (Elements, error) {176 res, err := p.Evaluate(opts.ByObject())177 if err != nil {178 return nil, err179 }180 if res.Subtype != proto.RuntimeRemoteObjectSubtypeArray {181 return nil, &ErrExpectElements{res}182 }183 defer func() { err = p.Release(res) }()184 list, err := proto.RuntimeGetProperties{185 ObjectID: res.ObjectID,186 OwnProperties: true,187 }.Call(p)188 if err != nil {189 return nil, err190 }191 elemList := Elements{}192 for _, obj := range list.Result {193 if obj.Name == "__proto__" || obj.Name == "length" {194 continue195 }196 val := obj.Value197 if val.Subtype != proto.RuntimeRemoteObjectSubtypeNode {198 return nil, &ErrExpectElements{val}199 }200 el, err := p.ElementFromObject(val)201 if err != nil {202 return nil, err203 }204 elemList = append(elemList, el)205 }206 return elemList, err207}208// Search for the given query in the DOM tree until the result count is not zero, before that it will keep retrying.209// The query can be plain text or css selector or xpath.210// It will search nested iframes and shadow doms too.211func (p *Page) Search(query string) (*SearchResult, error) {212 sr := &SearchResult{213 page: p,214 restore: p.EnableDomain(proto.DOMEnable{}),215 }216 err := utils.Retry(p.ctx, p.sleeper(), func() (bool, error) {217 if sr.DOMPerformSearchResult != nil {218 _ = proto.DOMDiscardSearchResults{SearchID: sr.SearchID}.Call(p)219 }220 res, err := proto.DOMPerformSearch{221 Query: query,222 IncludeUserAgentShadowDOM: true,223 }.Call(p)224 if err != nil {225 return true, err226 }227 sr.DOMPerformSearchResult = res228 if res.ResultCount == 0 {229 return false, nil230 }231 result, err := proto.DOMGetSearchResults{232 SearchID: res.SearchID,233 FromIndex: 0,234 ToIndex: 1,235 }.Call(p)236 if err != nil {237 // when the page is still loading the search result is not ready238 if errors.Is(err, cdp.ErrCtxNotFound) ||239 errors.Is(err, cdp.ErrSearchSessionNotFound) {240 return false, nil241 }242 return true, err243 }244 id := result.NodeIds[0]245 // TODO: This is definitely a bad design of cdp, hope they can optimize it in the future.246 // It's unnecessary to ask the user to explicitly call it.247 //248 // When the id is zero, it means the proto.DOMDocumentUpdated has fired which will249 // invlidate all the existing NodeID. We have to call proto.DOMGetDocument250 // to reset the remote browser's tracker.251 if id == 0 {252 _, _ = proto.DOMGetDocument{}.Call(p)253 return false, nil254 }255 el, err := p.ElementFromNode(&proto.DOMNode{NodeID: id})256 if err != nil {257 return true, err258 }259 sr.First = el260 return true, nil261 })262 if err != nil {263 return nil, err264 }265 return sr, nil266}267// SearchResult handler268type SearchResult struct {269 *proto.DOMPerformSearchResult270 page *Page271 restore func()272 // First element in the search result273 First *Element274}275// Get l elements at the index of i from the remote search result.276func (s *SearchResult) Get(i, l int) (Elements, error) {277 result, err := proto.DOMGetSearchResults{278 SearchID: s.SearchID,279 FromIndex: i,280 ToIndex: i + l,281 }.Call(s.page)282 if err != nil {283 return nil, err284 }285 list := Elements{}286 for _, id := range result.NodeIds {287 el, err := s.page.ElementFromNode(&proto.DOMNode{NodeID: id})288 if err != nil {289 return nil, err290 }291 list = append(list, el)292 }293 return list, nil294}295// All returns all elements296func (s *SearchResult) All() (Elements, error) {297 return s.Get(0, s.ResultCount)298}299// Release the remote search result300func (s *SearchResult) Release() {301 s.restore()302 _ = proto.DOMDiscardSearchResults{SearchID: s.SearchID}.Call(s.page)303}304type raceBranch struct {305 condition func(*Page) (*Element, error)306 callback func(*Element) error307}308// RaceContext stores the branches to race309type RaceContext struct {310 page *Page311 branches []*raceBranch312}313// Race creates a context to race selectors314func (p *Page) Race() *RaceContext {315 return &RaceContext{page: p}316}317// Element the doc is similar to MustElement318func (rc *RaceContext) Element(selector string) *RaceContext {319 rc.branches = append(rc.branches, &raceBranch{320 condition: func(p *Page) (*Element, error) { return p.Element(selector) },321 })322 return rc323}324// ElementX the doc is similar to ElementX325func (rc *RaceContext) ElementX(selector string) *RaceContext {326 rc.branches = append(rc.branches, &raceBranch{327 condition: func(p *Page) (*Element, error) { return p.ElementX(selector) },328 })329 return rc330}331// ElementR the doc is similar to ElementR332func (rc *RaceContext) ElementR(selector, regex string) *RaceContext {333 rc.branches = append(rc.branches, &raceBranch{334 condition: func(p *Page) (*Element, error) { return p.ElementR(selector, regex) },335 })336 return rc337}338// ElementByJS the doc is similar to MustElementByJS339func (rc *RaceContext) ElementByJS(opts *EvalOptions) *RaceContext {340 rc.branches = append(rc.branches, &raceBranch{341 condition: func(p *Page) (*Element, error) { return p.ElementByJS(opts) },342 })343 return rc344}345// Handle adds a callback function to the most recent chained selector.346// The callback function is run, if the corresponding selector is347// present first, in the Race condition.348func (rc *RaceContext) Handle(callback func(*Element) error) *RaceContext {349 rc.branches[len(rc.branches)-1].callback = callback350 return rc351}352// Do the race353func (rc *RaceContext) Do() (*Element, error) {354 var el *Element355 err := utils.Retry(rc.page.ctx, rc.page.sleeper(), func() (stop bool, err error) {356 for _, branch := range rc.branches {357 bEl, err := branch.condition(rc.page.Sleeper(NotFoundSleeper))358 if err == nil {359 el = bEl.Sleeper(rc.page.sleeper)360 if branch.callback != nil {361 err = branch.callback(el)362 }363 return true, err364 } else if !errors.Is(err, &ErrElementNotFound{}) {365 return true, err366 }367 }368 return369 })370 return el, err371}372// Has an element that matches the css selector373func (el *Element) Has(selector string) (bool, *Element, error) {374 el, err := el.Element(selector)375 if errors.Is(err, &ErrElementNotFound{}) {376 return false, nil, nil377 }378 return err == nil, el, err379}380// HasX an element that matches the XPath selector381func (el *Element) HasX(selector string) (bool, *Element, error) {382 el, err := el.ElementX(selector)383 if errors.Is(err, &ErrElementNotFound{}) {384 return false, nil, nil385 }386 return err == nil, el, err387}388// HasR returns true if a child element that matches the css selector and its text matches the jsRegex.389func (el *Element) HasR(selector, jsRegex string) (bool, *Element, error) {390 el, err := el.ElementR(selector, jsRegex)391 if errors.Is(err, &ErrElementNotFound{}) {392 return false, nil, nil393 }394 return err == nil, el, err395}396// Element returns the first child that matches the css selector397func (el *Element) Element(selector string) (*Element, error) {398 return el.ElementByJS(evalHelper(js.Element, selector))399}400// ElementR returns the first child element that matches the css selector and its text matches the jsRegex.401func (el *Element) ElementR(selector, jsRegex string) (*Element, error) {402 return el.ElementByJS(evalHelper(js.ElementR, selector, jsRegex))403}404// ElementX returns the first child that matches the XPath selector405func (el *Element) ElementX(xPath string) (*Element, error) {406 return el.ElementByJS(evalHelper(js.ElementX, xPath))407}408// ElementByJS returns the element from the return value of the js409func (el *Element) ElementByJS(opts *EvalOptions) (*Element, error) {410 e, err := el.page.Sleeper(NotFoundSleeper).ElementByJS(opts.This(el.Object))411 if err != nil {412 return nil, err413 }414 return e.Sleeper(el.sleeper), nil415}416// Parent returns the parent element in the DOM tree417func (el *Element) Parent() (*Element, error) {418 return el.ElementByJS(Eval(`this.parentElement`))419}420// Parents that match the selector421func (el *Element) Parents(selector string) (Elements, error) {422 return el.ElementsByJS(evalHelper(js.Parents, selector))423}424// Next returns the next sibling element in the DOM tree425func (el *Element) Next() (*Element, error) {426 return el.ElementByJS(Eval(`this.nextElementSibling`))427}428// Previous returns the previous sibling element in the DOM tree429func (el *Element) Previous() (*Element, error) {430 return el.ElementByJS(Eval(`this.previousElementSibling`))431}432// Elements returns all elements that match the css selector433func (el *Element) Elements(selector string) (Elements, error) {434 return el.ElementsByJS(evalHelper(js.Elements, selector))435}436// ElementsX returns all elements that match the XPath selector437func (el *Element) ElementsX(xpath string) (Elements, error) {438 return el.ElementsByJS(evalHelper(js.ElementsX, xpath))439}440// ElementsByJS returns the elements from the return value of the js441func (el *Element) ElementsByJS(opts *EvalOptions) (Elements, error) {442 return el.page.Context(el.ctx).ElementsByJS(opts.This(el.Object))443}...

Full Screen

Full Screen

gopher.go

Source:gopher.go Github

copy

Full Screen

...34 var actorImageURL string35 if actorImageSrc != nil {36 actorImageURL = *actorImageSrc37 }38 videoDescriptionDivs, err := page.ElementsX("//div[contains(@class, 'b-post__text')]")39 if err != nil {40 return nil, fmt.Errorf("failed to resolve the video description div: %w", err)41 }42 var videoDescription string43 if len(videoDescriptionDivs) > 0 {44 videoDescription = videoDescriptionDivs[0].MustText()45 }46 return &model.Post{47 Actors: []*model.ActorDetails{48 {49 ActorName: actorName,50 ProfileImageURL: actorImageURL,51 },52 },53 VideoDetails: &model.VideoDetails{54 VideoDescription: videoDescription,55 },56 }, nil57}58func xpath(page *rod.Page, xpaths ...string) (*rod.Element, error) {59 var currentElement *rod.Element60 for xpathIndex, xpath := range xpaths {61 var xpathErr error62 if xpathIndex == 0 {63 currentElement, xpathErr = page.ElementX(xpath)64 } else {65 currentElement, xpathErr = currentElement.ElementX(xpath)66 }67 if xpathErr != nil {68 return nil, fmt.Errorf("unable to evaluate xpath '%s' (at index %d): %w", xpath, xpathIndex, xpathErr)69 }70 }71 return currentElement, nil72}73func (rd *RodGopher) VerifyExists(postID int64, creatorName string) (bool, error) {74 _, err := rd.getPage(postID, creatorName)75 if err != nil {76 var postNotFound *fans.PostNotFoundErr77 if errors.As(err, &postNotFound) {78 return false, nil79 }80 return false, fmt.Errorf("failed to get page for post %d under creator '%s': %w", postID, creatorName, err)81 }82 return true, nil83}84func (rd *RodGopher) getPage(postID int64, creatorName string) (*rod.Page, error) {85 requestPath := fmt.Sprintf("https://onlyfans.com/%d/%s", postID, creatorName)86 page, err := rd.browser.Page(proto.TargetCreateTarget{URL: requestPath})87 if err != nil {88 return nil, fmt.Errorf("failed to request page at '%s': %w", requestPath, err)89 }90 // Wait for the page to finish loading91 page.WaitRequestIdle(2*time.Second, nil, nil)()92 notFoundDivs, err := page.ElementsX("//div[contains(@class, 'b-404')]")93 if err != nil {94 return nil, fmt.Errorf("failed to search page at URL '%s' for 404-indicating divs: %w", requestPath, err)95 }96 if !notFoundDivs.Empty() {97 return nil, &fans.PostNotFoundErr{98 PostID: postID,99 CreatorName: creatorName,100 }101 }102 return page, nil103}...

Full Screen

Full Screen

ElementsX

Using AI Code Generation

copy

Full Screen

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 el := page.MustElement("input.gLFyf.gsfi")8 el.MustInput("Hello world")9 els := el.MustElementsX("./following-sibling::div")10 fmt.Println(els)11 els, err := el.ElementsX("./following-sibling::div")12 if err != nil {13 fmt.Println(err)14 } else {15 fmt.Println(els)16 }17 els, err = el.ElementsX("./following-sibling::div")18 if err != nil {19 fmt.Println(err)20 } else {21 fmt.Println(els)22 }23 els = el.MustElementsX("./following-sibling::div")24 fmt.Println(els)25 el = el.MustElementX("./following-sibling::div")26 fmt.Println(el)27 el, err = el.ElementX("./following-sibling::div")28 if err != nil {29 fmt.Println(err)30 } else {31 fmt.Println(el)32 }33 el = el.MustElementX("./following-sibling::div")34 fmt.Println(el)35 els = el.MustElementsX("./following-sibling::div")36 fmt.Println(els)

Full Screen

Full Screen

ElementsX

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 page.MustElement("input").MustInput("rod")4 page.MustElement("input").MustPress("enter")5 fmt.Println(i+1, e.MustText())6 }7}

Full Screen

Full Screen

ElementsX

Using AI Code Generation

copy

Full Screen

1import "fmt"2func main() {3 rod := new(Rod)4 rod.ElementsX()5}6import "fmt"7func main() {8 rod := new(Rod)9 rod.ElementsY()10}11import "fmt"12func main() {13 rod := new(Rod)14 rod.ElementsZ()15}

Full Screen

Full Screen

ElementsX

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 browser := rod.New().Connect()4}5import (6func main() {7 browser := rod.New().Connect()8}9import (10func main() {11 browser := rod.New().Connect()12 fmt.Println(page.Element("input[name='q']"))13}14import (15func main() {16 browser := rod.New().Connect()17 fmt.Println(page.Elements("input[name='q']"))18}19import (20func main() {21 browser := rod.New().Connect()22 fmt.Println(page.ElementR("input[name='q']"))23}24import (25func main() {26 browser := rod.New().Connect()27 fmt.Println(page.ElementsR("input[name='q']"))28}29import (30func main() {31 browser := rod.New().Connect()32}

Full Screen

Full Screen

ElementsX

Using AI Code Generation

copy

Full Screen

1import "fmt"2func main() {3 r := rod.New()4}5import "fmt"6func main() {7 r := rod.New()8}9import "fmt"10func main() {11 r := rod.New()12}13import "fmt"14func main() {15 r := rod.New()16}17import "fmt"18func main() {19 r := rod.New()20}21import "fmt"22func main() {23 r := rod.New()24}25import "fmt"26func main() {27 r := rod.New()28}29import "fmt"30func main() {31 r := rod.New()32}33import "fmt"34func main() {35 r := rod.New()36}37import "fmt"38func main() {39 r := rod.New()40}41import "fmt"42func main() {43 r := rod.New()44}

Full Screen

Full Screen

Automation Testing Tutorials

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.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run Rod automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Most used method in

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful