package Ġcom . code bor ne . se len ide . webdriver Ċ Ċ import Ġcom . code bor ne . se len ide . Browser Ċ import Ġcom . code bor ne . se len ide . Config Ċ import Ġio . github . bon ig arc ia . wd m . WebDriver Manager Ċ import Ġok io . Experimental FileSystem Ċ import Ġok io . Path Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . openqa . selenium . Capabilities Ċ import Ġorg . openqa . selenium . Mutable Capabilities Ċ import Ġorg . openqa . selenium . Proxy Ċ import Ġorg . openqa . selenium . WebDriver Ċ import Ġorg . openqa . selenium . chrome . Chrome Driver Ċ import Ġorg . openqa . selenium . chrome . Chrome Driver Service Ċ import Ġorg . openqa . selenium . chrome . Chrome Options Ċ import Ġorg . openqa . selenium . remote . service . Driver Service Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . util . Arrays Ċ import Ġjava . util . regex . Matcher Ċ import Ġjava . util . regex . Pattern Ċ import Ġjava . util . stream . Collectors Ċ import Ġjavax . annotation . Check ReturnValue Ċ Ċ open Ġclass ĠChrome Driver Factory Ġ: ĠAbstract Driver Factory () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġsetup Web driver Binary () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is System Property Not Set (" webdriver . chrome . driver ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWebDriver Manager . chro med river (). setup () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġoverride Ġfun Ġcreate ( config : ĠConfig , Ġbrowser : ĠBrowser , Ġproxy : ĠAny ?, Ġbrowser Downloads Folder : ĠPath ?): ĠWebDriver Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchrome Options Ġ= Ġcreate Capabilities ( config , Ġbrowser , Ġproxy , Ġbrowser Downloads Folder ) ĊĠĠĠĠĠĠĠ Ġlog . debug (" Chrome Ġoptions : Ġ{}", Ġchrome Options ) ĊĠĠĠĠĠĠĠ Ġreturn ĠChrome Driver ( build Service ( config ), Ġchrome Options ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġprotected Ġfun Ġ< DS Ġ: ĠDriver Service ?, ĠB Ġ: ĠDriver Service . Builder < DS , Ġ* >> Ġwith Log ( config : ĠConfig , Ġds Builder : ĠB ): ĠDS Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( config . webdriver Logs Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġds Builder . with LogFile ( webdriver Log ( config ). to File ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġds Builder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprotected Ġopen Ġfun Ġbuild Service ( config : ĠConfig ): ĠChrome Driver Service Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Log ( config , ĠChrome Driver Service . Builder ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġoverride Ġfun Ġcreate Capabilities ( ĊĠĠĠĠĠĠĠ Ġconfig : ĠConfig , ĊĠĠĠĠĠĠĠ Ġbrowser : ĠBrowser , ĊĠĠĠĠĠĠĠ Ġproxy : ĠAny ?, ĊĠĠĠĠĠĠĠ Ġbrowser Downloads Folder : ĠPath ? ĊĠĠĠ Ġ): ĠMutable Capabilities Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommon Capabilities : ĠCap abilities Ġ= Ġcreate Common Capabilities ( config , Ġbrowser , Ġproxy ) ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠChrome Options () ĊĠĠĠĠĠĠĠ Ġoptions . set Head less ( config . headless ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( config . browser Binary (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Using Ġbrowser Ġbinary : Ġ{}", Ġconfig . browser Binary ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . set Binary ( config . browser Binary ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoptions . add Arguments ( create Chrome Arguments ( config , Ġbrowser )) ĊĠĠĠĠĠĠĠ Ġoptions . set Experimental Option (" exclude Sw itches ", Ġexclude Sw itches ( common Capabilities )) ĊĠĠĠĠĠĠĠ Ġoptions . set Experimental Option (" prefs ", Ġprefs ( browser Downloads Folder )) ĊĠĠĠĠĠĠĠ Ġset Mobile Em ulation ( options ) ĊĠĠĠĠĠĠĠ Ġreturn ĠMerge able Capabilities ( options , Ġcommon Capabilities ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprotected Ġopen Ġfun Ġcreate Chrome Arguments ( config : ĠConfig , Ġbrowser : ĠBrowser ?): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarguments : ĠMutable List < String > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġarguments . add ("-- proxy - bypass - list =< - loop back >") ĊĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - dev - shm - usage ") ĊĠĠĠĠĠĠĠ Ġarguments . add ("-- no - sandbox ") ĊĠĠĠĠĠĠĠ Ġarguments . addAll ( parse Arguments ( System . getProperty (" chrome options . args "))) ĊĠĠĠĠĠĠĠ Ġarguments . addAll ( create Head less Arguments ( config )) ĊĠĠĠĠĠĠĠ Ġreturn Ġarguments ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprotected Ġfun Ġcreate Head less Arguments ( config : ĠConfig ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarguments : ĠMutable List < String > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġif Ġ( config . headless ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - background - networking ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- enable - features = Network Service , Network Service In Process ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - background - timer - th rottling ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - background ing - oc clude d - windows ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - break pad ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - client - side - ph ishing - detection ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - component - extensions - with - background - pages ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - default - apps ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - features = Translate UI ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - hang - monitor ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - ipc - f lood ing - protection ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - popup - blocking ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - prompt - on - re post ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - renderer - background ing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- disable - sync ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- force - color - profile = s rgb ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- metrics - recording - only ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- no - first - run ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- password - store = basic ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- use - mock - key chain ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- hide - scroll bars ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . add ("-- mute - audio ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġarguments ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprotected Ġopen Ġfun Ġexclude Sw itches ( capabilities : ĠCap abilities ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( has Extensions ( capabilities )) ĠarrayOf (" enable - automation ") Ġelse ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" enable - automation ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" load - extension " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Extensions ( capabilities : ĠCap abilities ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchrome Options Ġ= Ġcapabilities . get Capability (" goog : chrome Options ") Ġas ĠMap < *, Ġ* >? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġextensions Ġ= Ġchrome Options [" extensions "] Ġas ĠList < *> ? ĊĠĠĠĠĠĠĠ Ġreturn Ġextensions Ġ!= Ġnull Ġ&& Ġ! extensions . isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Mobile Em ulation ( chrome Options : ĠChrome Options ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmobile Em ulation Ġ= Ġmobile Em ulation () ĊĠĠĠĠĠĠĠ Ġif Ġ(! mobile Em ulation . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchrome Options . set Experimental Option (" mobile Em ulation ", Ġmobile Em ulation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprotected Ġfun Ġmobile Em ulation (): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmobile Em ulation Ġ= ĠSystem . getProperty (" chrome options . mobile Em ulation ", Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġparse Preferences FromString ( mobile Em ulation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental FileSystem ĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprotected Ġfun Ġprefs ( browser Downloads Folder : ĠPath ?): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchrome Preferences : ĠMutable Map < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġchrome Preferences [" credentials _ enable _ service "] Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġchrome Preferences [" plugins . always _ open _ pdf _ extern ally "] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġchrome Preferences [" profile . default _ content _ setting _ values . automatic _ downloads "] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( browser Downloads Folder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchrome Preferences [" download . default _ directory "] Ġ= Ġbrowser Downloads Folder . to File (). absolute Path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchrome Preferences . put All ( parse Preferences FromString ( System . getProperty (" chrome options . prefs ", Ġ" "))) ĊĠĠĠĠĠĠĠ Ġlog . debug (" Using Ġchrome Ġpreferences : Ġ{}", Ġchrome Preferences ) ĊĠĠĠĠĠĠĠ Ġreturn Ġchrome Preferences ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprivate Ġfun Ġparse Preferences FromString ( preferences String : ĠString ): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprefs : ĠMutable Map < String , ĠAny > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġval Ġall Prefs Ġ= Ġparse CSV ( preferences String ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( pref Ġin Ġall Prefs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Value Ġ= Ġremove Quotes ( pref ). split (" =" ). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Value . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Missing Ġ'=' Ġsign Ġwhile Ġparsing Ġ< key = value > Ġpairs Ġfrom Ġ{} . ĠKey Ġ'{}' Ġis Ġignored .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences String , Ġkey Value [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( key Value . size Ġ> Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" More Ġthan Ġone Ġ'=' Ġsign Ġwhile Ġparsing Ġ< key = value > Ġpairs Ġfrom Ġ{} . ĠKey Ġ'{}' Ġis Ġignored .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences String , Ġkey Value [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Value Ġ= Ġconvert StringTo Nearest ObjectType ( key Value [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs [ key Value [ 0 ]] Ġ= Ġpref Value ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġprefs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprivate Ġfun Ġparse Arguments ( arguments : ĠString ?): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġparse CSV ( arguments ). stream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġvalue : ĠString Ġ-> Ġremove Quotes ( value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġprivate Ġfun Ġremove Quotes ( value : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠREG EX _ REMOVE _ QUOT ES . matcher ( value ). replaceAll ( Matcher . quote Replacement ("")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġparse Ġparameters Ġwhich Ġcan Ġcome Ġfrom Ġcommand - line Ġinterface ĊĠĠĠĠ Ġ* Ġ@ param Ġcsv String Ġcomma - separated Ġvalues , Ġquotes Ġcan Ġbe Ġused Ġto Ġmask Ġspaces Ġand Ġcommas ĊĠĠĠĠ Ġ* ĠExample : Ġ 1 2 3 ," foo Ġbar "," bar , foo " ĊĠĠĠĠ Ġ* Ġ@ return Ġvalues Ġas Ġarray , Ġquotes Ġare Ġpreserved ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Check ReturnValue ĊĠĠĠ Ġfun Ġparse CSV ( csv String : ĠString ?): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( StringUtils . isBlank ( csv String )) Ġempty List () Ġelse ĠArrays . asList ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ* REGEX _ COMM AS _ IN _ VALUES . split ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcsv String ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Chrome Driver Factory :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegex p Ġfrom Ġhttps :// stackoverflow . com / a / 1 5 7 3 9 0 8 7 / 1 1 1 0 5 0 3 Ġto Ġhandle Ġcommas Ġin Ġvalues ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREG EX _ COMM AS _ IN _ VALUES Ġ= ĠPattern . compile (", (? = ([ ^\ "] * \" [^ \"] *\ ") * [^ \"] *$ )") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREG EX _ REMOVE _ QUOT ES Ġ= ĠPattern . compile (" \"", ĠPattern . LITERAL ) ĊĠĠĠ Ġ} Ċ } Ċ