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 } . Must be .crx file path or Chrome extension ID."
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