You've already forked SeleniumHQ.selenium.py
[py] Selenium Manager get Browser Version from Options classes
#11372 NOKEYCHECK=True GitOrigin-RevId: bd240908b29054ab309d6355307c1769d8373ec6
This commit is contained in:

committed by
Copybara-Service

parent
8707082014
commit
4148f6ded6
@@ -5,13 +5,17 @@
|
||||
<configuration sdkName="" />
|
||||
</facet>
|
||||
</component>
|
||||
<component name="ModuleRunConfigurationManager">
|
||||
<shared />
|
||||
</component>
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/selenium" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 2.7" jdkType="Python SDK" />
|
||||
<orderEntry type="jdk" jdkName="Python 3.9 (py)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="sonarModuleSettings">
|
||||
|
@@ -44,7 +44,7 @@ class BaseOptions(metaclass=ABCMeta):
|
||||
"""
|
||||
:returns: the version of the browser if set, otherwise None.
|
||||
"""
|
||||
return self._caps["browserVersion"]
|
||||
return self._caps.get("browserVersion")
|
||||
|
||||
@browser_version.setter
|
||||
def browser_version(self, version: str) -> None:
|
||||
|
@@ -19,7 +19,7 @@ import logging
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Tuple
|
||||
from typing import List
|
||||
|
||||
from selenium.common.exceptions import SeleniumManagerException
|
||||
from selenium.webdriver.common.options import BaseOptions
|
||||
@@ -87,20 +87,19 @@ class SeleniumManager:
|
||||
|
||||
browser = allowed_browsers[browser]
|
||||
|
||||
binary, browser_flag, browser, output_flag, output = (
|
||||
str(self.get_binary()),
|
||||
"--browser",
|
||||
browser,
|
||||
"--output",
|
||||
"json",
|
||||
)
|
||||
result = self.run((binary, browser_flag, browser, output_flag, output))
|
||||
args = [str(self.get_binary()), "--browser", browser, "--output", "json"]
|
||||
|
||||
if options.browser_version:
|
||||
args.append("--browser-version")
|
||||
args.append(str(options.browser_version))
|
||||
|
||||
result = self.run(args)
|
||||
executable = result.split("\t")[-1].strip()
|
||||
logger.debug(f"Using driver at: {executable}")
|
||||
return executable
|
||||
|
||||
@staticmethod
|
||||
def run(args: Tuple[str, str, str, str, str]) -> str:
|
||||
def run(args: List[str]) -> str:
|
||||
"""
|
||||
Executes the Selenium Manager Binary.
|
||||
:Args:
|
||||
@@ -108,16 +107,16 @@ class SeleniumManager:
|
||||
:Returns: The log string containing the driver location.
|
||||
"""
|
||||
command = " ".join(args)
|
||||
logger.debug(f"Executing: {command}")
|
||||
logger.info(f"Executing: {command}")
|
||||
completed_proc = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
stdout = completed_proc.stdout.decode("utf-8").rstrip("\n")
|
||||
stderr = completed_proc.stderr.decode("utf-8").rstrip("\n")
|
||||
output = json.loads(stdout)
|
||||
result = output["result"]["message"]
|
||||
if completed_proc.returncode:
|
||||
raise SeleniumManagerException(f"Selenium manager failed for: {command}.\n{result}{stderr}")
|
||||
raise SeleniumManagerException(f"Selenium Manager failed for: {command}.\n{result}{stderr}")
|
||||
else:
|
||||
# Selenium Manager exited 0 successfully, return executable path and print warnings (if any)
|
||||
# Selenium Manager exited successfully, return executable path and print warnings
|
||||
for item in output["logs"]:
|
||||
if item["level"] == "WARN":
|
||||
logger.warning(item["message"])
|
||||
|
@@ -15,6 +15,8 @@
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from unittest.mock import Mock
|
||||
|
||||
import pytest
|
||||
|
||||
from selenium.common.exceptions import SeleniumManagerException
|
||||
@@ -30,9 +32,28 @@ def test_non_supported_browser_raises_sme():
|
||||
_ = SeleniumManager().driver_location(options)
|
||||
|
||||
|
||||
def test_browser_version_is_used_for_sm(mocker):
|
||||
import subprocess
|
||||
|
||||
mock_run = mocker.patch("subprocess.run")
|
||||
mocked_result = Mock()
|
||||
mocked_result.configure_mock(
|
||||
**{"stdout.decode.return_value": '{"result": {"message": "driver"}, "logs": []}', "returncode": 0}
|
||||
)
|
||||
mock_run.return_value = mocked_result
|
||||
options = Options()
|
||||
options.capabilities["browserName"] = "chrome"
|
||||
options.browser_version = 110
|
||||
|
||||
_ = SeleniumManager().driver_location(options)
|
||||
args, kwargs = subprocess.run.call_args
|
||||
assert "--browser-version" in args[0]
|
||||
assert "110" in args[0]
|
||||
|
||||
|
||||
def test_stderr_is_propagated_to_exception_messages():
|
||||
msg = r"Selenium manager failed for:.* --browser foo --output json\.\nInvalid browser name: foo\n"
|
||||
msg = r"Selenium Manager failed for:.* --browser foo --output json\.\nInvalid browser name: foo\n"
|
||||
with pytest.raises(SeleniumManagerException, match=msg):
|
||||
manager = SeleniumManager()
|
||||
binary = manager.get_binary()
|
||||
_ = manager.run((str(binary), "--browser", "foo", "--output", "json"))
|
||||
_ = manager.run([str(binary), "--browser", "foo", "--output", "json"])
|
||||
|
Reference in New Issue
Block a user