refactor selenium driver handling

This commit is contained in:
dandds 2018-10-01 13:07:30 -04:00
parent 63f94deb40
commit 0d10ef1b6b
3 changed files with 63 additions and 32 deletions

View File

@ -0,0 +1,18 @@
BROWSERSTACK_CONFIG = {
"win7_ie10": {
"browser": "IE",
"browser_version": "10.0",
"os": "Windows",
"os_version": "7",
"resolution": "1024x768",
"browserstack.local": True,
},
"win10_chrome62": {
"browser": "Chrome",
"browser_version": "62.0",
"os": "Windows",
"os_version": "10",
"resolution": "1024x768",
"browserstack.local": True,
},
}

View File

@ -2,16 +2,18 @@ import os
import pytest import pytest
import logging import logging
from logging.handlers import RotatingFileHandler from logging.handlers import RotatingFileHandler
from collections import Mapping
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from .live_server import LiveServer from .live_server import LiveServer
from .browsers import BROWSERSTACK_CONFIG
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def live_app(app): def live_app(app):
handler = RotatingFileHandler('log/acceptance.log', maxBytes=10000, backupCount=1) handler = RotatingFileHandler("log/acceptance.log", maxBytes=10000, backupCount=1)
handler.setLevel(logging.INFO) handler.setLevel(logging.INFO)
app.logger.addHandler(handler) app.logger.addHandler(handler)
@ -24,44 +26,49 @@ def live_app(app):
runnable.terminate() runnable.terminate()
@pytest.fixture(scope="session") class DriverCollection(Mapping):
def browserstack_config(): """
return { Allows access to drivers with dictionary syntax. Keeps track of which ones
"win7_ie10": { have already been initialized. Allows teardown of all existing drivers.
"browser": "IE", """
"browser_version": "10.0",
"os": "Windows",
"os_version": "7",
"resolution": "1024x768",
"browserstack.local": True,
},
"iphone7": {
'browserName': 'iPhone',
'device': 'iPhone 7',
'realMobile': 'true',
'os_version': '10.3',
"browserstack.local": True,
}
}
def __init__(self):
self._drivers = {}
@pytest.fixture(scope="session") def __iter__(self):
def driver_builder(browserstack_config): return iter(self._drivers)
def build_driver(config_key):
def __len__(self):
return len(self._drivers)
def __getitem__(self, name):
if name in self._drivers:
return self._drivers[name]
elif name in BROWSERSTACK_CONFIG:
self._drivers[name] = self._build_driver(name)
return self._drivers[name]
else:
raise AttributeError("Driver {} not found".format(name))
def _build_driver(self, config_key):
return webdriver.Remote( return webdriver.Remote(
command_executor="http://{}:{}@hub.browserstack.com:80/wd/hub".format( command_executor="http://{}:{}@hub.browserstack.com:80/wd/hub".format(
os.getenv("BROWSERSTACK_EMAIL"), os.getenv("BROWSERSTACK_TOKEN") os.getenv("BROWSERSTACK_EMAIL"), os.getenv("BROWSERSTACK_TOKEN")
), ),
desired_capabilities=browserstack_config.get(config_key), desired_capabilities=BROWSERSTACK_CONFIG.get(config_key),
) )
return build_driver def teardown(self):
for driver in self._drivers.values():
driver.quit()
@pytest.fixture(scope="session") @pytest.fixture(scope="session")
def ie10_driver(driver_builder): def drivers():
driver = driver_builder("win7_ie10") driver_collection = DriverCollection()
yield driver yield driver_collection
driver.quit() driver_collection.teardown()

View File

@ -1,3 +1,9 @@
def test_can_get_title(live_app, ie10_driver): import pytest
ie10_driver.get(live_app.server_url) from .browsers import BROWSERSTACK_CONFIG
assert "JEDI" in ie10_driver.title
@pytest.mark.parametrize("browser_type", BROWSERSTACK_CONFIG.keys())
def test_can_get_title(browser_type, live_app, drivers):
driver = drivers[browser_type]
driver.get(live_app.server_url)
assert "JEDI" in driver.title