1414#                       # 
1515######################### 
1616import  platform 
17- import  sys , os , time , inspect , shutil , subprocess , json 
17+ import  sys , os , time , inspect , shutil , subprocess , json ,  re 
1818import  socket 
1919import  requests 
2020import  psutil 
5959    skipped_tag_list ,
6060)
6161from  Framework .AI .NLP  import  binary_classification 
62+ from  .utils  import  ChromeForTesting , ChromeExtensionDownloader 
6263
6364######################### 
6465#                       # 
@@ -599,6 +600,25 @@ def Open_Browser(browser, browser_options: BrowserOptions):
599600        options  =  generate_options (browser , browser_options )
600601        if  browser  in  ("android" , "chrome" , "chromeheadless" ):
601602            from  selenium .webdriver .chrome .service  import  Service 
603+ 
604+             chrome_bin  =  browser_options ["chrome" ].get ("binary_location" , None )
605+             driver_bin  =  browser_options ["chrome" ].get ("driver_path" , None )
606+ 
607+             if  chrome_bin  and  driver_bin :
608+                 # Use Chrome for Testing binaries 
609+                 service  =  Service (executable_path = driver_bin )
610+                 options .binary_location  =  chrome_bin 
611+                 CommonUtil .ExecLog (sModuleInfo , "Using Chrome for Testing binaries" , 1 )
612+             else :
613+                 # Use standard ChromeDriverManager 
614+                 service  =  Service ()
615+                 CommonUtil .ExecLog (sModuleInfo , "Using standard Chrome binaries" , 1 )
616+ 
617+             selenium_driver  =  webdriver .Chrome (
618+                 service = service ,
619+                 options = options ,
620+             )
621+ 
602622            service  =  Service ()
603623            selenium_driver  =  webdriver .Chrome (
604624                service = service ,
@@ -725,7 +745,7 @@ def Go_To_Link_V2(step_data):
725745    return  "passed" 
726746
727747
728- def  parse_and_verify_datatype (left :str , right :str ):
748+ def  parse_and_verify_datatype (left :str , right :str ,  chrome_version = None ):
729749    val  =  CommonUtil .parse_value_into_object (right )
730750    if  left  ==  "addargument" :
731751        if  isinstance (val , list ) and  all (isinstance (item , str ) for  item  in  val ):
@@ -734,7 +754,26 @@ def parse_and_verify_datatype(left:str, right:str):
734754
735755    if  left  ==  "addextension" :
736756        if  isinstance (val , list ) and  all (isinstance (item , str ) for  item  in  val ):
737-             return  val 
757+             extension_ids  =  []
758+             extension_crxs  =  []
759+             for  item  in  val :
760+                 if  item .lower ().endswith (".crx" ) or  os .path .isfile (item ):
761+                     extension_crxs .append (item )
762+                 elif  re .match (r'^[a-p]{32}$' , item ):
763+                     extension_ids .append (item )
764+                 else :
765+                     raise  ValueError (
766+                         f"Invalid extension: { item }  
767+                     )
768+                     
769+             # download all extensions from ids 
770+             for  ext_id  in  extension_ids :
771+                 downloader  =  ChromeExtensionDownloader (chrome_version = chrome_version )
772+                 result  =  downloader .setup_chrome_extension_download (extension_id = ext_id )
773+                 if  result .get ("crx_path" ):
774+                     extension_crxs .append (result ["crx_path" ])
775+                     
776+             return  extension_crxs 
738777        raise  ValueError ("Extensions must be list of strings. Example: ['path/to/ex1.crx', 'path/to/ex2.crx']" )
739778
740779    if  left  ==  "addencodedextension" :
@@ -823,6 +862,8 @@ def Go_To_Link(dataset: Dataset) -> ReturnType:
823862        else :
824863            browser  =  None 
825864        driver_id  =  "" 
865+         chrome_version  =  None 
866+         chrome_channel  =  None 
826867        for  left , mid , right  in  dataset :
827868            left  =  left .replace (" " , "" ).replace ("_" , "" ).replace ("-" , "" ).lower ()
828869            if  left  ==  "gotolink" :
@@ -837,6 +878,8 @@ def Go_To_Link(dataset: Dataset) -> ReturnType:
837878                resolution  =  right .split ("," )
838879                window_size_X  =  int (resolution [0 ])
839880                window_size_Y  =  int (resolution [1 ])
881+             elif  left  ==  "chrome:version" :
882+                 chrome_version  =  right .strip ()
840883
841884            # Capabilities are WebDriver attribute common across different browser 
842885            elif  mid .strip ().lower () ==  "shared capability" :
@@ -854,7 +897,7 @@ def Go_To_Link(dataset: Dataset) -> ReturnType:
854897                elif  left  ==  "addexperimentaloption" :
855898                    browser_options [browser ]["add_experimental_option" ] =  parse_and_verify_datatype (left , right )
856899                elif  left  ==  "addextension" :
857-                     browser_options [browser ]["add_extension" ] =  parse_and_verify_datatype (left , right )
900+                     browser_options [browser ]["add_extension" ] =  parse_and_verify_datatype (left , right ,  chrome_version )
858901                elif  left  ==  "addencodedextension" :
859902                    browser_options [browser ]["add_encoded_extension" ] =  parse_and_verify_datatype (left , right )
860903                elif  left  ==  "setpreference" :
@@ -864,6 +907,25 @@ def Go_To_Link(dataset: Dataset) -> ReturnType:
864907                elif  left  ==  "debuggeraddress" :
865908                    browser_options [browser ]["debugger_address" ] =  right .strip ()
866909
910+         if  dependency ["Browser" ] in  ("Chrome" , "ChromeHeadless" ) and  not  browser_options ["chrome" ].get ("debugger_address" , "" ):
911+             cft  =  ChromeForTesting ()
912+ 
913+             if  chrome_version :
914+                 if  chrome_version .strip ().lower () in  ("beta" , "dev" , "canary" ):
915+                     chrome_channel  =  chrome_version .strip ().capitalize ()
916+                     chrome_version  =  None 
917+                 else :
918+                     chrome_version  =  chrome_version .strip ()
919+ 
920+             chrome_bin , driver_bin  =  cft .setup_chrome_for_testing (chrome_version , chrome_channel )
921+             
922+             if  chrome_bin  and  driver_bin :
923+                 browser_options ["chrome" ]["binary_location" ] =  str (chrome_bin )
924+                 browser_options ["chrome" ]["driver_path" ] =  str (driver_bin )
925+                 CommonUtil .ExecLog (sModuleInfo , f"Using Chrome for Testing { chrome_version  or  'latest' }  , 1 )
926+             else :
927+                 CommonUtil .ExecLog (sModuleInfo , "Failed to get Chrome for Testing binaries. Using system Chrome" , 2 )
928+ 
867929        if  not  driver_id :
868930            if  len (selenium_details .keys ()) ==  0 :
869931                driver_id  =  "default" 
@@ -880,6 +942,10 @@ def Go_To_Link(dataset: Dataset) -> ReturnType:
880942            if  Open_Browser (dependency ["Browser" ], browser_options ) ==  "zeuz_failed" :
881943                return  "zeuz_failed" 
882944
945+             if  ConfigModule .get_config_value ("RunDefinition" , "window_size_x" ) and  ConfigModule .get_config_value ("RunDefinition" , "window_size_y" ):
946+                 window_size_X  =  ConfigModule .get_config_value ("RunDefinition" , "window_size_x" )
947+                 window_size_Y  =  ConfigModule .get_config_value ("RunDefinition" , "window_size_y" )
948+                 
883949            if  not  window_size_X  and  not  window_size_Y :
884950                selenium_driver .maximize_window ()
885951            else :
0 commit comments