Best Rod code snippet using rod.tryTrace
element.go
Source:element.go
...49 return err50}51// ScrollIntoView å°å½åå
ç´ æ»å¨å°æµè§å¨çªå£çå¯è§åºåä¸ï¼å¦æå®å°æªå¨å¯è§åºåå
ï¼ã52func (el *Element) ScrollIntoView() error {53 defer el.tryTrace(TraceTypeInput, "scroll into view")()54 el.page.browser.trySlowmotion()55 err := el.WaitStableRAF()56 if err != nil {57 return err58 }59 return proto.DOMScrollIntoViewIfNeeded{ObjectID: el.id()}.Call(el)60}61// Hover å°é¼ æ åå¨å
ç´ çä¸å¿62// å¨æ§è¡è¯¥æä½ä¹åï¼å®å°å°è¯æ»å¨å°è¯¥å
ç´ å¹¶çå¾
å
¶å¯äº¤äºã63func (el *Element) Hover() error {64 pt, err := el.WaitInteractable()65 if err != nil {66 return err67 }68 return el.page.Mouse.Move(pt.X, pt.Y, 1)69}70// MoveMouseOut å°é¼ æ 移åºå½åå
ç´ 71func (el *Element) MoveMouseOut() error {72 shape, err := el.Shape()73 if err != nil {74 return err75 }76 box := shape.Box()77 return el.page.Mouse.Move(box.X+box.Width, box.Y, 1)78}79// Click ä¼å人ä¸æ ·æä¸ç¶åéæ¾æé®ã80// å¨æ§è¡æä½ä¹åï¼å®å°å°è¯æ»å¨å°å
ç´ ï¼å°é¼ æ æ¬åå¨è¯¥å
ç´ ä¸ï¼çå¾
该å
ç´ å¯äº¤äºå¹¶å¯ç¨ã81func (el *Element) Click(button proto.InputMouseButton) error {82 err := el.Hover()83 if err != nil {84 return err85 }86 err = el.WaitEnabled()87 if err != nil {88 return err89 }90 defer el.tryTrace(TraceTypeInput, string(button)+" click")()91 return el.page.Mouse.Click(button)92}93// Tap å°æ»å¨å°æé®å¹¶å人类ä¸æ ·ç¹å»å®ã94// å¨æ§è¡æ¤æä½ä¹åï¼å®å°å°è¯æ»å¨å°å
ç´ ï¼å¹¶çå¾
å
¶å¯äº¤äºå¹¶å¯ç¨ã95func (el *Element) Tap() error {96 err := el.ScrollIntoView()97 if err != nil {98 return err99 }100 err = el.WaitEnabled()101 if err != nil {102 return err103 }104 pt, err := el.WaitInteractable()105 if err != nil {106 return err107 }108 defer el.tryTrace(TraceTypeInput, "tap")()109 return el.page.Touch.Tap(pt.X, pt.Y)110}111// Interactable æ£æ¥è¯¥å
ç´ æ¯å¦å¯ä»¥ä¸å
æ 交äºã112// å
æ å¯ä»¥æ¯é¼ æ ãææãæåç¬çã113// å¦æä¸æ¯å¯äº¤äºçï¼Errå°æ¯ErrNotInteractableï¼ä¾å¦å½è¢«ä¸ä¸ªæ¨¡ææ¡è¦çæ¶ã114func (el *Element) Interactable() (pt *proto.Point, err error) {115 noPointerEvents, err := el.Eval(`() => getComputedStyle(this).pointerEvents === 'none'`)116 if err != nil {117 return nil, err118 }119 if noPointerEvents.Value.Bool() {120 return nil, &ErrNoPointerEvents{el}121 }122 shape, err := el.Shape()123 if err != nil {124 return nil, err125 }126 pt = shape.OnePointInside()127 if pt == nil {128 err = &ErrInvisibleShape{el}129 return130 }131 scroll, err := el.page.root.Eval(`() => ({ x: window.scrollX, y: window.scrollY })`)132 if err != nil {133 return134 }135 elAtPoint, err := el.page.ElementFromPoint(136 int(pt.X)+scroll.Value.Get("x").Int(),137 int(pt.Y)+scroll.Value.Get("y").Int(),138 )139 if err != nil {140 if errors.Is(err, cdp.ErrNodeNotFoundAtPos) {141 err = &ErrInvisibleShape{el}142 }143 return144 }145 isParent, err := el.ContainsElement(elAtPoint)146 if err != nil {147 return148 }149 if !isParent {150 err = &ErrCovered{elAtPoint}151 }152 return153}154// Shape DOMå
ç´ å
容çå½¢ç¶ã该形ç¶æ¯ä¸ç»4è¾¹å¤è¾¹å½¢ï¼4è§ï¼ã155// 4-gonä¸ä¸å®æ¯ä¸ä¸ªé¿æ¹å½¢ã4-gonå¯ä»¥å½¼æ¤åå¼ã156// ä¾å¦ï¼æ们使ç¨2个4è§æ¥æ述以ä¸å½¢ç¶ï¼157//158// ____________ ____________159// / ___/ = /___________/ + _________160// /________/ /________/161//162func (el *Element) Shape() (*proto.DOMGetContentQuadsResult, error) {163 return proto.DOMGetContentQuads{ObjectID: el.id()}.Call(el)164}165// Type ä¸Keyboard.Type类似ã166// å¨æ§è¡æä½ä¹åï¼å®å°å°è¯æ»å¨å°è¯¥å
ç´ å¹¶å°ç¦ç¹éä¸å¨è¯¥å
ç´ ä¸ã167func (el *Element) Type(keys ...input.Key) error {168 err := el.Focus()169 if err != nil {170 return err171 }172 return el.page.Keyboard.Type(keys...)173}174// KeyActions ä¸Page.KeyActions类似ã175// å¨æ§è¡æä½ä¹åï¼å®å°å°è¯æ»å¨å°è¯¥å
ç´ å¹¶å°ç¦ç¹éä¸å¨è¯¥å
ç´ ä¸ã176func (el *Element) KeyActions() (*KeyActions, error) {177 err := el.Focus()178 if err != nil {179 return nil, err180 }181 return el.page.KeyActions(), nil182}183// SelectText éæ©ä¸æ£å表达å¼å¹é
çææ¬ã184// å¨æ§è¡æä½ä¹åï¼å®å°å°è¯æ»å¨å°è¯¥å
ç´ å¹¶å°ç¦ç¹éä¸å¨è¯¥å
ç´ ä¸ã185func (el *Element) SelectText(regex string) error {186 err := el.Focus()187 if err != nil {188 return err189 }190 defer el.tryTrace(TraceTypeInput, "select text: "+regex)()191 el.page.browser.trySlowmotion()192 _, err = el.Evaluate(evalHelper(js.SelectText, regex).ByUser())193 return err194}195// SelectAllText éæ©ææææ¬196// å¨æ§è¡æä½ä¹åï¼å®å°å°è¯æ»å¨å°è¯¥å
ç´ å¹¶å°ç¦ç¹éä¸å¨è¯¥å
ç´ ä¸ã197func (el *Element) SelectAllText() error {198 err := el.Focus()199 if err != nil {200 return err201 }202 defer el.tryTrace(TraceTypeInput, "select all text")()203 el.page.browser.trySlowmotion()204 _, err = el.Evaluate(evalHelper(js.SelectAllText).ByUser())205 return err206}207// Input èç¦å¨è¯¥å
ç´ ä¸å¹¶è¾å
¥ææ¬.208// å¨æ§è¡æä½ä¹åï¼å®å°æ»å¨å°å
ç´ ï¼çå¾
å
¶å¯è§ãå¯ç¨åå¯åã209// è¦æ¸
空è¾å
¥ï¼å¯ä»¥ä½¿ç¨el.SelectAllTextï¼ï¼.MustInputï¼ââï¼ä¹ç±»çå½ä»¤210func (el *Element) Input(text string) error {211 err := el.Focus()212 if err != nil {213 return err214 }215 err = el.WaitEnabled()216 if err != nil {217 return err218 }219 err = el.WaitWritable()220 if err != nil {221 return err222 }223 err = el.page.InsertText(text)224 _, _ = el.Evaluate(evalHelper(js.InputEvent).ByUser())225 return err226}227// InputTime èç¦è¯¥å
ç´ åå
¶è¾å
¥æ¶é´ã228// å¨æ§è¡æä½ä¹åï¼å®å°æ»å¨å°å
ç´ ï¼çå¾
å
¶å¯è§ãå¯ç¨åå¯åã229// å®å°çå¾
å
ç´ å¯è§ãå¯ç¨åå¯åã230func (el *Element) InputTime(t time.Time) error {231 err := el.Focus()232 if err != nil {233 return err234 }235 err = el.WaitEnabled()236 if err != nil {237 return err238 }239 err = el.WaitWritable()240 if err != nil {241 return err242 }243 defer el.tryTrace(TraceTypeInput, "input "+t.String())()244 _, err = el.Evaluate(evalHelper(js.InputTime, t.UnixNano()/1e6).ByUser())245 return err246}247// Blur 类似äºæ¹æ³ Blur248func (el *Element) Blur() error {249 _, err := el.Evaluate(Eval("() => this.blur()").ByUser())250 return err251}252// Select éæ©ä¸éæ©å¨å¹é
çåé项å
ç´ ã253// å¨æä½ä¹åï¼å®å°æ»å¨å°å
ç´ ï¼çå¾
å®å¯è§ã254// å¦æ没æä¸éæ©å¨å¹é
çé项ï¼å®å°è¿åErrElementNotFoundã255func (el *Element) Select(selectors []string, selected bool, t SelectorType) error {256 err := el.Focus()257 if err != nil {258 return err259 }260 defer el.tryTrace(TraceTypeInput, fmt.Sprintf(`select "%s"`, strings.Join(selectors, "; ")))()261 el.page.browser.trySlowmotion()262 res, err := el.Evaluate(evalHelper(js.Select, selectors, selected, t).ByUser())263 if err != nil {264 return err265 }266 if !res.Value.Bool() {267 return &ErrElementNotFound{}268 }269 return nil270}271// Matches æ£æ¥csséæ©å¨æ¯å¦å¯ä»¥éæ©å
ç´ 272func (el *Element) Matches(selector string) (bool, error) {273 res, err := el.Eval(`s => this.matches(s)`, selector)274 if err != nil {275 return false, err276 }277 return res.Value.Bool(), nil278}279// Attribute DOM对象çå±æ§280// Attribute vs Property: https://stackoverflow.com/questions/6003819/what-is-the-difference-between-properties-and-attributes-in-html281func (el *Element) Attribute(name string) (*string, error) {282 attr, err := el.Eval("(n) => this.getAttribute(n)", name)283 if err != nil {284 return nil, err285 }286 if attr.Value.Nil() {287 return nil, nil288 }289 s := attr.Value.Str()290 return &s, nil291}292// Property DOM对象çå±æ§293// Property vs Attribute: https://stackoverflow.com/questions/6003819/what-is-the-difference-between-properties-and-attributes-in-html294func (el *Element) Property(name string) (gson.JSON, error) {295 prop, err := el.Eval("(n) => this[n]", name)296 if err != nil {297 return gson.New(nil), err298 }299 return prop.Value, nil300}301// SetFiles 设置å½åæ件è¾å
¥å
ç´ çæ件302func (el *Element) SetFiles(paths []string) error {303 absPaths := []string{}304 for _, p := range paths {305 absPath, err := filepath.Abs(p)306 utils.E(err)307 absPaths = append(absPaths, absPath)308 }309 defer el.tryTrace(TraceTypeInput, fmt.Sprintf("set files: %v", absPaths))()310 el.page.browser.trySlowmotion()311 err := proto.DOMSetFileInputFiles{312 Files: absPaths,313 ObjectID: el.id(),314 }.Call(el)315 return err316}317// Describe æè¿°å½åå
ç´ ã深度æ¯åºæ£ç´¢å级çæ大深度ï¼é»è®¤ä¸º1ï¼å¯¹æ´ä¸ªåæ 使ç¨-1ï¼ææä¾å¤§äº0çæ´æ°ã318// pierceå³å®å¨è¿ååæ æ¶æ¯å¦è¦éåiframesåå½±åæ ¹ã319// è¿åçproto.DOMNodeãNodeIDå°å§ç»ä¸ºç©ºï¼å 为NodeIDä¸ç¨³å®ï¼å½proto.DOMDocumentUpdated被触åæ¶ï¼320// 页é¢ä¸çææNodeIDé½å°è¢«éæ°åé
å°å¦ä¸ä¸ªå¼ï¼ãæ们ä¸å»ºè®®ä½¿ç¨NodeIDï¼èæ¯ä½¿ç¨BackendNodeIDæ¥æ è¯å
ç´ ã321func (el *Element) Describe(depth int, pierce bool) (*proto.DOMNode, error) {322 val, err := proto.DOMDescribeNode{ObjectID: el.id(), Depth: gson.Int(depth), Pierce: pierce}.Call(el)323 if err != nil {324 return nil, err325 }326 return val.Node, nil327}328// ShadowRoot ShadowRootè¿åæ¤å
ç´ çå½±åæ ¹329func (el *Element) ShadowRoot() (*Element, error) {330 node, err := el.Describe(1, false)331 if err != nil {332 return nil, err333 }334 // è½ç¶ç°å¨å®æ¯ä¸ä¸ªæ°ç»ï¼ä½w3cå°å
¶è§èæ´æ¹ä¸ºå个æ°ç»ã335 id := node.ShadowRoots[0].BackendNodeID336 shadowNode, err := proto.DOMResolveNode{BackendNodeID: id}.Call(el)337 if err != nil {338 return nil, err339 }340 return el.page.ElementFromObject(shadowNode.Object)341}342// Frame å建ä¸ä¸ªè¡¨ç¤ºiframeç页é¢å®ä¾343func (el *Element) Frame() (*Page, error) {344 node, err := el.Describe(1, false)345 if err != nil {346 return nil, err347 }348 clone := *el.page349 clone.FrameID = node.FrameID350 clone.jsCtxID = new(proto.RuntimeRemoteObjectID)351 clone.element = el352 clone.sleeper = el.sleeper353 return &clone, nil354}355// ContainesElement æ£æ¥ç®æ æ¯å¦æ¯æå¨å
ç´ å
ã356func (el *Element) ContainsElement(target *Element) (bool, error) {357 res, err := el.Evaluate(evalHelper(js.ContainsElement, target.Object))358 if err != nil {359 return false, err360 }361 return res.Value.Bool(), nil362}363// Text å
ç´ æ¾ç¤ºçææ¬364func (el *Element) Text() (string, error) {365 str, err := el.Evaluate(evalHelper(js.Text))366 if err != nil {367 return "", err368 }369 return str.Value.String(), nil370}371// HTML å
ç´ çHTML372func (el *Element) HTML() (string, error) {373 res, err := proto.DOMGetOuterHTML{ObjectID: el.Object.ObjectID}.Call(el)374 if err != nil {375 return "", err376 }377 return res.OuterHTML, nil378}379// Visible å¦æå
ç´ å¨é¡µé¢ä¸å¯è§ï¼åè¿åtrue380func (el *Element) Visible() (bool, error) {381 res, err := el.Evaluate(evalHelper(js.Visible))382 if err != nil {383 return false, err384 }385 return res.Value.Bool(), nil386}387// WaitLoad 类似äºï¼imgï¼å
ç´ ççå¾
å è½½388func (el *Element) WaitLoad() error {389 defer el.tryTrace(TraceTypeWait, "load")()390 _, err := el.Evaluate(evalHelper(js.WaitLoad).ByPromise())391 return err392}393// WaitStable çå¾
ç´å°å¨dæç»æ¶é´å
没æå½¢ç¶æä½ç½®ååã394// å°å¿ï¼dä¸æ¯æ大çå¾
è¶
æ¶ï¼å®æ¯æä¸ç¨³å®çæ¶é´ã395// å¦æè¦è®¾ç½®è¶
æ¶ï¼å¯ä»¥ä½¿ç¨âElement.timeoutâå½æ°ã396func (el *Element) WaitStable(d time.Duration) error {397 err := el.WaitVisible()398 if err != nil {399 return err400 }401 defer el.tryTrace(TraceTypeWait, "stable")()402 shape, err := el.Shape()403 if err != nil {404 return err405 }406 t := time.NewTicker(d)407 defer t.Stop()408 for {409 select {410 case <-t.C:411 case <-el.ctx.Done():412 return el.ctx.Err()413 }414 current, err := el.Shape()415 if err != nil {416 return err417 }418 if reflect.DeepEqual(shape, current) {419 break420 }421 shape = current422 }423 return nil424}425// WaitStableRAF çå¾
ç´å°è¿ç»ä¸¤ä¸ªå¨ç»å¸§çå½¢ç¶æä½ç½®æ²¡æååã426// å¦æè¦çå¾
ç±JSèä¸æ¯CSS触åçå¨ç»ï¼æ好使ç¨Element.WaitStableã427// å
³äº animation frame: https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame428func (el *Element) WaitStableRAF() error {429 err := el.WaitVisible()430 if err != nil {431 return err432 }433 defer el.tryTrace(TraceTypeWait, "stable RAF")()434 var shape *proto.DOMGetContentQuadsResult435 for {436 err = el.page.WaitRepaint()437 if err != nil {438 return err439 }440 current, err := el.Shape()441 if err != nil {442 return err443 }444 if reflect.DeepEqual(shape, current) {445 break446 }447 shape = current448 }449 return nil450}451// WaitInteractable çå¾
å
ç´ å¯äº¤äºã452// å®å°å¨æ¯æ¬¡å°è¯æ¶å°è¯æ»å¨å°å
ç´ ã453func (el *Element) WaitInteractable() (pt *proto.Point, err error) {454 defer el.tryTrace(TraceTypeWait, "interactable")()455 err = utils.Retry(el.ctx, el.sleeper(), func() (bool, error) {456 // 对äºå»¶è¿å 载页é¢ï¼å
ç´ å¯ä»¥å¨è§å£ä¹å¤ã457 // å¦ææ们ä¸æ»å¨å°å®ï¼å®å°æ°¸è¿ä¸å¯ç¨ã458 err := el.ScrollIntoView()459 if err != nil {460 return true, err461 }462 pt, err = el.Interactable()463 if errors.Is(err, &ErrCovered{}) {464 return false, nil465 }466 return true, err467 })468 return469}470// Wait çå¾
jsè¿åtrue471func (el *Element) Wait(opts *EvalOptions) error {472 return el.page.Context(el.ctx).Sleeper(el.sleeper).Wait(opts.This(el.Object))473}474// WaitVisible ç´å°å
ç´ å¯è§475func (el *Element) WaitVisible() error {476 defer el.tryTrace(TraceTypeWait, "visible")()477 return el.Wait(evalHelper(js.Visible))478}479// WaitEnabled ç´å°è¯¥å
ç´ æªè¢«ç¦ç¨ã480// Doc for readonly: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/readonly481func (el *Element) WaitEnabled() error {482 defer el.tryTrace(TraceTypeWait, "enabled")()483 return el.Wait(Eval(`() => !this.disabled`))484}485// WaitWritable ç´å°è¯¥å
ç´ ä¸æ¯åªè¯»çã486// Doc for disabled: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled487func (el *Element) WaitWritable() error {488 defer el.tryTrace(TraceTypeWait, "writable")()489 return el.Wait(Eval(`() => !this.readonly`))490}491// WaitInvisible ç´å°å
件ä¸å¯è§492func (el *Element) WaitInvisible() error {493 defer el.tryTrace(TraceTypeWait, "invisible")()494 return el.Wait(evalHelper(js.Invisible))495}496// CanvastoiImage è·åç»å¸çå¾åæ°æ®ã497// é»è®¤æ ¼å¼ä¸ºimage/pngã498// é»è®¤è´¨é为0.92ã499// doc: https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL500func (el *Element) CanvasToImage(format string, quality float64) ([]byte, error) {501 res, err := el.Eval(`(format, quality) => this.toDataURL(format, quality)`, format, quality)502 if err != nil {503 return nil, err504 }505 _, bin := parseDataURI(res.Value.Str())506 return bin, nil507}...
input.go
Source:input.go
...47func (k *Keyboard) Press(keys ...rune) error {48 k.Lock()49 defer k.Unlock()50 for _, key := range keys {51 defer k.page.tryTrace(TraceTypeInput, "press "+input.Keys[key].Key)()52 k.page.browser.trySlowmotion()53 actions := input.Encode(key)54 k.modifiers = actions[0].Modifiers55 defer func() { k.modifiers = 0 }()56 for _, action := range actions {57 err := action.Call(k.page)58 if err != nil {59 return err60 }61 }62 }63 return nil64}65// InsertText is like pasting text into the page66func (k *Keyboard) InsertText(text string) error {67 k.Lock()68 defer k.Unlock()69 defer k.page.tryTrace(TraceTypeInput, "insert text "+text)()70 k.page.browser.trySlowmotion()71 err := proto.InputInsertText{Text: text}.Call(k.page)72 return err73}74// Mouse represents the mouse on a page, it's always related the main frame75type Mouse struct {76 sync.Mutex77 page *Page78 id string // mouse svg dom element id79 x float6480 y float6481 // the buttons is currently beening pressed, reflects the press order82 buttons []proto.InputMouseButton83}84// Move to the absolute position with specified steps85func (m *Mouse) Move(x, y float64, steps int) error {86 m.Lock()87 defer m.Unlock()88 if steps < 1 {89 steps = 190 }91 stepX := (x - m.x) / float64(steps)92 stepY := (y - m.y) / float64(steps)93 button, buttons := input.EncodeMouseButton(m.buttons)94 for i := 0; i < steps; i++ {95 m.page.browser.trySlowmotion()96 toX := m.x + stepX97 toY := m.y + stepY98 err := proto.InputDispatchMouseEvent{99 Type: proto.InputDispatchMouseEventTypeMouseMoved,100 X: toX,101 Y: toY,102 Button: button,103 Buttons: buttons,104 Modifiers: m.page.Keyboard.getModifiers(),105 }.Call(m.page)106 if err != nil {107 return err108 }109 // to make sure set only when call is successful110 m.x = toX111 m.y = toY112 if m.page.browser.trace {113 if !m.updateMouseTracer() {114 m.initMouseTracer()115 m.updateMouseTracer()116 }117 }118 }119 return nil120}121// Scroll the relative offset with specified steps122func (m *Mouse) Scroll(offsetX, offsetY float64, steps int) error {123 m.Lock()124 defer m.Unlock()125 defer m.page.tryTrace(TraceTypeInput, fmt.Sprintf("scroll (%.2f, %.2f)", offsetX, offsetY))()126 m.page.browser.trySlowmotion()127 if steps < 1 {128 steps = 1129 }130 button, buttons := input.EncodeMouseButton(m.buttons)131 stepX := offsetX / float64(steps)132 stepY := offsetY / float64(steps)133 for i := 0; i < steps; i++ {134 err := proto.InputDispatchMouseEvent{135 Type: proto.InputDispatchMouseEventTypeMouseWheel,136 X: m.x,137 Y: m.y,138 Button: button,139 Buttons: buttons,140 Modifiers: m.page.Keyboard.getModifiers(),141 DeltaX: stepX,142 DeltaY: stepY,143 }.Call(m.page)144 if err != nil {145 return err146 }147 }148 return nil149}150// Down holds the button down151func (m *Mouse) Down(button proto.InputMouseButton, clicks int) error {152 m.Lock()153 defer m.Unlock()154 toButtons := append(m.buttons, button)155 _, buttons := input.EncodeMouseButton(toButtons)156 err := proto.InputDispatchMouseEvent{157 Type: proto.InputDispatchMouseEventTypeMousePressed,158 Button: button,159 Buttons: buttons,160 ClickCount: clicks,161 Modifiers: m.page.Keyboard.getModifiers(),162 X: m.x,163 Y: m.y,164 }.Call(m.page)165 if err != nil {166 return err167 }168 m.buttons = toButtons169 return nil170}171// Up releases the button172func (m *Mouse) Up(button proto.InputMouseButton, clicks int) error {173 m.Lock()174 defer m.Unlock()175 toButtons := []proto.InputMouseButton{}176 for _, btn := range m.buttons {177 if btn == button {178 continue179 }180 toButtons = append(toButtons, btn)181 }182 _, buttons := input.EncodeMouseButton(toButtons)183 err := proto.InputDispatchMouseEvent{184 Type: proto.InputDispatchMouseEventTypeMouseReleased,185 Button: button,186 Buttons: buttons,187 ClickCount: clicks,188 Modifiers: m.page.Keyboard.getModifiers(),189 X: m.x,190 Y: m.y,191 }.Call(m.page)192 if err != nil {193 return err194 }195 m.buttons = toButtons196 return nil197}198// Click the button. It's the combination of Mouse.Down and Mouse.Up199func (m *Mouse) Click(button proto.InputMouseButton) error {200 m.page.browser.trySlowmotion()201 err := m.Down(button, 1)202 if err != nil {203 return err204 }205 return m.Up(button, 1)206}207// Touch presents a touch device, such as a hand with fingers, each finger is a proto.InputTouchPoint.208// Touch events is stateless, we use the struct here only as a namespace to make the API style unified.209type Touch struct {210 page *Page211}212// Start a touch action213func (t *Touch) Start(points ...*proto.InputTouchPoint) error {214 // TODO: https://crbug.com/613219215 _ = t.page.WaitRepaint()216 _ = t.page.WaitRepaint()217 return proto.InputDispatchTouchEvent{218 Type: proto.InputDispatchTouchEventTypeTouchStart,219 TouchPoints: points,220 Modifiers: t.page.Keyboard.getModifiers(),221 }.Call(t.page)222}223// Move touch points. Use the InputTouchPoint.ID (Touch.identifier) to track points.224// Doc: https://developer.mozilla.org/en-US/docs/Web/API/Touch_events225func (t *Touch) Move(points ...*proto.InputTouchPoint) error {226 return proto.InputDispatchTouchEvent{227 Type: proto.InputDispatchTouchEventTypeTouchMove,228 TouchPoints: points,229 Modifiers: t.page.Keyboard.getModifiers(),230 }.Call(t.page)231}232// End touch action233func (t *Touch) End() error {234 return proto.InputDispatchTouchEvent{235 Type: proto.InputDispatchTouchEventTypeTouchEnd,236 TouchPoints: []*proto.InputTouchPoint{},237 Modifiers: t.page.Keyboard.getModifiers(),238 }.Call(t.page)239}240// Cancel touch action241func (t *Touch) Cancel() error {242 return proto.InputDispatchTouchEvent{243 Type: proto.InputDispatchTouchEventTypeTouchCancel,244 TouchPoints: []*proto.InputTouchPoint{},245 Modifiers: t.page.Keyboard.getModifiers(),246 }.Call(t.page)247}248// Tap dispatches a touchstart and touchend event.249func (t *Touch) Tap(x, y float64) error {250 defer t.page.tryTrace(TraceTypeInput, "touch")()251 t.page.browser.trySlowmotion()252 p := &proto.InputTouchPoint{X: x, Y: y}253 err := t.Start(p)254 if err != nil {255 return err256 }257 return t.End()258}...
tryTrace
Using AI Code Generation
1import (2func main() {3 browser := launcher.New().MustLaunch()4 defer browser.Close()5 traceEvents, err := page.TryTrace(func() {6 page.MustElement("input[name='q']").MustInput("rod")7 page.MustElement("input[name='btnK']").MustClick()8 })9 if err != nil {10 fmt.Println(err)11 }12 for _, e := range traceEvents {13 fmt.Println(e)14 }15}16import (17func main() {18 browser := launcher.New().MustLaunch()19 defer browser.Close()20 traceEvents := page.MustTrace(func() {21 page.MustElement("input[name='q']").MustInput("rod")22 page.MustElement("input[name='btnK']").MustClick()23 })24 for _, e := range traceEvents {25 fmt.Println(e)26 }27}28import (29func main() {30 browser := launcher.New().MustLaunch()31 defer browser.Close()32 traceEvents := page.MustTrace(func() {33 page.MustElement("input[name='q']").MustInput("
tryTrace
Using AI Code Generation
1import (2func main() {3 browser := rod.New().MustConnect()4 defer browser.MustClose()5 defer page.MustClose()6 if err != nil {7 fmt.Println("Error while tracing the network: ", err)8 } else {9 fmt.Println("Network response: ", networkResponse)10 }11}12func tryTrace(page *rod.Page, url string) (*proto.NetworkResponseReceived, error) {13 networkResponse, err := page.Trace(url)14 if err != nil {15 }16}
tryTrace
Using AI Code Generation
1import (2func main() {3 browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()4 title := page.MustElement("title").MustText()5 fmt.Println(title)6 browser.MustClose()7}8import (9func main() {10 browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()11 title := page.MustElement("title").MustText()12 fmt.Println(title)13 browser.MustClose()14}15import (16func main() {17 browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()18 title := page.MustElement("title").MustText()19 fmt.Println(title)20 browser.MustClose()21}22import (23func main() {24 browser := rod.New().ControlURL(launcher.New().MustLaunch()).MustConnect()
tryTrace
Using AI Code Generation
1import (2func main() {3 browser := rod.New().MustConnect()4 page := browser.MustPage("")5 page.MustTrace(proto.NetworkRequestWillBeSent).MustStart()6 page.MustElement("#tsf").MustInput("Hello World")7 event := page.MustTrace(proto.NetworkRequestWillBeSent).MustTryGetEvent(10)8 fmt.Println(event.(*proto.NetworkRequestWillBeSent).Request.URL)9}10import (11func main() {12 browser := rod.New().MustConnect()13 page := browser.MustPage("")14 page.MustTrace(proto.NetworkRequestWillBeSent).MustStart()15 page.MustElement("#tsf").MustInput("Hello World")16 events := page.MustTrace(proto.NetworkRequestWillBeSent).MustGetEvents()17 for _, event := range events {18 fmt.Println(event.(*proto
tryTrace
Using AI Code Generation
1import (2func main() {3 browser := rod.New().Connect()4 page.Trace("trace.json").WaitLoad()5 browser.Close()6}7{"traceEvents":[{"pid":1,"tid":1,"ts":1618272314.598,"ph":"M","name":"process_name","args":{"name":"2"}},{"pid":1,"tid":1,"ts":1618272314.598,"ph":"M","name":"thread_name","args":{"name":"CrRendererMain"}},{"pid":1,"tid":1,"ts":1618272314.598,"ph":"M","name":"thread_sort_index","args":{"sort_index":0}},{"pid":1,"tid":1,"ts":1618272314.598,"ph":"M","name":"process_labels","args":{"labels":["Renderer","Browser"]}}],"metadata":{"serviceProtocolVersion":"0.1","service":"Chrome","serviceVersion":"89.0.4389.114","os":"Linux","osVersion":"5.4.0-65-generic","cpu":"x86_64","command_line":"2 --type=renderer --field-trial-handle=143,143 --disable-features=TranslateUI --disable-features=Translate --disable-features=AutofillEnableAccountWalletStorage --disable-features=AutofillServerCommunication --lang=en-US --enable-features=NetworkService,NetworkServiceInProcess --service-request-channel-token=143 --renderer-client-id=3 --no-v8-untrusted-code-mitigations --shared-files=v8_context_snapshot_data:100,v8_natives_data:101 --mojo-platform-channel-handle=102 /tmp/.org.chromium.Chromium.4Yjg0n --flag-switches-begin --flag-switches-end","userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36","product":"Chrome/89.0.438
tryTrace
Using AI Code Generation
1import(2func main() {3 defer b.MustClose()4 trace := proto.NetworkRequestWillBeSent{}5 p.MustElement("input").MustInput("rod")6 p.MustElement("input").MustPress("Enter")7 p.MustElement("a").MustClick()8 p.MustTrace(&trace, func() {9 p.MustElement("a").MustClick()10 })11 fmt.Println(trace.Request.URL)12}
tryTrace
Using AI Code Generation
1import (2func main() {3 r := rod.New()4 t := r.NewTrace()5 fmt.Println(t)6}7import (8func main() {9 r := rod.New()10 t := r.NewTrace()11 fmt.Println(t)12}13import (14func main() {15 r := rod.New()16 t := r.NewTrace()17 fmt.Println(t)18}
tryTrace
Using AI Code Generation
1import (2func main() {3 r := rod.NewRod(100)4 r2 := rod.NewRod(100)5 r3 := rod.NewRod(100)6 r4 := rod.NewRod(100)7 r5 := rod.NewRod(100)8 r6 := rod.NewRod(100)9 r7 := rod.NewRod(100)10 r8 := rod.NewRod(100)11 r9 := rod.NewRod(100)12 r10 := rod.NewRod(100)13 r11 := rod.NewRod(100)14 r12 := rod.NewRod(100)15 r13 := rod.NewRod(100)16 r14 := rod.NewRod(100)17 r15 := rod.NewRod(100)18 r16 := rod.NewRod(100)19 r17 := rod.NewRod(100)20 r18 := rod.NewRod(100)21 r19 := rod.NewRod(100)22 r20 := rod.NewRod(100)23 r21 := rod.NewRod(100)24 r22 := rod.NewRod(100)25 r23 := rod.NewRod(100)26 r24 := rod.NewRod(100)27 r25 := rod.NewRod(100)28 r26 := rod.NewRod(100)29 r27 := rod.NewRod(100)30 r28 := rod.NewRod(100)
tryTrace
Using AI Code Generation
1import (2func main() {3 r := rod.NewRod(1, 2)4 r.TryTrace()5}6import (7func main() {8 r := rod.NewRod(1, 2)9 r.TryTrace()10}11import (12func main() {13 r := rod.NewRod(1, 2)14 r.TryTrace()15}16import (17func main() {18 r := rod.NewRod(1, 2)19 r.TryTrace()20}21import (22func main() {23 r := rod.NewRod(1, 2)24 r.TryTrace()25}26import (27func main() {28 r := rod.NewRod(1, 2)29 r.TryTrace()30}31import (32func main() {33 r := rod.NewRod(1, 2)34 r.TryTrace()35}
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!!