Skip to content

Manifest V3 proxy extension #3519

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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