0

[py] Selenium Manager get Browser Version from Options classes



NOKEYCHECK=True
GitOrigin-RevId: bd240908b29054ab309d6355307c1769d8373ec6
This commit is contained in:
Diego Molina
2023-04-15 06:15:29 +02:00
committed by Copybara-Service
parent 8707082014
commit 4148f6ded6
4 changed files with 41 additions and 17 deletions
python.iml
selenium/webdriver/common
test/selenium/webdriver/common

@@ -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"])