From c737901b527516e569ba4ce66c919b5f69e2865f Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 4 Nov 2026 22:41:02 -0500 Subject: [PATCH 1/7] Add support for "aarch64" drivers on Linux --- seleniumbase/console_scripts/sb_install.py | 31 ++++++++++++++++------ seleniumbase/fixtures/shared_utils.py | 8 +++--- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/seleniumbase/console_scripts/sb_install.py b/seleniumbase/console_scripts/sb_install.py index b9cefc4c4e0..6168812fffe 100644 --- a/seleniumbase/console_scripts/sb_install.py +++ b/seleniumbase/console_scripts/sb_install.py @@ -504,7 +504,10 @@ def main(override=None, intel_for_uc=None, force_uc=None): else: file_name = "chromedriver_mac64.zip" elif IS_LINUX: - file_name = "chromedriver_linux64.zip" + if IS_ARM_LINUX: + file_name = "chromedriver-linux-arm64.zip" + else: + file_name = "chromedriver-linux64.zip" elif IS_WINDOWS: file_name = "chromedriver_win32.zip" # Works for win32 / win_x64 if not get_latest and not get_v_latest and num_args < 4: @@ -596,8 +599,12 @@ def main(override=None, intel_for_uc=None, force_uc=None): platform_code = "mac-x64" file_name = "chromedriver-mac-x64.zip" elif IS_LINUX: - platform_code = "linux64" - file_name = "chromedriver-linux64.zip" + if IS_ARM_LINUX: + platform_code = "linux-arm64" + file_name = "chromedriver-linux-arm64.zip" + else: + platform_code = "linux64" + file_name = "chromedriver-linux64.zip" elif IS_WINDOWS: if "64" in ARCH: platform_code = "win64" @@ -715,8 +722,12 @@ def main(override=None, intel_for_uc=None, force_uc=None): platform_code = "mac-x64" file_name = "chrome-mac-x64.zip" elif IS_LINUX: - platform_code = "linux64" - file_name = "chrome-linux64.zip" + if IS_ARM_LINUX: + platform_code = "linux-arm64" + file_name = "chrome-linux-arm64.zip" + else: + platform_code = "linux64" + file_name = "chrome-linux64.zip" elif IS_WINDOWS: if "64" in ARCH: platform_code = "win64" @@ -824,8 +835,12 @@ def main(override=None, intel_for_uc=None, force_uc=None): platform_code = "mac-x64" file_name = "chrome-headless-shell-mac-x64.zip" elif IS_LINUX: - platform_code = "linux64" - file_name = "chrome-headless-shell-linux64.zip" + if IS_ARM_LINUX: + platform_code = "linux-arm64" + file_name = "chrome-headless-shell-linux-arm64.zip" + else: + platform_code = "linux64" + file_name = "chrome-headless-shell-linux64.zip" elif IS_WINDOWS: if "64" in ARCH: platform_code = "win64" @@ -869,7 +884,7 @@ def main(override=None, intel_for_uc=None, force_uc=None): file_name = "geckodriver-%s-macos.tar.gz" % use_version elif IS_LINUX: if "64" in ARCH: - if "aarch64" in platform.processor(): + if IS_ARM_LINUX: file_name = ( "geckodriver-%s-linux-aarch64.tar.gz" % use_version ) diff --git a/seleniumbase/fixtures/shared_utils.py b/seleniumbase/fixtures/shared_utils.py index 9cf42887338..a5c83ce77fc 100644 --- a/seleniumbase/fixtures/shared_utils.py +++ b/seleniumbase/fixtures/shared_utils.py @@ -79,13 +79,11 @@ def get_mfa_code(totp_key=None): def is_arm_linux(): """Returns True if machine is ARM Linux. - This will be useful once Google adds - support for ARM Linux ChromeDriver. (Raspberry Pi uses ARM architecture.)""" - return ( - platform.system() == "Linux" - and platform.machine() == "aarch64" + is_linux = ( + platform.system() == "Linux" or "linux" in sys.platform ) + return is_linux and (platform.machine().lower() in ("aarch64", "arm64")) def is_arm_mac(): From 8504f66f0095188cc53f580cd890367ea1b09e42 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 4 Nov 2026 22:41:46 -0500 Subject: [PATCH 2/7] Update the default geckodriver version --- seleniumbase/console_scripts/sb_install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/console_scripts/sb_install.py b/seleniumbase/console_scripts/sb_install.py index 6168812fffe..97f5e7abab3 100644 --- a/seleniumbase/console_scripts/sb_install.py +++ b/seleniumbase/console_scripts/sb_install.py @@ -72,7 +72,7 @@ ) LOCAL_PATH = "/usr/local/bin/" # On Mac and Linux systems DEFAULT_CHROMEDRIVER_VERSION = "114.0.5735.90" # (If can't find LATEST_STABLE) -DEFAULT_GECKODRIVER_VERSION = "v0.36.0" +DEFAULT_GECKODRIVER_VERSION = "v0.37.1" DEFAULT_EDGEDRIVER_VERSION = "115.0.1901.183" # (If can't find LATEST_STABLE) From d71ca0ca298e621f3898b032a3e827d569c8193d Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 4 Nov 2026 22:43:06 -0500 Subject: [PATCH 3/7] Update the docs --- help_docs/customizing_test_runs.md | 6 +++--- seleniumbase/console_scripts/ReadMe.md | 6 +++--- seleniumbase/console_scripts/run.py | 6 +++--- seleniumbase/console_scripts/sb_install.py | 12 ++++++------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/help_docs/customizing_test_runs.md b/help_docs/customizing_test_runs.md index 2ceb52730ec..a20878c3422 100644 --- a/help_docs/customizing_test_runs.md +++ b/help_docs/customizing_test_runs.md @@ -466,7 +466,7 @@ Visit **[🗾 Locales](https://github.com/seleniumbase/SeleniumBase/blob/master/

Changing the default driver version:

-🔵 By default, SeleniumBase will make sure that the major driver version matches the major browser version for Chromium tests. (Eg. If Chrome `149.X` is installed and you have chromedriver `149.X`, then nothing happens, but if you had chromedriver `148.X` instead, then SeleniumBase would download chromedriver `149.X` to match the browser version.) +🔵 By default, SeleniumBase will make sure that the major driver version matches the major browser version for Chromium tests. (Eg. If Chrome `156.X` is installed and you have chromedriver `156.X`, then nothing happens, but if you had chromedriver `155.X` instead, then SeleniumBase would download chromedriver `156.X` to match the browser version.) 🎛️ To change this default behavior, you can use: @@ -475,8 +475,8 @@ pytest --driver-version=VER ``` The `VER` in `--driver-version=VER` can be: -* A major driver version. Eg. `149`. (milestone) -* An exact driver version. Eg. `149.0.7827.155`. +* A major driver version. Eg. `156`. (milestone) +* An exact driver version. Eg. `156.0.8078.80`. * `"browser"` (exact match on browser version) * `"keep"` (keep using the driver you already have) * `"latest"` / `"stable"` (latest stable version) diff --git a/seleniumbase/console_scripts/ReadMe.md b/seleniumbase/console_scripts/ReadMe.md index f2c287ea977..6fd9bcc3271 100644 --- a/seleniumbase/console_scripts/ReadMe.md +++ b/seleniumbase/console_scripts/ReadMe.md @@ -63,14 +63,14 @@ sbase install [DRIVER] [OPTIONS] sbase get chromedriver sbase get geckodriver sbase get edgedriver -sbase get chromedriver 149 -sbase get chromedriver 149.0.7827.155 +sbase get chromedriver 156 +sbase get chromedriver 156.0.8078.80 sbase get chromedriver stable sbase get chromedriver beta sbase get chromedriver -p sbase get chromium sbase get chromium --revision=1639046 -sbase get cft 149 +sbase get cft 156 sbase get chs ``` diff --git a/seleniumbase/console_scripts/run.py b/seleniumbase/console_scripts/run.py index 444833b709c..adde15e76e3 100644 --- a/seleniumbase/console_scripts/run.py +++ b/seleniumbase/console_scripts/run.py @@ -152,14 +152,14 @@ def show_install_usage(): print(" sbase get chromedriver") print(" sbase get geckodriver") print(" sbase get edgedriver") - print(" sbase get chromedriver 149") - print(" sbase get chromedriver 149.0.7827.155") + print(" sbase get chromedriver 156") + print(" sbase get chromedriver 156.0.8078.80") print(" sbase get chromedriver stable") print(" sbase get chromedriver beta") print(" sbase get chromedriver -p") print(" sbase get chromium") print(" sbase get chromium --revision=1639046") - print(" sbase get cft 149") + print(" sbase get cft 156") print(" sbase get chs") print("Output:") print(" Downloads driver/binary to seleniumbase/drivers/") diff --git a/seleniumbase/console_scripts/sb_install.py b/seleniumbase/console_scripts/sb_install.py index 97f5e7abab3..25a4cb07147 100644 --- a/seleniumbase/console_scripts/sb_install.py +++ b/seleniumbase/console_scripts/sb_install.py @@ -19,14 +19,14 @@ sbase get chromedriver sbase get geckodriver sbase get edgedriver - sbase get chromedriver 149 - sbase get chromedriver 149.0.7827.155 + sbase get chromedriver 156 + sbase get chromedriver 156.0.8078.80 sbase get chromedriver stable sbase get chromedriver beta sbase get chromedriver -p sbase get chromium sbase get chromium --revision=1639046 - sbase get cft 149 + sbase get cft 156 sbase get chs Output: Downloads driver/binary to seleniumbase/drivers/ @@ -96,14 +96,14 @@ def invalid_run_command(): exp += " sbase get chromedriver\n" exp += " sbase get geckodriver\n" exp += " sbase get edgedriver\n" - exp += " sbase get chromedriver 149\n" - exp += " sbase get chromedriver 149.0.7827.155\n" + exp += " sbase get chromedriver 156\n" + exp += " sbase get chromedriver 156.0.8078.80\n" exp += " sbase get chromedriver stable\n" exp += " sbase get chromedriver beta\n" exp += " sbase get chromedriver -p\n" exp += " sbase get chromium\n" exp += " sbase get chromium --revision=1639046\n" - exp += " sbase get cft 149\n" + exp += " sbase get cft 156\n" exp += " sbase get chs\n" exp += "Output:\n" exp += " Downloads driver/binary to seleniumbase/drivers/\n" From ebebbc92b288cd77b84131b2cb38a34d065fd483 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 4 Nov 2026 22:43:55 -0500 Subject: [PATCH 4/7] Refresh Python dependencies --- mkdocs_build/requirements.txt | 8 ++++---- requirements.txt | 6 +++--- setup.py | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/mkdocs_build/requirements.txt b/mkdocs_build/requirements.txt index deff40e2b0a..743f3f29a7a 100644 --- a/mkdocs_build/requirements.txt +++ b/mkdocs_build/requirements.txt @@ -2,15 +2,15 @@ # For docs generation, you'll need Python 3.11 or newer regex>=2026.9.29 -platformdirs>=4.14.3 -nab>=0.0.23 -backrefs>=8.1 +platformdirs>=4.14.5 +nab>=0.0.25 +backrefs>=8.2 pymdown-extensions>=12.3 python-dateutil>=4.0.0 click>=8.5.0 tzdata>=2026.5 Markdown>=3.11.2 -pipdeptree==4.2.13 +pipdeptree==4.2.14 ghp-import==2.1.0 watchdog==7.0.0 cairocffi==1.7.1 diff --git a/requirements.txt b/requirements.txt index 85d1735f189..ad49ddf32c1 100755 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ exceptiongroup>=1.3.1 websockets~=16.1.1;python_version=="3.10" websockets>=17.4;python_version>="3.11" filelock==4.1.0;python_version=="3.10" -filelock>=4.2.7;python_version>="3.11" +filelock>=4.2.9;python_version>="3.11" fasteners>=0.20 mycdp>=1.4.0 pynose>=1.5.5 @@ -56,7 +56,7 @@ pytest-xdist==3.8.0 parameterized==0.9.0 behave==1.2.6 soupsieve~=2.10.0;python_version<"3.11.5" -soupsieve~=3.0.4;python_version>="3.11.5" +soupsieve~=4.0.1;python_version>="3.11.5" beautifulsoup4~=4.15.0 pyotp~=2.10.0 python-xlib==0.33;platform_system=="Linux" @@ -69,7 +69,7 @@ rich>=15.0.0,<16 # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.) coverage>=7.16.2;python_version=="3.10" -coverage>=7.17.0;python_version>="3.11" +coverage>=7.17.2;python_version>="3.11" pytest-cov>=7.1.0 flake8==7.4.1;python_version=="3.10" flake8==7.5.0;python_version>="3.11" diff --git a/setup.py b/setup.py index f5e4f44b235..80ac8007282 100755 --- a/setup.py +++ b/setup.py @@ -174,7 +174,7 @@ 'websockets~=16.1.1;python_version=="3.10"', 'websockets>=17.4;python_version>="3.11"', 'filelock==4.1.0;python_version=="3.10"', - 'filelock>=4.2.7;python_version>="3.11"', + 'filelock>=4.2.9;python_version>="3.11"', 'fasteners>=0.20', 'mycdp>=1.4.0', 'pynose>=1.5.5', @@ -222,7 +222,7 @@ 'parameterized==0.9.0', 'behave==1.2.6', # Newer ones had issues 'soupsieve~=2.10.0;python_version<"3.11.5"', - 'soupsieve~=3.0.4;python_version>="3.11.5"', + 'soupsieve~=4.0.1;python_version>="3.11.5"', 'beautifulsoup4~=4.15.0', 'pyotp~=2.10.0', 'python-xlib==0.33;platform_system=="Linux"', @@ -244,7 +244,7 @@ # Usage: coverage run -m pytest; coverage html; coverage report "coverage": [ 'coverage>=7.16.2;python_version=="3.10"', - 'coverage>=7.17.0;python_version>="3.11"', + 'coverage>=7.17.2;python_version>="3.11"', 'pytest-cov>=7.1.0', ], # pip install -e .[flake8] From ff6b226c597db9b8af4e6e8a686cf324f6552b63 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 4 Nov 2026 22:44:21 -0500 Subject: [PATCH 5/7] Update the ReadMe --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e62d657dac3..2cfc72191e9 100755 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ -

📊 SeleniumBase

+

Browser Automation, Web Scraping, and End-to-End Testing.

From c30c9b4b6a53eda06e445fa2b8021012251d89d0 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 4 Nov 2026 22:45:25 -0500 Subject: [PATCH 6/7] Update MCP versioning --- mcp_servers/pyproject.toml | 2 +- server.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mcp_servers/pyproject.toml b/mcp_servers/pyproject.toml index 9155875aff0..9c464d2f1e3 100644 --- a/mcp_servers/pyproject.toml +++ b/mcp_servers/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "seleniumbase-mcp" -version = "1.6.0dev0" +version = "1.6.1dev0" description = "MCP server exposing SeleniumBase CDP Mode as tools for MCP clients." readme = "README.md" requires-python = ">=3.10" diff --git a/server.json b/server.json index e014488d20b..5fe6f41d598 100644 --- a/server.json +++ b/server.json @@ -3,7 +3,7 @@ "name": "io.github.seleniumbase/seleniumbase", "title": "SeleniumBase MCP", "description": "Stealthy browser automation, testing, and web-scraping via CDP Mode.", - "version": "4.57.0", + "version": "4.57.1", "repository": { "url": "https://github.com/seleniumbase/SeleniumBase", "source": "github" @@ -13,7 +13,7 @@ { "registryType": "pypi", "identifier": "seleniumbase", - "version": "4.57.0", + "version": "4.57.1", "transport": { "type": "stdio" }, From 2c46b3bd8cb957c4577f79a279ed24d33e4d2906 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Wed, 4 Nov 2026 22:45:38 -0500 Subject: [PATCH 7/7] Version 4.57.1 --- seleniumbase/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 7f7e0db956f..4c366d791c3 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.57.0" +__version__ = "4.57.1"