Skip to content

Commit 01f65d2

Browse files
authored
[py] add browser output from selenium manager to options (SeleniumHQ#12404)
1 parent 9fdeaa9 commit 01f65d2

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

py/selenium/webdriver/common/selenium_manager.py

+20-9
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def driver_location(self, options: BaseOptions) -> str:
7070

7171
browser = options.capabilities["browserName"]
7272

73-
args = [str(self.get_binary()), "--browser", browser, "--output", "json"]
73+
args = [str(self.get_binary()), "--browser", browser]
7474

7575
if options.browser_version:
7676
args.append("--browser-version")
@@ -87,30 +87,41 @@ def driver_location(self, options: BaseOptions) -> str:
8787
value = proxy.ssl_proxy if proxy.ssl_proxy else proxy.http_proxy
8888
args.append(value)
8989

90-
if logger.getEffectiveLevel() == logging.DEBUG:
91-
args.append("--debug")
90+
output = self.run(args)
91+
92+
browser_path = output["browser_path"]
93+
driver_path = output["driver_path"]
94+
logger.debug(f"Using driver at: {driver_path}")
95+
96+
try:
97+
options.binary_location = browser_path
98+
options.browser_version = None # geckodriver complains if this dev / nightly, etc
99+
except AttributeError:
100+
pass # do not set on options classes that do not support it
92101

93-
result = self.run(args)
94-
executable = result.split("\t")[-1].strip()
95-
logger.debug(f"Using driver at: {executable}")
96-
return executable
102+
return driver_path
97103

98104
@staticmethod
99-
def run(args: List[str]) -> str:
105+
def run(args: List[str]) -> dict:
100106
"""
101107
Executes the Selenium Manager Binary.
102108
:Args:
103109
- args: the components of the command being executed.
104110
:Returns: The log string containing the driver location.
105111
"""
112+
if logger.getEffectiveLevel() == logging.DEBUG:
113+
args.append("--debug")
114+
args.append("--output")
115+
args.append("json")
116+
106117
command = " ".join(args)
107118
logger.debug(f"Executing process: {command}")
108119
try:
109120
completed_proc = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
110121
stdout = completed_proc.stdout.decode("utf-8").rstrip("\n")
111122
stderr = completed_proc.stderr.decode("utf-8").rstrip("\n")
112123
output = json.loads(stdout)
113-
result = output["result"]["message"]
124+
result = output["result"]
114125
except Exception as err:
115126
raise WebDriverException(f"Unsuccessful command executed: {command}; {err}")
116127

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

+14-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ def test_browser_version_is_used_for_sm(mocker):
3333
mock_run = mocker.patch("subprocess.run")
3434
mocked_result = Mock()
3535
mocked_result.configure_mock(
36-
**{"stdout.decode.return_value": '{"result": {"message": "driver"}, "logs": []}', "returncode": 0}
36+
**{
37+
"stdout.decode.return_value": '{"result": {"driver_path": "driver", "browser_path": "browser"}, "logs": []}',
38+
"returncode": 0,
39+
}
3740
)
3841
mock_run.return_value = mocked_result
3942
options = Options()
@@ -52,7 +55,10 @@ def test_browser_path_is_used_for_sm(mocker):
5255
mock_run = mocker.patch("subprocess.run")
5356
mocked_result = Mock()
5457
mocked_result.configure_mock(
55-
**{"stdout.decode.return_value": '{"result": {"message": "driver"}, "logs": []}', "returncode": 0}
58+
**{
59+
"stdout.decode.return_value": '{"result": {"driver_path": "driver", "browser_path": "browser"}, "logs": []}',
60+
"returncode": 0,
61+
}
5662
)
5763
mock_run.return_value = mocked_result
5864
options = Options()
@@ -71,7 +77,10 @@ def test_proxy_is_used_for_sm(mocker):
7177
mock_run = mocker.patch("subprocess.run")
7278
mocked_result = Mock()
7379
mocked_result.configure_mock(
74-
**{"stdout.decode.return_value": '{"result": {"message": "driver"}, "logs": []}', "returncode": 0}
80+
**{
81+
"stdout.decode.return_value": '{"result": {"driver_path": "driver", "browser_path": "browser"}, "logs": []}',
82+
"returncode": 0,
83+
}
7584
)
7685
mock_run.return_value = mocked_result
7786
options = Options()
@@ -87,11 +96,11 @@ def test_proxy_is_used_for_sm(mocker):
8796

8897

8998
def test_stderr_is_propagated_to_exception_messages():
90-
msg = r"Unsuccessful command executed:.* --browser foo --output json\.\nInvalid browser name: foo\n"
99+
msg = r"Unsuccessful command executed:.*\n.* 'Invalid browser name: foo'.*"
91100
with pytest.raises(WebDriverException, match=msg):
92101
manager = SeleniumManager()
93102
binary = manager.get_binary()
94-
_ = manager.run([str(binary), "--browser", "foo", "--output", "json"])
103+
_ = manager.run([str(binary), "--browser", "foo"])
95104

96105

97106
def test_driver_finder_error(mocker):

0 commit comments

Comments
 (0)