Skip to content

Commit d6d11a4

Browse files
authored
Merge branch 'trunk' into cddl2py_bazel
2 parents 507c27d + 16c046a commit d6d11a4

File tree

2 files changed

+44
-17
lines changed

2 files changed

+44
-17
lines changed

py/selenium/webdriver/common/selenium_manager.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,30 @@ def _get_binary() -> Path:
8989
else:
9090
allowed = {
9191
("darwin", "any"): "macos/selenium-manager",
92-
("win32", "any"): "windows/selenium-manager.exe",
93-
("cygwin", "any"): "windows/selenium-manager.exe",
92+
("win32", "x86_64"): "windows/selenium-manager.exe",
93+
("cygwin", "x86_64"): "windows/selenium-manager.exe",
9494
("linux", "x86_64"): "linux/selenium-manager",
9595
("freebsd", "x86_64"): "linux/selenium-manager",
9696
("openbsd", "x86_64"): "linux/selenium-manager",
9797
}
9898

99-
arch = platform.machine() if sys.platform in ("linux", "freebsd", "openbsd") else "any"
100-
if sys.platform in ["freebsd", "openbsd"]:
101-
logger.warning(f"Selenium Manager binary may not be compatible with {sys.platform}; verify settings")
102-
103-
location = allowed.get((sys.platform, arch))
99+
# some operating systems report x86-64 architecture as amd64/AMD64
100+
platform_name = sys.platform
101+
arch = "any" if platform_name == "darwin" else platform.machine().lower()
102+
arch = "x86_64" if arch == "amd64" else arch
103+
104+
# in Python < 3.14, sys.platform appends version number to BSD platform names
105+
if platform_name.startswith("freebsd"):
106+
logger.warning(
107+
"Selenium Manager binary may not be compatible with FreeBSD; you may need to run "
108+
"'brandelf -t linux' on it and load linux64.ko"
109+
)
110+
platform_name = "freebsd"
111+
elif platform_name.startswith("openbsd"):
112+
logger.warning("Selenium Manager binary may not be compatible with OpenBSD; verify settings")
113+
platform_name = "openbsd"
114+
115+
location = allowed.get((platform_name, arch))
104116
if location is None:
105117
raise WebDriverException(f"Unsupported platform/architecture combination: {sys.platform}/{arch}")
106118

py/test/unit/selenium/webdriver/common/selenium_manager_tests.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
# under the License.
1717

1818
import json
19+
import logging
1920
import sys
2021
from pathlib import Path
2122
from unittest import mock
@@ -36,7 +37,6 @@ def test_gets_results(monkeypatch):
3637
mock.patch(lib_path + "._run", return_value=expected_output) as mock_run,
3738
):
3839
SeleniumManager().binary_paths([])
39-
4040
mock_get_binary.assert_called_once()
4141
expected_run_args = ["/path/to/sm", "--language-binding", "python", "--output", "json"]
4242
mock_run.assert_called_once_with(expected_run_args)
@@ -46,24 +46,28 @@ def test_uses_environment_variable(monkeypatch):
4646
sm_path = r"\path\to\manager" if sys.platform.startswith("win") else "path/to/manager"
4747
monkeypatch.setenv("SE_MANAGER_PATH", sm_path)
4848
monkeypatch.setattr(Path, "is_file", lambda _: True)
49-
5049
binary = SeleniumManager()._get_binary()
51-
5250
assert str(binary) == sm_path
5351

5452

5553
def test_uses_windows(monkeypatch):
5654
monkeypatch.setattr(sys, "platform", "win32")
55+
monkeypatch.setattr("platform.machine", lambda: "AMD64")
5756
binary = SeleniumManager()._get_binary()
58-
5957
project_root = Path(selenium.__file__).parent.parent
6058
assert binary == project_root.joinpath("selenium/webdriver/common/windows/selenium-manager.exe")
6159

6260

61+
def test_uses_windows_arm64(monkeypatch):
62+
monkeypatch.setattr(sys, "platform", "win32")
63+
monkeypatch.setattr("platform.machine", lambda: "ARM64")
64+
with pytest.raises(WebDriverException, match="Unsupported platform/architecture combination: win32/arm64"):
65+
SeleniumManager()._get_binary()
66+
67+
6368
def test_uses_linux(monkeypatch):
6469
monkeypatch.setattr(sys, "platform", "linux")
6570
monkeypatch.setattr("platform.machine", lambda: "x86_64")
66-
6771
binary = SeleniumManager()._get_binary()
6872
project_root = Path(selenium.__file__).parent.parent
6973
assert binary == project_root.joinpath("selenium/webdriver/common/linux/selenium-manager")
@@ -72,22 +76,35 @@ def test_uses_linux(monkeypatch):
7276
def test_uses_linux_arm64(monkeypatch):
7377
monkeypatch.setattr(sys, "platform", "linux")
7478
monkeypatch.setattr("platform.machine", lambda: "arm64")
75-
7679
with pytest.raises(WebDriverException, match="Unsupported platform/architecture combination: linux/arm64"):
7780
SeleniumManager()._get_binary()
7881

7982

8083
def test_uses_mac(monkeypatch):
8184
monkeypatch.setattr(sys, "platform", "darwin")
8285
binary = SeleniumManager()._get_binary()
83-
8486
project_root = Path(selenium.__file__).parent.parent
8587
assert binary == project_root.joinpath("selenium/webdriver/common/macos/selenium-manager")
8688

8789

90+
def test_uses_freebsd(monkeypatch, caplog):
91+
monkeypatch.setattr(sys, "platform", "freebsd15")
92+
monkeypatch.setattr("platform.machine", lambda: "amd64")
93+
root = logging.getLogger()
94+
caplog_handler = caplog.handler
95+
old_handlers = root.handlers[:]
96+
root.handlers = [caplog_handler]
97+
try:
98+
binary = SeleniumManager()._get_binary()
99+
project_root = Path(selenium.__file__).parent.parent
100+
assert binary == project_root.joinpath("selenium/webdriver/common/linux/selenium-manager")
101+
assert "Selenium Manager binary may not be compatible with FreeBSD" in caplog.text
102+
finally:
103+
root.handlers = old_handlers
104+
105+
88106
def test_errors_if_not_file(monkeypatch):
89107
monkeypatch.setattr(Path, "is_file", lambda _: False)
90-
91108
with pytest.raises(WebDriverException) as excinfo:
92109
SeleniumManager()._get_binary()
93110
assert "Unable to obtain working Selenium Manager binary" in str(excinfo.value)
@@ -96,7 +113,6 @@ def test_errors_if_not_file(monkeypatch):
96113
def test_errors_if_invalid_os(monkeypatch):
97114
monkeypatch.setattr(sys, "platform", "linux")
98115
monkeypatch.setattr("platform.machine", lambda: "invalid")
99-
100116
with pytest.raises(WebDriverException) as excinfo:
101117
SeleniumManager()._get_binary()
102118
assert "Unsupported platform/architecture combination" in str(excinfo.value)
@@ -105,7 +121,6 @@ def test_errors_if_invalid_os(monkeypatch):
105121
def test_error_if_invalid_env_path(monkeypatch):
106122
sm_path = r"\path\to\manager" if sys.platform.startswith("win") else "path/to/manager"
107123
monkeypatch.setenv("SE_MANAGER_PATH", sm_path)
108-
109124
with pytest.raises(WebDriverException) as excinfo:
110125
SeleniumManager()._get_binary()
111126
assert f"SE_MANAGER_PATH does not point to a file: {sm_path}" in str(excinfo.value)

0 commit comments

Comments
 (0)