Skip to content

Commit

Permalink
Merge pull request #3519 from seleniumbase/manifest-v3-proxy-extension
Browse files Browse the repository at this point in the history
Manifest V3 proxy extension
  • Loading branch information
mdmintz authored Feb 13, 2025
2 parents de9295b + 7b229bf commit 9c1909e
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 43 deletions.
2 changes: 1 addition & 1 deletion examples/proxy_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def test_proxy(self):
print("\n\nMy IP Address = %s\n" % ip_address)
self.wait_for_text("IP Address", "h1", timeout=20)
self.wait_for_element_present('[href="/signup"]')
self.wait_for_text("hostname", timeout=20)
self.wait_for_text("country", timeout=20)
self.highlight("h1")
self.sleep(1.5)
print("Displaying Host Info:")
Expand Down
2 changes: 1 addition & 1 deletion seleniumbase/__version__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# seleniumbase package
__version__ = "4.34.14"
__version__ = "4.34.15"
62 changes: 26 additions & 36 deletions seleniumbase/core/browser_launcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ def make_driver_executable_if_not(driver_path):
shared_utils.make_executable(driver_path)


def extend_driver(driver):
def extend_driver(driver, proxy_auth=False, use_uc=True):
# Extend the driver with new methods
driver.default_find_element = driver.find_element
driver.default_find_elements = driver.find_elements
Expand Down Expand Up @@ -235,6 +235,8 @@ def extend_driver(driver):
driver.reset_window_size = DM.reset_window_size
if hasattr(driver, "proxy"):
driver.set_wire_proxy = DM.set_wire_proxy
if proxy_auth and not use_uc:
time.sleep(0.11) # Proxy needs moment to load in Manifest V3
return driver


Expand Down Expand Up @@ -3591,6 +3593,7 @@ def get_local_driver(
Can also be used to spin up additional browsers for the same test."""
downloads_path = DOWNLOADS_FOLDER
b_path = binary_location
use_uc = is_using_uc(undetectable, browser_name)
if use_wire:
pip_find_lock = fasteners.InterProcessLock(
constants.PipInstall.FINDLOCK
Expand Down Expand Up @@ -4064,7 +4067,7 @@ def get_local_driver(
edge_options.add_argument("--headless=old")
else:
edge_options.add_argument("--headless")
if mobile_emulator and not is_using_uc(undetectable, browser_name):
if mobile_emulator and not use_uc:
emulator_settings = {}
device_metrics = {}
if (
Expand Down Expand Up @@ -4128,7 +4131,7 @@ def get_local_driver(
settings.CHROME_START_HEIGHT,
)
)
if user_data_dir and not is_using_uc(undetectable, browser_name):
if user_data_dir and not use_uc:
abs_path = os.path.abspath(user_data_dir)
edge_options.add_argument("--user-data-dir=%s" % abs_path)
if extension_zip:
Expand Down Expand Up @@ -4163,7 +4166,7 @@ def get_local_driver(
edge_options.add_argument("--disable-prompt-on-repost")
if not enable_3d_apis:
edge_options.add_argument("--disable-3d-apis")
if headless or headless2 or is_using_uc(undetectable, browser_name):
if headless or headless2 or use_uc:
edge_options.add_argument("--disable-renderer-backgrounding")
edge_options.add_argument("--disable-backgrounding-occluded-windows")
edge_options.add_argument("--disable-client-side-phishing-detection")
Expand Down Expand Up @@ -4235,10 +4238,7 @@ def get_local_driver(
edge_options.add_argument("--allow-running-insecure-content")
if user_agent:
edge_options.add_argument("--user-agent=%s" % user_agent)
if (
IS_LINUX
or (IS_MAC and not is_using_uc(undetectable, browser_name))
):
if IS_LINUX or (IS_MAC and not use_uc):
edge_options.add_argument("--no-sandbox")
if remote_debug:
# To access the Debugger, go to: edge://inspect/#devices
Expand All @@ -4252,10 +4252,7 @@ def get_local_driver(
if swiftshader:
edge_options.add_argument("--use-gl=angle")
edge_options.add_argument("--use-angle=swiftshader-webgl")
elif (
not is_using_uc(undetectable, browser_name)
and not enable_3d_apis
):
elif not use_uc and not enable_3d_apis:
edge_options.add_argument("--disable-gpu")
if IS_LINUX:
edge_options.add_argument("--disable-dev-shm-usage")
Expand Down Expand Up @@ -4502,14 +4499,14 @@ def get_local_driver(
and len(saved_mcv.split(".")) == 4
):
driver_version = saved_mcv
if is_using_uc(undetectable, browser_name):
if use_uc:
use_br_version_for_uc = True
if (
(headless or headless2)
and IS_WINDOWS
and major_chrome_version
and int(major_chrome_version) >= 117
and not is_using_uc(undetectable, browser_name)
and not use_uc
and not (remote_debug or devtools or use_wire)
and not (proxy_string or multi_proxy or proxy_pac_url)
and (not chromium_arg or "debug" not in chromium_arg)
Expand Down Expand Up @@ -4565,7 +4562,7 @@ def get_local_driver(
use_version = ch_driver_version
disable_build_check = True
uc_driver_version = None
if is_using_uc(undetectable, browser_name):
if use_uc:
if use_br_version_for_uc or driver_version == "mlatest":
uc_driver_version = get_uc_driver_version(full=True)
full_ch_driver_version = uc_driver_version
Expand Down Expand Up @@ -4626,7 +4623,6 @@ def get_local_driver(
"\nWarning: Could not make chromedriver"
" executable: %s" % e
)
use_uc = is_using_uc(undetectable, browser_name)
make_uc_driver_from_chromedriver = False
local_ch_exists = (
LOCAL_CHROMEDRIVER and os.path.exists(LOCAL_CHROMEDRIVER)
Expand Down Expand Up @@ -4843,7 +4839,7 @@ def get_local_driver(
service_args = []
if disable_build_check:
service_args = ["--disable-build-check"]
if is_using_uc(undetectable, browser_name):
if use_uc:
uc_lock = fasteners.InterProcessLock(
constants.MultiBrowser.DRIVER_FIXING_LOCK
)
Expand Down Expand Up @@ -4872,20 +4868,14 @@ def get_local_driver(
"\nWarning: Could not make uc_driver"
" executable: %s" % e
)
if (
not headless
or not IS_LINUX
or is_using_uc(undetectable, browser_name)
):
if not headless or not IS_LINUX or use_uc:
uc_activated = False
try:
if (
os.path.exists(LOCAL_CHROMEDRIVER)
or is_using_uc(undetectable, browser_name)
):
if os.path.exists(LOCAL_CHROMEDRIVER) or use_uc:
if headless and not IS_LINUX:
undetectable = False # No support for headless
if is_using_uc(undetectable, browser_name):
use_uc = is_using_uc(undetectable, browser_name)
if use_uc:
from seleniumbase import undetected
from urllib.error import URLError
if IS_LINUX:
Expand Down Expand Up @@ -5185,7 +5175,7 @@ def get_local_driver(
driver = webdriver.Chrome(
service=service, options=chrome_options
)
return extend_driver(driver)
return extend_driver(driver, proxy_auth, use_uc)
if not auto_upgrade_chromedriver:
raise # Not an obvious fix.
else:
Expand Down Expand Up @@ -5436,11 +5426,11 @@ def get_local_driver(
'Emulation.setDeviceMetricsOverride',
set_device_metrics_override
)
return extend_driver(driver)
return extend_driver(driver, proxy_auth, use_uc)
else: # Running headless on Linux (and not using --uc)
try:
driver = webdriver.Chrome(options=chrome_options)
return extend_driver(driver)
return extend_driver(driver, proxy_auth, use_uc)
except Exception as e:
if not hasattr(e, "msg"):
raise
Expand All @@ -5462,7 +5452,7 @@ def get_local_driver(
driver = webdriver.Chrome(
service=service, options=chrome_options
)
return extend_driver(driver)
return extend_driver(driver, proxy_auth, use_uc)
mcv = None # Major Chrome Version
if "Current browser version is " in e.msg:
line = e.msg.split("Current browser version is ")[1]
Expand Down Expand Up @@ -5505,7 +5495,7 @@ def get_local_driver(
service=service,
options=chrome_options,
)
return extend_driver(driver)
return extend_driver(driver, proxy_auth, use_uc)
# Use the virtual display on Linux during headless errors
logging.debug(
"\nWarning: Chrome failed to launch in"
Expand All @@ -5523,17 +5513,17 @@ def get_local_driver(
driver = webdriver.Chrome(
service=service, options=chrome_options
)
return extend_driver(driver)
return extend_driver(driver, proxy_auth, use_uc)
except Exception as original_exception:
if is_using_uc(undetectable, browser_name):
if use_uc:
raise
# Try again if Chrome didn't launch
with suppress(Exception):
service = ChromeService(service_args=["--disable-build-check"])
driver = webdriver.Chrome(
service=service, options=chrome_options
)
return extend_driver(driver)
return extend_driver(driver, proxy_auth, use_uc)
if user_data_dir:
print("\nUnable to set user_data_dir while starting Chrome!\n")
raise
Expand All @@ -5560,7 +5550,7 @@ def get_local_driver(
)
try:
driver = webdriver.Chrome(service=service)
return extend_driver(driver)
return extend_driver(driver, proxy_auth, use_uc)
except Exception:
raise original_exception
else:
Expand Down
12 changes: 7 additions & 5 deletions seleniumbase/core/proxy_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,21 +94,23 @@ def create_proxy_ext(
manifest_json = (
"""{\n"""
""""version": "1.0.0",\n"""
""""manifest_version": 2,\n"""
""""manifest_version": 3,\n"""
""""name": "Chrome Proxy",\n"""
""""permissions": [\n"""
""" "proxy",\n"""
""" "tabs",\n"""
""" "unlimitedStorage",\n"""
""" "storage",\n"""
""" "<all_urls>",\n"""
""" "webRequest",\n"""
""" "webRequestBlocking"\n"""
""" "webRequestAuthProvider"\n"""
"""],\n"""
""""host_permissions": [\n"""
""" "<all_urls>"\n"""
"""],\n"""
""""background": {\n"""
""" "scripts": ["background.js"]\n"""
""" "service_worker": "background.js"\n"""
"""},\n"""
""""minimum_chrome_version":"22.0.0"\n"""
""""minimum_chrome_version":"88.0.0"\n"""
"""}"""
)
abs_path = os.path.abspath(".")
Expand Down

0 comments on commit 9c1909e

Please sign in to comment.