diff --git a/src/pytest_selenium/drivers/browserstack.py b/src/pytest_selenium/drivers/browserstack.py index cb33c3f..123e017 100644 --- a/src/pytest_selenium/drivers/browserstack.py +++ b/src/pytest_selenium/drivers/browserstack.py @@ -18,7 +18,7 @@ def auth(self): @property def executor(self): - return "https://hub-cloud.browserstack.com/wd/hub" + return "https://hub.browserstack.com/wd/hub" @property def username(self): @@ -96,9 +96,17 @@ def pytest_selenium_runtest_makereport(item, report, summary, extra): def driver_kwargs(request, test, capabilities, **kwargs): provider = BrowserStack() assert provider.job_access - capabilities.setdefault("name", test) - capabilities.setdefault("browserstack.user", provider.username) - capabilities.setdefault("browserstack.key", provider.key) + if ( + "bstack:options" in capabilities + and type(capabilities["bstack:options"]) is dict + ): + capabilities["bstack:options"].setdefault("sessionName", test) + capabilities["bstack:options"].setdefault("userName", provider.username) + capabilities["bstack:options"].setdefault("accessKey", provider.key) + else: + capabilities.setdefault("name", test) + capabilities.setdefault("browserstack.user", provider.username) + capabilities.setdefault("browserstack.key", provider.key) kwargs = { "command_executor": provider.executor, "desired_capabilities": capabilities, diff --git a/testing/test_browserstack.py b/testing/test_browserstack.py index 930b5f2..68b26a7 100644 --- a/testing/test_browserstack.py +++ b/testing/test_browserstack.py @@ -4,6 +4,7 @@ from functools import partial import os +import json import pytest @@ -96,3 +97,101 @@ def test_invalid_job_access_value(failure, monkeypatch, tmpdir): monkeypatch.setattr(os.path, "expanduser", lambda p: str(tmpdir)) tmpdir.join(".browserstack").write("[report]\njob_access=foo") assert "BrowserStack job_access invalid value `foo`" in failure() + + +def test_default_caps_in_jsonwp(monkeypatch, testdir): + capabilities = {"browserName": "chrome"} + test_name = "test_default_caps_in_jsonwp.test_bstack_capabilities" + monkeypatch.setenv("BROWSERSTACK_USERNAME", "foo") + monkeypatch.setenv("BROWSERSTACK_ACCESS_KEY", "bar") + variables = testdir.makefile( + ".json", '{{"capabilities": {}}}'.format(json.dumps(capabilities)) + ) + file_test = testdir.makepyfile( + """ + import pytest + @pytest.mark.nondestructive + def test_bstack_capabilities(driver_kwargs): + assert driver_kwargs['desired_capabilities']['browserstack.user'] == 'foo' + assert driver_kwargs['desired_capabilities']['browserstack.key'] == 'bar' + assert driver_kwargs['desired_capabilities']['name'] == '{0}' + """.format( + test_name + ) + ) + testdir.quick_qa( + "--driver", "BrowserStack", "--variables", variables, file_test, passed=1 + ) + + +def test_default_caps_in_jsonwp_with_conflict(monkeypatch, testdir): + capabilities = {"browserName": "chrome", "name": "conflicting_name"} + monkeypatch.setenv("BROWSERSTACK_USERNAME", "foo") + monkeypatch.setenv("BROWSERSTACK_ACCESS_KEY", "bar") + variables = testdir.makefile( + ".json", '{{"capabilities": {}}}'.format(json.dumps(capabilities)) + ) + file_test = testdir.makepyfile( + """ + import pytest + @pytest.mark.nondestructive + def test_bstack_capabilities(driver_kwargs): + assert driver_kwargs['desired_capabilities']['browserstack.user'] == 'foo' + assert driver_kwargs['desired_capabilities']['browserstack.key'] == 'bar' + assert driver_kwargs['desired_capabilities']['name'] == 'conflicting_name' + """ + ) + testdir.quick_qa( + "--driver", "BrowserStack", "--variables", variables, file_test, passed=1 + ) + + +def test_default_caps_in_W3C(monkeypatch, testdir): + capabilities = {"browserName": "chrome", "bstack:options": {}} + monkeypatch.setenv("BROWSERSTACK_USERNAME", "foo") + monkeypatch.setenv("BROWSERSTACK_ACCESS_KEY", "bar") + variables = testdir.makefile( + ".json", '{{"capabilities": {}}}'.format(json.dumps(capabilities)) + ) + file_test = testdir.makepyfile( + """ + import pytest + @pytest.mark.nondestructive + def test_bstack_capabilities(driver_kwargs): + assert driver_kwargs['desired_capabilities']['bstack:options'] == { + 'userName': 'foo', + 'accessKey': 'bar', + 'sessionName': 'test_default_caps_in_W3C.test_bstack_capabilities' + } + """ + ) + testdir.quick_qa( + "--driver", "BrowserStack", "--variables", variables, file_test, passed=1 + ) + + +def test_default_caps_in_W3C_with_conflict(monkeypatch, testdir): + capabilities = { + "browserName": "chrome", + "bstack:options": {"sessionName": "conflicting_name"}, + } + monkeypatch.setenv("BROWSERSTACK_USERNAME", "foo") + monkeypatch.setenv("BROWSERSTACK_ACCESS_KEY", "bar") + variables = testdir.makefile( + ".json", '{{"capabilities": {}}}'.format(json.dumps(capabilities)) + ) + file_test = testdir.makepyfile( + """ + import pytest + @pytest.mark.nondestructive + def test_bstack_capabilities(driver_kwargs): + assert driver_kwargs['desired_capabilities']['bstack:options'] == { + 'userName': 'foo', + 'accessKey': 'bar', + 'sessionName': 'conflicting_name' + } + """ + ) + testdir.quick_qa( + "--driver", "BrowserStack", "--variables", variables, file_test, passed=1 + )