Skip to content

Commit 7ddb1b6

Browse files
authored
Merge pull request #571 from AutomationSolutionz/chrome-for-testing-integration
Chrome for testing integration
2 parents f145356 + d33e341 commit 7ddb1b6

File tree

3 files changed

+632
-5
lines changed

3 files changed

+632
-5
lines changed

Framework/Built_In_Automation/Web/Selenium/BuiltInFunctions.py

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
# #
1515
#########################
1616
import platform
17-
import sys, os, time, inspect, shutil, subprocess, json
17+
import sys, os, time, inspect, shutil, subprocess, json, re
1818
import socket
1919
import requests
2020
import psutil
@@ -59,6 +59,7 @@
5959
skipped_tag_list,
6060
)
6161
from 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

Comments
 (0)