package Ġcom . intellij . rem oter obot . fixtures Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . intellij . rem oter obot . Remote Robot Ċ import Ġcom . intellij . rem oter obot . data . Remote Component Ċ import Ġcom . intellij . rem oter obot . search . loc ators . by Xpath Ċ import Ġcom . intellij . rem oter obot . steps Processing . log Ċ import Ġcom . intellij . rem oter obot . steps Processing . step Ċ import Ġcom . intellij . rem oter obot . utils . waitFor Ċ import Ġorg . intellij . lang . annotations . Language Ċ import Ġjava . time . Duration Ċ import Ġkotlin . math . round ToInt ĊĊ Ċ /** Ċ ## ĠUse Ġit Ġto Ġwork Ġwith ĠJ CE F Ġembedded Ġbrowser . Ċ Ċ The Ġfixture Ġprovides Ġsome Ġrequirements : Ċ - Ġfound Ġcomponent Ġmust Ġhave Ġa Ġparent Ġwith ĠJ BC ef Browser . instance Ġclient Property Ċ - Ġ` ide . browser . j cef . js Query PoolSize = 1 0 0 0 0 ` Ġ- Ġpossible Ġcount Ġof Ġcallback Ġslots Ġmust Ġbe Ġspecified Ġfor Ġrunning ĠIDE Ċ in Ġbuild . gradle : Ċ run Ide For Ui Tests Ġ{ Ċ system Property Ġ" ide . browser . j cef . js Query PoolSize ", Ġ" 1 0 0 0 0 " Ċ } Ċ One Ġfixture Ġtakes Ġa Ġone Ġslot Ġof Ġthe Ġreserved Ġcallback Ġslots . ĠSo Ġif Ġyou Ġcreate Ġa Ġlot Ġof Ġfixtures Ġacross Ġthe Ġone Ġbrowser Ċ the Ġslots Ġcould Ġbe Ġrun Ġout . ĠIt Ġis Ġprefer able Ġto Ġcreate Ġone Ġfixture Ġand Ġthen Ġreuse Ġit . Ċ Ġ*/ Ċ class ĠJ C ef Browser Fixture ( remote Robot : ĠRemote Robot , Ġremote Component : ĠRemote Component ) Ġ: ĊĠĠĠ ĠComponent Fixture ( remote Robot , Ġremote Component ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Locator Ġby Ġlazy Ġ{ Ġby Xpath ("// div [ contains (@ class , Ġ' Canvas ')] ") Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmac Locator Ġby Ġlazy Ġ{ Ġby Xpath ("// div [@ class =' JPanel ' Ġand Ġcontains (@ jav aclass , Ġ' C ef Browser Wr ')] ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠF IND ER Ġ= Ġ" window . element Finder " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINIT _ FIND ER Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ FIND ER Ġ= Ġ{}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction ĠEl m ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tag Ġ= Ġelement . tagName ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . html Ġ= Ġelement . outer HTML ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . location Ġ= Ġelement . getBoundingClientRect (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . xpath Ġ= Ġ'// ' Ġ+ Ġwindow . element Finder . getPath To ( element ). toLowerCase (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ FIND ER . findElement Ġ= Ġ( xpath ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" findElement : Ġby Ġ'" Ġ+ Ġxpath Ġ+ Ġ"' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdocument . evaluate ( xpath , Ġdocument , Ġnull , ĠXPath Result . FIRST _ ORDER ED _ NODE _ TYPE , Ġnull ). single Node Value ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ FIND ER . scroll By Xpath Ġ= Ġ( xpath ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" scroll By Xpath : Ġto Ġ'" Ġ+ Ġxpath Ġ+ Ġ"' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġelement Ġ= Ġwindow . element Finder . findElement ( xpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" found : Ġ" Ġ+ Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . scroll Into View (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" success "; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ FIND ER . find Elements Ġ= Ġ( xpath ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" find Elements : Ġby Ġ'" Ġ+ Ġxpath Ġ+ Ġ"' ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġfound Elements Ġ= Ġ[]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġnodes Snapshot Ġ= Ġdocument . evaluate ( xpath , Ġdocument , Ġnull , ĠXPath Result . ORDER ED _ NODE _ SNAPSHOT _ TYPE , Ġnull Ġ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( let Ġi Ġ= Ġ 0 ; Ġi Ġ< Ġnodes Snapshot . snapshot Length ; Ġi ++ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Elements . push ( Ġnodes Snapshot . snapshot Item ( i ) Ġ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" found Ġ" Ġ+ Ġfound Elements . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġresult Ġ= Ġfound Elements . map (( it ) Ġ=> Ġnew ĠEl m ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJSON . stringify ( result ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ$ FIND ER . getPath To Ġ= Ġ( element ) Ġ=> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ=== Ġdocument . body ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . tagName ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġix Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġs iblings Ġ= Ġelement . parentNode . childNodes ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( let Ġi Ġ= Ġ 0 ; Ġi Ġ< Ġs iblings . length ; Ġi ++) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġsibling Ġ= Ġs iblings [ i ]; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sibling Ġ=== Ġelement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ$ FIND ER . getPath To ( element . parentNode ) Ġ+ Ġ'/' Ġ+ Ġelement . tagName Ġ+ Ġ'[' Ġ+ Ġ( ix Ġ+ Ġ 1 ) Ġ+ Ġ'] '; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sibling . nodeType Ġ=== Ġ 1 Ġ&& Ġsibling . tagName Ġ=== Ġelement . tagName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġix ++; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠJ B _ BROWSER _ KEY Ġ= Ġ" J BC ef Browser . instance " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠJ B _ CE F _ BROWSER _ KEY Ġ= Ġ"__ jb C ef Browser " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠC EF _ BROWSER _ KEY Ġ= Ġ"__ cef Browser " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠQUERY _ KEY Ġ= Ġ"__ Query " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRESULT _ KEY Ġ= Ġ"__ Result " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEXEC UTE _ JS _ TIMEOUT _ MS Ġ= Ġ 3 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEXEC UTE _ JS _ POLL _ INTERVAL _ MS Ġ= Ġ 5 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . initialize Browser () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠLocation ( val Ġx : ĠDouble , Ġval Ġy : ĠDouble , Ġval Ġwidth : ĠDouble , Ġval Ġheight : ĠDouble ) ĊĠĠĠ Ġdata Ġclass ĠElement Data ( val Ġtag : ĠString , Ġval Ġhtml : ĠString , Ġval Ġlocation : ĠLocation , Ġval Ġxpath : ĠString ) ĊĠĠĠ Ġdata Ġclass ĠElement DataList ( val Ġel ms : ĠList < Element Data >) ĊĠĠĠ Ġclass ĠJ CE F Script Execution Error ( script : ĠString , Ġe : ĠThrowable ) Ġ: ĊĠĠĠĠĠĠĠ ĠAssertionError (" Failed Ġto Ġexecute Ġscript :\ n $ script ", Ġe ) ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Browser () Ġ= Ġstep (" Inject ĠJS Ġscripts Ġinto Ġthe ĠEmbedded Ġbrowser ") Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Js ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġcurrent Component Ġ= Ġcomponent ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġj b C ef Browser Ġ= Ġnull ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Component Ġ!== Ġnull Ġ&& Ġj b C ef Browser Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj b C ef Browser Ġ= Ġcurrent Component . getClient Property ("$ JB _ BROWSER _ KEY "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( jb C ef Browser Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Component Ġ= Ġcurrent Component . getParent (); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! jb C ef Browser ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġnew ĠError (" Can 't Ġfind Ġc ef Ġbrowser "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġc ef Browser Ġ= Ġj b C ef Browser . getC ef Browser (); ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cef Browser ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġnew ĠError (" Can 't Ġfind Ġc ef Ġbrowser "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . put ("$ JB _ CE F _ BROWSER _ KEY ", Ġj b C ef Browser ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . put ("$ CE F _ BROWSER _ KEY ", Ġc ef Browser ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġquery Ġ= Ġcom . intellij . ui . j cef . J BC ef JS Query . create ( jb C ef Browser ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery . add Handler (( result )=> Ġctx . put ("$ RESULT _ KEY ", Ġresult )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . put ("$ QUERY _ KEY ", Ġquery ) ĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Element (@ Language (" XPath ") Ġxpath : ĠString , Ġwait : ĠDuration Ġ= ĠDuration . of Seconds ( 5 )): ĠDom Element Ġ= ĊĠĠĠĠĠĠĠ Ġstep (" find ĠDOM Ġelement Ġby Ġ'$ xpath '") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġelement : ĠDom Element ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor ( wait ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġfind Elements ( xpath ). first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ step Ġelement Ġ?: Ġthrow ĠIllegalStateException (" No Ġsuch Ġelement : Ġ$ xpath ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexist (@ Language (" XPath ") Ġxpath : ĠString ): ĠBoolean Ġ= Ġfind Elements ( xpath ). isNotEmpty () ĊĊĠĠĠ Ġfun Ġfind Elements (@ Language (" XPath ") Ġxpath : ĠString ): ĠList < Dom Element > Ġ= Ġstep (" find ĠDOM Ġelements Ġby Ġ'$ xpath '") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute Js In Browser ("$ FIND ER . find Elements (\" ${ xpath . escape Xpath () }\ ") ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ step Ġgson . fromJson ("{ el ms : Ġ$ result }", ĠElement DataList :: class . java ). el ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDom Element ( this , Ġit ) Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Can 't Ġfind Ġelements Ġby Ġxpath Ġ'$ xpath '. ĠJS Ġresult :\ n $ result ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscroll To (@ Language (" XPath ") Ġxpath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġexecute Js In Browser ("$ FIND ER . scroll By Xpath (\" ${ xpath . escape Xpath () }\ ") ") ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġ" success ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Failed Ġto Ġscroll Ġto Ġelement ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Dom (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexecute Js In Browser (""" document . documentElement . innerHTML """) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexecute Js In Browser (@ Language (" JavaScript ") Ġjs : ĠString ): ĠString Ġ= Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscript Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġc ef Browser Ġ= Ġlocal . get ("$ CE F _ BROWSER _ KEY "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cef Browser ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġnew ĠError ("$ CE F _ BROWSER _ KEY Ġwas Ġnot Ġinitialized "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġquery Ġ= Ġlocal . get ("$ QUERY _ KEY "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! query ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġnew ĠError ("$ QUERY _ KEY Ġwas Ġnot Ġinitialized "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġin Progress Ġ= Ġ" IN ĠPROG RESS " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal . put ("$ RESULT _ KEY ", Ġin Progress ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġget Result Ġ= Ġ() Ġ=> Ġlocal . get ("$ RESULT _ KEY ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġinit Script Ġ= Ġ`${ INIT _ FIND ER . make It One Line () }` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc ef Browser . execute JavaScript ( init Script , Ġc ef Browser . get URL (), Ġ 0 ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġc ef Browser . execute JavaScript ( query . inject ('$ js '), Ġc ef Browser . get URL (), Ġ 0 ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġx Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno inspection ĠE quality Comparison With Co erc ion JS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( getResult () Ġ== Ġin Progress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ($ EXECUTE _ JS _ POLL _ INTERVAL _ MS ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx ++; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ* Ġ$ EXECUTE _ JS _ POLL _ INTERVAL _ MS Ġ> Ġ$ EXECUTE _ JS _ TIMEOUT _ MS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġ" No Ġresult Ġfrom Ġscript Ġ'$ js ' Ġin Ġembedded Ġbrowser . ĠCheck Ġlogs Ġin Ġbrowsers ĠDev Tools ( right Ġclick Ġat Ġthe Ġbrowser )" ĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Result (); ĊĠĠĠĠĠĠĠ Ġ""" ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcall Js ( script ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJ CE F Script Execution Error ( script , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . make It One Line (): ĠString Ġ= Ġsplit ("\ n ") ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstr Ġ= Ġit . trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str . isNotEmpty () Ġ&& Ġstr . endsWith ("; "). not () Ġ&& Ġstr . endsWith ("{ "). not () Ġ&& Ġstr . endsWith (" } "). not ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr Ġ= Ġ"$ str ;" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstr ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġbuild String Ġ{ Ġit . forEach Ġ{ Ġappend ("$ it Ġ") Ġ} Ġ} Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . escape Xpath () Ġ= Ġreplace (" '", Ġ"\\ x 2 7 ") ĊĠĠĠĠĠĠĠ Ġ. replace (" \"", Ġ"\\ x 2 2 ") ĊĊĊĠĠĠ Ġfun Ġfind Element By Text ( text : ĠString ): ĠDom Element Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Element (" //* [ text () ='$ text '] ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Elements By Text ( text : ĠString ): ĠList < Dom Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Elements (" //* [ text () ='$ text '] ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Element By Contains Text ( text : ĠString ): ĠDom Element Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Element (" //* [ contains ( text (), Ġ'$ text ')] ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Elements By Contains Text ( text : ĠString ): ĠList < Dom Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Elements (" //* [ contains ( text (), Ġ'$ text ')] ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠDom Element ( val Ġcontainer : ĠJ C ef Browser Fixture , Ġvar Ġelement Data : ĠJ C ef Browser Fixture . Element Data ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġx ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement Data . location . x . round ToInt () ĊĊĠĠĠ Ġprivate Ġval Ġy ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement Data . location . y . round ToInt () ĊĊĠĠĠ Ġprivate Ġval Ġwidth ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement Data . location . width . round ToInt () ĊĊĠĠĠ Ġprivate Ġval Ġheight ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement Data . location . height . round ToInt () ĊĊĠĠĠ Ġprivate Ġval Ġcenter X ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġx Ġ+ Ġwidth Ġ/ Ġ 2 ĊĊĠĠĠ Ġprivate Ġval Ġcenter Y ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġy Ġ+ Ġheight Ġ/ Ġ 2 ĊĊĠĠĠ Ġprivate Ġval Ġxpath ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement Data . xpath ĊĊĠĠĠ Ġval Ġhtml ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġelement Data . html ĊĊĠĠĠ Ġfun Ġclick At Center () Ġ= Ġstep (" click Ġat Ġ${ element Data . tag }") Ġ{ ĊĠĠĠĠĠĠĠ Ġscroll () ĊĠĠĠĠĠĠĠ Ġcontainer . run Js ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠ Ġrobot . click ( component , Ġnew ĠPoint ($ center X , Ġ$ center Y )) ĠĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclick () Ġ= Ġstep (" click Ġat Ġ${ element Data . tag }") Ġ{ ĊĠĠĠĠĠĠĠ Ġscroll () ĊĠĠĠĠĠĠĠ Ġcontainer . run Js ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠ Ġrobot . click ( component , Ġnew ĠPoint (${ x Ġ+ Ġheight Ġ/ Ġ 2 }, Ġ$ center Y )) ĠĊĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscroll () Ġ= Ġstep (" scroll Ġto Ġ${ element Data . tag }") Ġ{ ĊĠĠĠĠĠĠĠ Ġcontainer . scrollTo ( xpath ) ĊĠĠĠĠĠĠĠ Ġelement Data Ġ= Ġcontainer . findElement ( xpath ). element Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement Data . html ĊĠĠĠ Ġ} Ċ }