package Ġcom . g ig igo . orche x tras dk . demo . test . steps ĊĊ Ċ import Ġandroid . os . Build Ċ import Ġandroidx . test . platform . app . Instrumentation Registry Ċ import Ġandroidx . test . platform . app . Instrumentation Registry . getTarget Context Ċ import Ġandroidx . test . espress o . Esp ress o Exception Ċ import Ġcom . g ig igo . orche x tras dk . demo . test . util . Spoon Screenshot Action Ċ import Ġc ucumber . api . Scenario Ċ import Ġc ucumber . api . java . After Ċ import Ġc ucumber . api . java . Before Ċ import Ġc ucumber . api . java . en . Given Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠClass Ġcontaining Ġgeneric ĠC ucumber Ġtest Ġstep Ġdefinitions Ġnot Ġrelated Ġto Ġspecific Ġviews Ċ Ġ*/ Ċ class ĠHelper Steps Ġ{ ĊĊĠ Ġ@ Before ĊĠ Ġfun Ġbefore ( scenario : ĠScenario ) Ġ{ ĊĠĠĠ ĠHelper Steps . scenario Ġ= Ġscenario ĊĠĠĠ Ġgrant Write Permissions For Screenshots () ĊĠ Ġ} ĊĊĠ Ġ@ After ĊĠ Ġfun Ġafter () Ġ{ ĊĠĠĠ Ġif Ġ( Helper Steps . scenario Ġ!= Ġnull Ġ&& ĠHelper Steps . scenario !!. is Failed ) Ġ{ ĊĠĠĠĠĠ Ġtake Screenshot (" failed ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Given ("^ I Ġtake Ġa Ġscreenshot $ ") ĊĠ Ġfun Ġi _ take _ a _ screenshot () Ġ{ ĊĠĠĠ Ġtake Screenshot (" screenshot ") ĊĠ Ġ} ĊĊĠ Ġclass ĠScreen shot Exception Ġinternal Ġconstructor ( message : ĠString ) Ġ: ĠRuntimeException ( ĊĠĠĠĠĠ Ġmessage ), ĠE sp ress o Exception Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠ Ġprivate Ġval ĠserialVersionUID Ġ= Ġ- 1 2 4 7 0 2 2 7 8 7 7 9 0 6 5 7 3 2 4 L ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġvar Ġscenario : ĠScenario ? Ġ= Ġnull ĊĠĠĠĠĠ Ġprivate Ġset ĊĊĊĠĠĠ Ġprivate Ġfun Ġgrant Write Permissions For Screenshots () Ġ{ ĊĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġinstrument ation Ġ= Ġandroidx . test . platform . app . Instrumentation Registry . get Instrumentation () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġapp Package Ġ= Ġget Target Context (). packageName ĊĠĠĠĠĠĠĠĠĠ Ġinstrument ation . ui Automation . execute Shell Command (" pm Ġgrant Ġ" Ġ+ Ġapp Package ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġandroid . permission . READ _ EXTERNAL _ STORAGE ") ĊĠĠĠĠĠĠĠĠĠ Ġinstrument ation . ui Automation . execute Shell Command (" pm Ġgrant Ġ" Ġ+ Ġapp Package ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġandroid . permission . WRITE _ EXTERNAL _ STORAGE ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Exception Ġwhile Ġgrant ing Ġexternal Ġstorage Ġaccess Ġto Ġapplication Ġapk ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgrant Location Permissions () Ġ{ ĊĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġinstrument ation Ġ= Ġandroidx . test . platform . app . Instrumentation Registry . get Instrumentation () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġapp Package Ġ= Ġget Target Context (). packageName ĊĠĠĠĠĠĠĠĠĠ Ġinstrument ation . ui Automation . execute Shell Command (" pm Ġgrant Ġ" Ġ+ Ġapp Package ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" Ġandroid . permission . ACCESS _ F INE _ LOCATION ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Exception Ġwhile Ġgrant ing Ġlocation Ġpermission Ġto Ġapplication Ġapk ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠwaitFor Animation ( millis : ĠLong ) Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠThread . sleep ( millis ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTake Ġa Ġscreenshot Ġof Ġthe Ġcurrent Ġactivity Ġand Ġembed Ġit Ġin Ġthe ĠHTML Ġreport ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtag ĠName Ġof Ġthe Ġscreenshot Ġto Ġinclude Ġin Ġthe Ġfile Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtake Screenshot ( tag : ĠString ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( scenario Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠScreen shot Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġtaking Ġscreenshot : ĠI 'm Ġmissing Ġa Ġvalid Ġtest Ġscenario Ġto Ġattach Ġthe Ġscreenshot Ġto ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠS po on Screenshot Action . perform ( tag ) ĊĠĠĠĠĠ Ġval Ġscreenshot Ġ= ĠS po on Screenshot Action . last Screenshot Ġ?: Ġthrow ĠScreen shot Exception ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Screenshot Ġwas Ġnot Ġtaken Ġcorrectly , Ġcheck Ġfor Ġfailures Ġin Ġscreenshot Ġlibrary ") ĊĠĠĠĠĠ Ġvar Ġscreenshot Stream : ĠFileInputStream ? Ġ= Ġnull ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġscreenshot Stream Ġ= ĠFileInputStream ( screenshot ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Content Ġ= ĠByteArray ( screenshot . length (). toInt ()) ĊĠĠĠĠĠĠĠ Ġval Ġread Image Bytes Ġ= Ġscreenshot Stream . read ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Content ) Ġ// ĠRead Ġdata Ġfrom Ġinput Ġimage Ġfile Ġinto Ġan Ġarray Ġof Ġbytes ĊĠĠĠĠĠĠĠ Ġif Ġ( read Image Bytes Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġscenario !!. embed ( file Content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" image / png ") Ġ// ĠEmbed Ġthe Ġscreenshot Ġin Ġthe Ġreport Ġunder Ġcurrent Ġtest Ġstep ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠScreen shot Exception (" Exception Ġwhile Ġreading Ġfile Ġ" Ġ+ Ġio e ) ĊĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ Ġ// Ġclose Ġthe Ġstreams Ġusing Ġclose Ġmethod ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( screenshot Stream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreenshot Stream . close () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠ Ġthrow ĠScreen shot Exception (" Error Ġwhile Ġclosing Ġscreenshot Ġstream : Ġ" Ġ+ Ġio e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }