/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠZ UP ĠIT ĠSER V IC OS ĠEM ĠT EC NO LOG IA ĠE ĠIN OV AC AO ĠSA Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" RED UND ANT _ ELSE _ IN _ WHEN ") Ċ Ċ package Ġbr . com . z up . be agle . utils Ċ Ċ import Ġio . app ium . java _ client . App ium Driver Ċ import Ġio . app ium . java _ client . Mobile By Ċ import Ġio . app ium . java _ client . Mobile Driver Ċ import Ġio . app ium . java _ client . Mobile Element Ċ import Ġio . app ium . java _ client . android . Android Driver Ċ import Ġio . app ium . java _ client . android . Android Touch Action Ċ import Ġio . app ium . java _ client . functions . Expected Condition Ċ import Ġio . app ium . java _ client . ios . IO ST ouch Action Ċ import Ġio . app ium . java _ client . touch . Wait Options Ċ import Ġio . app ium . java _ client . touch . offset . Point Option Ċ import Ġorg . openqa . selenium .* Ċ import Ġorg . openqa . selenium . NoSuch ElementException Ċ import Ġorg . openqa . selenium . support . ui . Expected Conditions Ċ import Ġorg . openqa . selenium . support . ui . Fluent Wait Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġjava . io . File Ċ import Ġjava . time . Duration Ċ import Ġjava . util .* Ċ import Ġjavax . image io . Image IO Ċ import Ġkotlin . Array Ċ import Ġkotlin . Boolean Ċ import Ġkotlin . Exception Ċ import Ġkotlin . IllegalArgumentException Ċ import Ġkotlin . Int Ċ import Ġkotlin . Long Ċ import Ġkotlin . String Ċ import Ġjava . util . HashMap ĊĊ Ċ object ĠApp ium Util Ġ{ ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġscroll To Element ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġelement Locator : ĠBy , ĊĠĠĠĠĠĠĠ Ġswipe Direction : ĠSw ipe Direction , ĊĠĠĠĠĠĠĠ Ġelement Search Timeout : ĠLong , ĊĠĠĠĠĠĠĠ Ġoverall Search Timeout : ĠLong ĊĠĠĠ Ġ): ĠMobile Element Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( overall Search Timeout Ġ<= Ġelement Search Timeout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Swipe Ġtimeout Ġmust Ġbe Ġgreater Ġthan Ġelement Ġsearch Ġtimeout !") ĊĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( overall Search Timeout )) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until ( Expected Condition < Mobile Element > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Exists ( driver , Ġelement Locator , Ġelement Search Timeout )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Expected Condition Ġdriver . findElement ( element Locator ) Ġas ĠMobile Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswipe Screen To ( driver , Ġswipe Direction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Expected Condition Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġswipe Screen To ( driver : ĠMobile Driver <* >, Ġswipe Direction : ĠSw ipe Direction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( driver Ġis ĠAndroid Driver <* >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Swipe Screen To ( driver , Ġswipe Direction ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġios Swipe Screen To ( driver , Ġswipe Direction ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPerforms Ġswipe Ġfrom Ġthe Ġcenter Ġof Ġscreen ĊĠĠĠĠ Ġ* ĠAdapt ed Ġfrom Ġhttp :// app ium . io / docs / en / writing - running - app ium / tutorial / swipe / ios - mobile - screen / ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġios Swipe Screen To ( driver : ĠMobile Driver <* >, Ġswipe Direction : ĠSw ipe Direction ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġscroll Object Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġwhen Ġ( swipe Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . DOWN Ġ-> Ġscroll Object [" direction "] Ġ= Ġ" down " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . UP Ġ-> Ġscroll Object [" direction "] Ġ= Ġ" up " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . LEFT Ġ-> Ġscroll Object [" direction "] Ġ= Ġ" left " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . RIGHT Ġ-> Ġscroll Object [" direction "] Ġ= Ġ" right " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" mobile Swipe Screen IOS (): Ġdir : Ġ'$ swipe Direction ' ĠNOT Ġsupported ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ( driver Ġas ĠJavascript Executor ). execute Script (" mobile : swipe ", Ġscroll Object ) ĊĊĠĠĠĠĠĠĠ ĠThread . sleep ( animation Time . to Long ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPerforms Ġswipe Ġfrom Ġthe Ġcenter Ġof Ġscreen ĊĠĠĠĠ Ġ* ĠAdapt ed Ġfrom Ġhttp :// app ium . io / docs / en / writing - running - app ium / tutorial / swipe / simple - screen / ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġandroid Swipe Screen To ( driver : ĠMobile Driver <* >, Ġswipe Direction : ĠSw ipe Direction ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Time Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġpress Time Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġedge Border Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġpoint Option Start : ĠPoint Option < *> ĊĠĠĠĠĠĠĠ Ġval Ġpoint Option End : ĠPoint Option < *> ĊĊĠĠĠĠĠĠĠ Ġ// Ġinit Ġscreen Ġvariables ĊĠĠĠĠĠĠĠ Ġval Ġdims : ĠDimension Ġ= Ġdriver . manage (). window (). getSize () ĊĊĠĠĠĠĠĠĠ Ġ// Ġinit Ġstart Ġpoint Ġ= Ġcenter Ġof Ġscreen ĊĠĠĠĠĠĠĠ Ġpoint Option Start Ġ= ĠPoint Option . point ( dims . width Ġ/ Ġ 2 , Ġdims . height Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġpoint Option End Ġ= Ġwhen Ġ( swipe Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . DOWN Ġ-> ĠPoint Option . point ( dims . width Ġ/ Ġ 2 , Ġdims . height Ġ- Ġedge Border ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . UP Ġ-> ĠPoint Option . point ( dims . width Ġ/ Ġ 2 , Ġedge Border ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . LEFT Ġ-> ĠPoint Option . point ( edge Border , Ġdims . height Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . RIGHT Ġ-> ĠPoint Option . point ( dims . width Ġ- Ġedge Border , Ġdims . height Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" swipe Screen (): Ġdir : Ġ'$ swipe Direction ' ĠNOT Ġsupported ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġexecute Ġswipe Ġusing ĠTouch Action ĊĠĠĠĠĠĠĠ ĠAndroid Touch Action ( driver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. press ( point Option Start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wait Action ( Wait Options . wait Options ( Duration . of Millis ( press Time . to Long ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. moveTo ( point Option End ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. release (). perform () ĊĊĠĠĠĠĠĠĠ ĠThread . sleep ( animation Time . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScroll s Ġfrom Ġthe Ġposition Ġof Ġorigin Point Ġto Ġdestination Point ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġandroid Scroll Screen From One Point To Another ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġorigin Point : ĠPoint , ĊĠĠĠĠĠĠĠ Ġdestination Point : ĠPoint , ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġpress Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĊĠĠĠĠĠĠĠ ĠAndroid Touch Action ( driver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. press ( Point Option . point ( origin Point . x , Ġorigin Point . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wait Action ( Wait Options . wait Options ( Duration . of Millis ( press Time . to Long ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. moveTo ( Point Option . point ( destination Point . x , Ġdestination Point . y )). perform () ĊĊĠĠĠĠĠĠĠ ĠThread . sleep ( animation Time . to Long ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScroll s Ġfrom Ġthe Ġposition Ġof Ġa Ġgiven Ġpoint Ġto Ġthe Ġborder Ġof Ġthe Ġscreen ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġandroid Scroll Screen From One Point To Border ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġorigin Point : ĠPoint , ĊĠĠĠĠĠĠĠ Ġswipe Direction : ĠSw ipe Direction ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġpress Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġborder Edge Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġscreen Size Ġ= Ġdriver . manage (). window (). size ĊĊĠĠĠĠĠĠĠ Ġval Ġdestination Point Ġ= Ġwhen Ġ( swipe Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . DOWN Ġ-> ĠPoint Option . point ( origin Point . x , Ġscreen Size . height Ġ- Ġborder Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . UP Ġ-> ĠPoint Option . point ( origin Point . x , Ġborder Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . LEFT Ġ-> ĠPoint Option . point ( border Edge , Ġorigin Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . RIGHT Ġ-> ĠPoint Option . point ( screen Size . width Ġ- Ġborder Edge , Ġorigin Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Dire tion Ġ'$ swipe Direction ' Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAndroid Touch Action ( driver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. press ( Point Option . point ( origin Point . x , Ġorigin Point . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wait Action ( Wait Options . wait Options ( Duration . of Millis ( press Time . to Long ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. moveTo ( destination Point ). perform () ĊĊĠĠĠĠĠĠĠ ĠThread . sleep ( animation Time . to Long ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScroll s Ġfrom Ġthe Ġposition Ġof Ġa Ġgiven Ġpoint Ġto Ġthe Ġcenter Ġof Ġthe Ġscreen ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġandroid Scroll Screen From One Point To Center Point ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġorigin Point : ĠPoint , ĊĠĠĠĠĠĠĠ Ġhorizontal Scroll : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġpress Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġscreen Size Ġ= Ġdriver . manage (). window (). size ĊĠĠĠĠĠĠĠ Ġvar Ġdestination Point X Ġ= Ġorigin Point . x ĊĠĠĠĠĠĠĠ Ġvar Ġdestination Point Y Ġ= Ġorigin Point . y ĊĊĠĠĠĠĠĠĠ Ġif Ġ( horizontal Scroll ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Point X Ġ= Ġscreen Size . width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Point Y Ġ= Ġscreen Size . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdestination Point Ġ= ĠPoint Option . point ( destination Point X , Ġdestination Point Y ) ĊĊĠĠĠĠĠĠĠ ĠAndroid Touch Action ( driver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. press ( Point Option . point ( origin Point . x , Ġorigin Point . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wait Action ( Wait Options . wait Options ( Duration . of Millis ( press Time . to Long ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. moveTo ( destination Point ). perform () ĊĊĠĠĠĠĠĠĠ ĠThread . sleep ( animation Time . to Long ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScroll s Ġfrom Ġthe Ġposition Ġof Ġa Ġgiven Ġelement Ġto Ġthe Ġborder Ġof Ġthe Ġscreen ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġios Scroll Screen From One Point To Border ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġorigin Point : ĠPoint , ĊĠĠĠĠĠĠĠ Ġswipe Direction : ĠSw ipe Direction ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Border Edge Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġvertical Border Edge Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġscreen Size Ġ= Ġdriver . manage (). window (). size ĊĊĠĠĠĠĠĠĠ Ġvar Ġtimeout Ġ= Ġ 2 0 0 L ĊĠĠĠĠĠĠĠ Ġif Ġ( swipe Direction Ġ== ĠSw ipe Direction . UP Ġ|| Ġswipe Direction Ġ== ĠSw ipe Direction . DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimeout Ġ= Ġ 2 0 0 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOrigin Ġpoint Ġshould Ġnot Ġbe Ġlocated Ġbefore Ġborder Ġlimits ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( origin Point . x Ġ< Ġhorizontal Border Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Point . x Ġ= Ġhorizontal Border Edge ĊĠĠĠĠĠĠĠ Ġif Ġ( origin Point . y Ġ< Ġvertical Border Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Point . y Ġ= Ġvertical Border Edge ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠShould Ġnot Ġclick Ġoutside Ġthe Ġscreen Ġborder . ĠOn ĠiOS , Ġclicks Ġnear Ġthe Ġborder Ġsometimes Ġwon 't Ġwork , Ġso ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġorigin Ġpoint Ġis Ġre work ed ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( origin Point . x Ġ> Ġ( screen Size . width Ġ- Ġhorizontal Border Edge )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Point . x Ġ= Ġscreen Size . width Ġ- Ġhorizontal Border Edge ĊĠĠĠĠĠĠĠ Ġif Ġ( origin Point . y Ġ>= Ġ( screen Size . height Ġ- Ġvertical Border Edge )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Point . y Ġ= Ġscreen Size . height Ġ- Ġvertical Border Edge ĊĊĊĠĠĠĠĠĠĠ Ġval Ġdestination Point Ġ= Ġwhen Ġ( swipe Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . DOWN Ġ-> ĠPoint ( origin Point . x , Ġscreen Size . height Ġ- Ġvertical Border Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . UP Ġ-> ĠPoint ( origin Point . x , Ġvertical Border Edge ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . LEFT Ġ-> ĠPoint ( horizontal Border Edge , Ġorigin Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . RIGHT Ġ-> ĠPoint ( screen Size . width Ġ- Ġhorizontal Border Edge , Ġorigin Point . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Dire tion Ġ'$ swipe Direction ' Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠIO ST ouch Action ( driver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. press ( Point Option . point ( origin Point . x , Ġorigin Point . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wait Action ( Wait Options . wait Options ( Duration . of Millis ( timeout ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. moveTo ( Point Option . point ( destination Point )). perform () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠScroll s Ġfrom Ġthe Ġposition Ġof Ġa Ġgiven Ġpoint Ġto Ġthe Ġcenter Ġof Ġthe Ġscreen ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġios Scroll Screen From One Point To Center Point ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġorigin Point : ĠPoint , ĊĠĠĠĠĠĠĠ Ġhorizontal Scroll : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Border Edge Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġvertical Border Edge Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġanimation Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġpress Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġscreen Size Ġ= Ġdriver . manage (). window (). size ĊĠĠĠĠĠĠĠ Ġvar Ġdestination Point X Ġ= Ġorigin Point . x ĊĠĠĠĠĠĠĠ Ġvar Ġdestination Point Y Ġ= Ġorigin Point . y ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠShould Ġnot Ġclick Ġoutside Ġthe Ġscreen Ġborder . ĠOn ĠiOS , Ġclicks Ġnear Ġthe Ġborder Ġsometimes Ġwon 't Ġwork , Ġso ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġorigin Ġpoint Ġis Ġre work ed ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( origin Point . x Ġ> Ġ( screen Size . width Ġ- Ġhorizontal Border Edge )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Point . x Ġ= Ġscreen Size . width Ġ- Ġhorizontal Border Edge ĊĠĠĠĠĠĠĠ Ġif Ġ( origin Point . y Ġ>= Ġ( screen Size . height Ġ- Ġvertical Border Edge )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Point . y Ġ= Ġscreen Size . height Ġ- Ġvertical Border Edge ĊĊĠĠĠĠĠĠĠ Ġif Ġ( horizontal Scroll ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Point X Ġ= Ġscreen Size . width Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Point Y Ġ= Ġscreen Size . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdestination Point Ġ= ĠPoint Option . point ( destination Point X , Ġdestination Point Y ) ĊĊĠĠĠĠĠĠĠ ĠIO ST ouch Action ( driver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. press ( Point Option . point ( origin Point . x , Ġorigin Point . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wait Action ( Wait Options . wait Options ( Duration . of Millis ( press Time . to Long ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. moveTo ( destination Point ). perform () ĊĊĠĠĠĠĠĠĠ ĠThread . sleep ( animation Time . to Long ()) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUses Ġthe Ġvisible Ġpart Ġof Ġthe Ġgiven Ġelement Ġas Ġthe Ġunit Ġof Ġ Ġthe Ġscrolling . ĠIf Ġthe Ġdirection Ġis Ġup Ġor ĊĠĠĠĠ Ġ* Ġdown , Ġthe Ġdisplay Ġwill Ġbe Ġsc rolled Ġby Ġthe Ġheight Ġof Ġthe Ġelement . ĠIf Ġthe Ġdirection Ġis Ġright Ġor Ġleft Ġthe Ġelement ĊĠĠĠĠ Ġ* Ġwill Ġbe Ġsc rolled Ġby Ġits Ġvisible Ġwidth . ĊĠĠĠĠ Ġ* Ġsource : Ġhttps :// developers . perfect om obile . com / pages / view page . action ? page Id = 2 5 1 9 9 7 0 4 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġios Scroll Inside Element ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġelement : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġswipe Direction : ĠSw ipe Direction ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġscroll Object Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġwhen Ġ( swipe Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . DOWN Ġ-> Ġscroll Object [" direction "] Ġ= Ġ" down " Ġ// Ġfrom Ġdown Ġto Ġup Ġ(! Ġdiffers Ġfrom Ġmobile : swipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . UP Ġ-> Ġscroll Object [" direction "] Ġ= Ġ" up " Ġ// Ġfrom Ġup Ġto Ġdown Ġ(! Ġdiffers Ġfrom Ġmobile : swipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . LEFT Ġ-> Ġscroll Object [" direction "] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" left " Ġ// Ġfrom Ġleft Ġto Ġright Ġ(! Ġdiffers Ġfrom Ġmobile : swipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . RIGHT Ġ-> Ġscroll Object [" direction "] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" right " Ġ// Ġfrom Ġright Ġto Ġleft Ġ(! Ġdiffers Ġfrom Ġmobile : swipe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" mobile Swipe Screen IOS (): Ġdir : Ġ'$ swipe Direction ' ĠNOT Ġsupported ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġscroll Object [" element "] Ġ= Ġelement . id ĊĠĠĠĠĠĠĠ Ġ( driver Ġas ĠJavascript Executor ). execute Script (" mobile : scroll ", Ġscroll Object ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSame Ġas Ġios Scroll Inside Element . ĊĠĠĠĠ Ġ* ĠAdapt ed Ġfrom Ġhttp :// app ium . io / docs / en / writing - running - app ium / tutorial / swipe / simple - element / ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġandroid Scroll Inside Element ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġelement : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġswipe Direction : ĠSw ipe Direction ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġanimation Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĠĠĠĠĠĠĠ Ġval Ġpress Time Ġ= Ġ 2 0 0 Ġ// Ġms ĊĊĠĠĠĠĠĠĠ Ġval Ġedge Border Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġpoint Option Start : ĠPoint Option < *> ĊĠĠĠĠĠĠĠ Ġval Ġpoint Option End : ĠPoint Option < *> ĊĊĠĠĠĠĠĠĠ Ġval Ġrect : ĠRectangle Ġ= Ġelement . get Rect () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( swipe Direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Option Start Ġ= ĠPoint Option . point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ+ Ġrect . width Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ+ Ġedge Border ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Option End Ġ= ĠPoint Option . point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ+ Ġrect . width Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ+ Ġrect . height Ġ- Ġedge Border ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Option Start Ġ= ĠPoint Option . point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ+ Ġrect . width Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ+ Ġrect . height Ġ- Ġedge Border ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Option End Ġ= ĠPoint Option . point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ+ Ġrect . width Ġ/ Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ+ Ġedge Border ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Option Start Ġ= ĠPoint Option . point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ+ Ġrect . width Ġ- Ġedge Border , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ+ Ġrect . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Option End Ġ= ĠPoint Option . point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ+ Ġedge Border , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ+ Ġrect . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSw ipe Direction . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Option Start Ġ= ĠPoint Option . point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ+ Ġedge Border , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ+ Ġrect . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint Option End Ġ= ĠPoint Option . point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . x Ġ+ Ġrect . width Ġ- Ġedge Border , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . y Ġ+ Ġrect . height Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" swipe Element Android (): Ġdir : Ġ'" Ġ+ Ġswipe Direction . toString () Ġ+ Ġ"' ĠNOT Ġsupported ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAndroid Touch Action ( driver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. press ( point Option Start ) Ġ// Ġa Ġbit Ġmore Ġreliable Ġwhen Ġwe Ġadd Ġsmall Ġwait ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. wait Action ( Wait Options . wait Options ( Duration . of Millis ( press Time . to Long ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. moveTo ( point Option End ). perform () ĊĊĠĠĠĠĠĠĠ ĠThread . sleep ( animation Time . to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsrc : Ġhttp :// app ium . io / docs / en / writing - running - app ium / tutorial / swipe / android - multiple / ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġandroid Scroll To Element By Text ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġscroll Element Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġelement Text : ĠString , ĊĠĠĠĠĠĠĠ Ġis Horizontal Scroll : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Horizontal Scroll ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdriver . findElement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMobile By . Android UI Autom ator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" new ĠUi Scroll able ( new ĠUi Selector (). scroll able ( true )" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". instance ($ scroll Element Index )). set As Horizontal List ()" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". scroll Into View ( new ĠUi Selector (). text (\" $ element Text \" )) " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdriver . findElement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMobile By . Android UI Autom ator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" new ĠUi Scroll able ( new ĠUi Selector (). scroll able ( true )" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". instance ($ scroll Element Index )) " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ". scroll Into View ( new ĠUi Selector (). text (\" $ element Text \" )) " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġan Ġelement Ġto Ġbe Ġfound Ġon Ġthe Ġscreen Ġelement Ġtree . ĠThis Ġdoes Ġnot ĊĠĠĠĠ Ġ* Ġnecessarily Ġmean Ġthat Ġthe Ġelement Ġis Ġvisible . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Element ToBe Present ( driver : ĠMobile Driver <* >, Ġlocator : ĠBy , Ġtimeout In Milliseconds : ĠLong ): ĠMobile Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait : ĠFluent Wait < Mobile Driver <* >> Ġ= ĠFluent Wait < Mobile Driver < *> >( driver ) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( NoSuch ElementException :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( St ale Element Reference Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until ( Expected Conditions . presence Of Element Loc ated ( locator )) Ġas ĠMobile Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġan Ġelement , Ġchild Ġof Ġa Ġgiven Ġparent Ġelement , Ġto Ġbe Ġfound Ġon Ġthe Ġscreen Ġelement Ġtree . ĠThis Ġdoes Ġnot ĊĠĠĠĠ Ġ* Ġnecessarily Ġmean Ġthat Ġthe Ġelement Ġis Ġvisible . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Child Element ToBe Present ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġparent Element : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġlocator : ĠBy , ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong ĊĠĠĠ Ġ): ĠMobile Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait : ĠFluent Wait < Mobile Driver <* >> Ġ= ĠFluent Wait < Mobile Driver < *> >( driver ) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( NoSuch ElementException :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( St ale Element Reference Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Element . findElement ( locator ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠMobile Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġa Ġlist Ġof Ġelements , Ġchildren Ġof Ġa Ġgiven Ġparent Ġelement , Ġto Ġbe Ġfound Ġon Ġthe Ġscreen Ġelement Ġtree . ĠThis Ġdoes Ġnot ĊĠĠĠĠ Ġ* Ġnecessarily Ġmean Ġthat Ġthese Ġelements Ġare Ġvisible . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Children Elements ToBe Present ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġparent Element : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġlocator : ĠBy , ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong ĊĠĠĠ Ġ): ĠList < Mobile Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait : ĠFluent Wait < Mobile Driver <* >> Ġ= ĠFluent Wait < Mobile Driver < *> >( driver ) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( NoSuch ElementException :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( St ale Element Reference Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Element . find Elements ( locator ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠList < Mobile Element > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġan Ġelement Ġto Ġbe Ġvisible Ġand Ġenabled Ġ( click able ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Element ToBe Clickable ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġlocator : ĠBy , ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong , ĊĠĠĠ Ġ): ĠMobile Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( NoSuch ElementException :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( St ale Element Reference Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( Element Not Interact able Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( Element Not Visible Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until ( Expected Conditions . element ToBe Clickable ( locator )) Ġas ĠMobile Element Ġ// Ġclick able Ġ= Ġverifies Ġenabled Ġe Ġvisibility ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġan Ġelement Ġto Ġbe Ġvisible Ġand Ġenabled Ġ( click able ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Element ToBe Clickable ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġelement : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong ĊĠĠĠ Ġ): ĠMobile Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( NoSuch ElementException :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( St ale Element Reference Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( Element Not Interact able Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġwait . ign oring ( Element Not Visible Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until ( Expected Conditions . element ToBe Clickable ( element )) Ġas ĠMobile Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġa Ġset Ġof Ġelements Ġto Ġbe Ġvisible Ġand Ġenabled Ġ( click able ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Elements ToBe Clickable ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġelements : ĠArray < Mobile Element >, ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Element ToBe Clickable ( driver , Ġelement , Ġtimeout In Milliseconds ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġan Ġelement Ġto Ġbe Ġhidden Ġor Ġnon existent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Element ToBe In visible ( driver : ĠMobile Driver <* >, Ġlocator : ĠBy , Ġtimeout In Milliseconds : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until ( Expected Conditions . in visibility Of Element Loc ated ( locator )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġelements Ġto Ġbe Ġhidden Ġor Ġnon existent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Elements ToBe In visible ( driver : ĠMobile Driver <* >, Ġlocator : ĠBy , Ġtimeout In Milliseconds : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdriver . find Elements ( locator ). size Ġ== Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġan Ġelement Ġto Ġbe Ġvisible Ġand Ġdisabled Ġ( not Ġclick able ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Element ToBe Disabled ( driver : ĠMobile Driver <* >, Ġlocator : ĠBy , Ġtimeout In Milliseconds : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmobile Element Ġ= ĠwaitFor Element ToBe Present ( driver , Ġlocator , Ġtimeout In Milliseconds ) ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmobile Element . is Displayed Ġ&& Ġ! mobile Element . isEnabled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Element Text ToBe ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġelement : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ until Ġelement . text Ġ== Ġtext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun ĠwaitFor Element Attribute ToBe ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġelement : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġattribute : ĠString , ĊĠĠĠĠĠĠĠ Ġvalue : ĠString , ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getAttribute ( attribute ) Ġ!= Ġnull Ġ&& Ġelement . getAttribute ( attribute ) Ġ== Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtable Element ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĊĠĠĠĠ Ġ* Ġ@ return Ġline Ġelements Ġ( tr ) Ġthat Ġcontains Ġthe Ġgiven Ġvalue Ġ(@ param Ġvalue ) Ġin Ġits Ġchildren 's Ġtext () Ġattribute ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġget Table Line Elements That Contains Text ( ĊĠĠĠĠĠĠĠ Ġtable Element : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġvalue : ĠString ĊĠĠĠ Ġ): ĠList < Mobile Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresults : ĠList < Mobile Element > ĊĠĠĠĠĠĠĠ Ġval Ġxpath Ġ= Ġ". // tr [ . //* [ contains ( text (), '$ value ') ]] " ĊĠĠĠĠĠĠĠ Ġresults Ġ= Ġtable Element . find Elements ( By . xpath ( xpath )) ĊĠĠĠĠĠĠĠ Ġreturn Ġresults ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġelement Exists ( driver : ĠMobile Driver <* >, Ġlocator : ĠBy , Ġtimeout In Milliseconds : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Element ToBe Present ( driver , Ġlocator , Ġtimeout In Milliseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġ// Ġelement Ġfound ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġchild Element Exists ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġparent Element : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġchild Locator : ĠBy , ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠwaitFor Child Element ToBe Present ( driver , Ġparent Element , Ġchild Locator , Ġtimeout In Milliseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġ// Ġelement Ġfound ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT ries Ġto Ġset Ġa Ġvalue Ġfor Ġtimeout In Milliseconds ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġset Element Value ( ĊĠĠĠĠĠĠĠ Ġdriver : ĠMobile Driver <* >, ĊĠĠĠĠĠĠĠ Ġelement : ĠMobile Element , ĊĠĠĠĠĠĠĠ Ġvalue : ĠString , ĊĠĠĠĠĠĠĠ Ġtimeout In Milliseconds : ĠLong ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġelement . clear () ĊĠĠĠĠĠĠĠ Ġelement . send Keys ( value ) ĊĠĠĠĠĠĠĠ Ġval Ġwait Ġ= ĠFluent Wait ( driver ) ĊĠĠĠĠĠĠĠ Ġwait . with Timeout ( Duration . of Millis ( timeout In Milliseconds )) ĊĠĠĠĠĠĠĠ Ġwait . polling Every ( Duration . of Millis ( 2 0 0 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġwait . until ( Expected Condition < Boolean > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Element Value Ġ= Ġelement . getAttribute (" value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Element Value Ġ!= Ġnull Ġ&& Ġvalue . equals ( current Element Value )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Expected Condition Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . send Keys ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Expected Condition Ġfalse ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġelement 1 Ġis Ġabove Ġelement 2 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġis Element Above Element ( element 1 : ĠMobile Element , Ġelement 2 : ĠMobile Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġelement 1 Location Y : ĠInt Ġ= Ġelement 1 . location . y Ġ// Ġ+ Ġelement 1 . size . height ĊĠĠĠĠĠĠĠ Ġvar Ġelement 2 Location Y : ĠInt Ġ= Ġelement 2 . location . y ĊĊĠĠĠĠĠĠĠ Ġif Ġ( element 2 Location Y Ġ> Ġelement 1 Location Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġget Xpath Locator ( property : ĠString , Ġproperty Value : ĠString , Ġlike Search : ĠBoolean , Ġignore Case : ĠBoolean ): ĠBy Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġkey Ġ= Ġ"@ $ property " ĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ"\" $ property Value \"" ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ignore Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġ" translate (@ $ property , Ġ' ABCDEF GH IJ KL MN OP Q RST UV W XYZ ', Ġ' abcdefgh ijkl mnopqrst uvw xyz ')" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue . toLowerCase () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( like Search ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBy . xpath (" //* [ contains ($ key , Ġ$ value )] ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBy . xpath (" //* [$ key =$ value ]") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUses Ġa Ġnative ĠiOS Ġlocator Ġstrategy . ĠF aster Ġthan ĠXPath ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġsrc : ĊĠĠĠĠ Ġ* Ġ Ġhttps :// github . com / facebook archive / WebDriver Agent / wiki / Predicate - Queries - Construction - Rules ĊĠĠĠĠ Ġ* Ġ Ġhttps :// app ium . io / docs / en / writing - running - app ium / ios / ios - predicate /# ios - predicate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġget IOS Ns Predicate Locator ( ĊĠĠĠĠĠĠĠ Ġelement Property : ĠString , ĊĠĠĠĠĠĠĠ Ġelement PropertyValue : ĠString , ĊĠĠĠĠĠĠĠ Ġlike Search : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġignore Case : ĠBoolean ĊĠĠĠ Ġ): ĠBy Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( like Search Ġ&& Ġignore Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMobile By . iOS Ns Predicate String ("$ element Property ĠCON TA INS [ c ] Ġ'${ element PropertyValue }' ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( like Search ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMobile By . iOS Ns Predicate String ("$ element Property ĠCON TA INS Ġ'${ element PropertyValue }' ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ignore Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMobile By . iOS Ns Predicate String ("$ element Property Ġ== [ c ] Ġ'${ element PropertyValue }' ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMobile By . iOS Ns Predicate String ("$ element Property Ġ== Ġ'${ element PropertyValue }' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcurrent Ġrunning Ġapp Ġscreenshot Ġwithout Ġthe Ġdevice 's Ġstatus Ġand Ġnavigation Ġbar , Ġusing ĊĠĠĠĠ Ġ* Ġ@ param Ġlocator Ġto Ġcrop Ġthe Ġscreenshot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġget App Screenshot ( driver : ĠApp ium Driver <* >, Ġlocator : ĠBy ): ĠFile Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġgets Ġthe Ġbase Ġelement 's Ġposition ĊĠĠĠĠĠĠĠ Ġval Ġbase Element Ġ= Ġdriver . findElement ( locator ) ĊĠĠĠĠĠĠĠ Ġval Ġbase Element Location Ġ= Ġbase Element . location ĊĠĠĠĠĠĠĠ Ġval Ġbase Element Width Ġ= Ġbase Element . size . getWidth () ĊĠĠĠĠĠĠĠ Ġval Ġbase Element Height Ġ= Ġbase Element . size . getHeight () ĊĊĠĠĠĠĠĠĠ Ġ// Ġtakes Ġa Ġscreenshot Ġof Ġthe Ġwhole Ġdevice Ġscreen . ĊĠĠĠĠĠĠĠ Ġval Ġscreenshot Ġ= Ġ( driver Ġas ĠTakes Screenshot ). get Screenshot As ( OutputType . FILE ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcro ps Ġthe Ġimage Ġselection Ġonly Ġthe Ġbase Ġelement Ġcoordinates ĊĠĠĠĠĠĠĠ Ġval Ġbuffered Image Ġ= ĠImage IO . read ( screenshot ) ĊĠĠĠĠĠĠĠ Ġval Ġbase Element Screenshot : ĠBufferedImage Ġ= Ġbuffered Image . getSub image ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Element Location . getX (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Element Location . getY (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Element Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Element Height ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsave Ġthe Ġc ropped Ġimage Ġover writing Ġthe Ġscreenshot Ġfile ĊĠĠĠĠĠĠĠ ĠImage IO . write ( base Element Screenshot , Ġ" png ", Ġscreenshot ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġscreenshot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcurrent Ġrunning Ġapp Ġscreenshot Ġwithout Ġthe Ġdevice 's Ġstatus Ġand Ġnavigation Ġbar ĊĠĠĠĠ Ġ* ĠDevice : ĠiPhone Ġ 1 1 ĊĠĠĠĠ Ġ* ĠmacOS Ġresolution : Ġ 2 5 6 0 Ġx Ġ 1 6 0 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġget I os App Screenshot ( driver : ĠApp ium Driver < *> ): ĠFile Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġtakes Ġa Ġscreenshot Ġof Ġthe Ġwhole Ġdevice Ġscreen . ĊĠĠĠĠĠĠĠ Ġval Ġscreenshot Ġ= Ġ( driver Ġas ĠTakes Screenshot ). get Screenshot As ( OutputType . FILE ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcro ps Ġthe Ġimage Ġselection Ġonly Ġthe Ġbase Ġelement Ġcoordinates ĊĠĠĠĠĠĠĠ Ġval Ġbuffered Image Ġ= ĠImage IO . read ( screenshot ) ĊĠĠĠĠĠĠĠ Ġval Ġbase Element Screenshot : ĠBufferedImage Ġ= Ġbuffered Image . getSub image ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 6 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 8 2 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 6 8 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġsave Ġthe Ġc ropped Ġimage Ġover writing Ġthe Ġscreenshot Ġfile ĊĠĠĠĠĠĠĠ ĠImage IO . write ( base Element Screenshot , Ġ" png ", Ġscreenshot ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġscreenshot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġfun Ġi O St ap On Center Of Element ( driver : ĠApp ium Driver <* >, Ġelement : ĠMobile Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġelement . center . x ĊĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġelement . center . y ĊĠĠĠĠĠĠĠ ĠIO ST ouch Action ( driver ). tap ( Point Option . point ( x , Ġy )). perform () ĊĠĠĠ Ġ} Ċ }