Package pytest_auto :: Module selenium_plugin
[hide private]
[frames] | no frames]

Source Code for Module pytest_auto.selenium_plugin

  1  import pytest 
  2  import os 
  3  from selenium import webdriver as selenium_webdriver 
  4  from tlib.base import AndroidHelper 
  5  from tlib.base.TestHelper import webdriver_chrome_executable, webdriver_ie_executable 
  6  from _pytest.python import FixtureRequest 
  7  import logging 
  8  from appium.webdriver.webdriver import WebDriver as appium_webdriver 
9 10 -def pytest_addoption(parser):
11 """ 12 Options supported by pytest's selenium plug-in 13 """ 14 group = parser.getgroup("selenium", "Testing with the selenium framework") 15 16 group.addoption( 17 "--mobile_base_url", 18 action="store", 19 dest="mobile_base_url", 20 help="mobile base url of the mobile web server used for testing") 21 22 group.addoption( 23 "--browser", 24 action="store", 25 dest="browser", 26 choices=["chrome", "firefox", "firefox_no_js", "ie", "android", "chrome_android"], 27 help="Browser used for running test cases") 28 29 group.addoption( 30 "--chromedriver_version", 31 action="store", 32 dest="chromedriver_version", 33 default="latest", 34 help="Version of chromedriver to use") 35 36 group.addoption( 37 "--serial_id", 38 action="store", 39 dest="serial_id", 40 help="Serial of the android device or simulator where Android tests will be run")
41
42 43 #noinspection PyShadowingNames,PyUnresolvedReferences 44 @pytest.fixture(scope='function') 45 -def driver(request, tlib_logger, adb_logger):
46 """ 47 Fixture to creates a Webdriver object to interact with native apps specified by command line parameters 48 @param request: Object that gives access to the requesting test context 49 @type request: FixtureRequest 50 @param tlib_logger: logger for tlib related actions 51 @type tlib_logger: logging.Logger 52 """ 53 serial_id = request.config.getoption("serial_id") 54 55 apk_path = request.config.getoption("apk_path") 56 if apk_path is None: 57 tlib_logger.error("parameter --apk_path was not specified") 58 raise RuntimeError("parameter --apk_path was not specified") 59 60 if not os.path.exists(apk_path): 61 tlib_logger.error("Selendroid coulnd't be found under '%s'" % apk_path) 62 raise RuntimeError("Selendroid coulnd't be found under '%s'" % apk_path) 63 64 tlib_logger.debug("Creating selendroid driver") 65 66 #Start selendroid server 67 process = AndroidHelper.start_selendroid_server(tlib_logger, adb_logger, apk_path) 68 if process: 69 request.addfinalizer(process.kill) 70 71 dr = selendroid_driver(tlib_logger, serial_id) 72 return dr
73
74 75 -def selendroid_driver(tlib_logger, serial_id):
76 """ 77 Function to create Webdriver object to interact with native apps 78 @param tlib_logger: logger for tlib related actions 79 @type tlib_logger: logging.Logger 80 @param serial_id: Serial Id of android device. If not given default android device will be used 81 @type serial_id: str 82 """ 83 app_id = AndroidHelper.get_android_app_id() 84 capabilities = {'aut': app_id} 85 if serial_id is None: 86 tlib_logger.warn("Parameter --serial_id was not given. Running test on default device") 87 else: 88 capabilities['serial'] = serial_id 89 dr = selenium_webdriver.Remote(desired_capabilities=capabilities) 90 91 return dr
92
93 94 #noinspection PyShadowingNames,PyUnresolvedReferences 95 @pytest.fixture(scope='class') 96 -def browser(request, tlib_logger, adb_logger, chromedriver_version):
97 """ 98 Fixture to create a browser as specified by the command line parameter --browser\n 99 """ 100 browser = request.config.getoption("browser") 101 return get_browser(request, tlib_logger, adb_logger, browser, chromedriver_version)
102
103 104 @pytest.fixture(scope='class') 105 -def chromedriver_version(request, tlib_logger):
106 """ 107 Fixture to create a browser as specified by the command line parameter --browser\n 108 """ 109 version = request.config.getoption("chromedriver_version") 110 tlib_logger.info("Using chromedriver version = '%s'" % version) 111 return version
112
113 114 -def get_browser(request, tlib_logger, adb_logger, browser_str, chromedriver="latest"):
115 """ 116 Creates a Webdriver object to interact with browser specified in browser_str parameter 117 @param request: Object that gives access to the requesting test context 118 @type request: FixtureRequest 119 @param tlib_logger: logger for tlib related actions 120 @type tlib_logger: logging.Logger 121 @param adb_logger: logger for adb related actions 122 @type adb_logger: logging.Logger 123 @param browser_str: browser to launch. It cna be firefox, chrome, ie or android 124 @type browser_str: str 125 @param chromedriver: Version of ChromeDriver to use. Pass 'latest' to use the latest version 126 @type chromedriver: str 127 """ 128 b = None 129 process = None 130 131 #Don't create a browser object is --browser was not specified 132 if browser_str is None: 133 tlib_logger.error("Parameter browser was not specified") 134 raise RuntimeError("Parameter --browser was not specified") 135 else: 136 if browser_str == "ie": 137 tlib_logger.debug("Creating webdriver for IE") 138 b = selenium_webdriver.Ie(webdriver_ie_executable()) 139 b.maximize_window() 140 elif browser_str == "chrome": 141 tlib_logger.debug("Creating webdriver for Chrome") 142 b = selenium_webdriver.Chrome(webdriver_chrome_executable(chromedriver)) 143 b.maximize_window() 144 elif browser_str == "firefox": 145 tlib_logger.debug("Creating webdriver for Firefox") 146 b = selenium_webdriver.Firefox() 147 b.maximize_window() 148 elif browser_str == "firefox_no_js": 149 tlib_logger.debug("Creating webdriver for Firefox with JavaScript disabled") 150 profile = selenium_webdriver.FirefoxProfile() 151 profile.set_preference("javascript.enabled", False) 152 b = selenium_webdriver.Firefox(profile) 153 b.maximize_window() 154 elif browser_str == "android": 155 tlib_logger.debug("Creating webdriver for Android") 156 157 serial_id = request.config.getoption("serial_id") 158 if serial_id is None: 159 tlib_logger.warn("Parameter --serial_id was not given. Running test on default device") 160 161 #Start android server 162 AndroidHelper.setup_webdriver(tlib_logger, adb_logger, serial_id) 163 b = selenium_webdriver.Remote(command_executor='http://localhost:8080/wd/hub', 164 desired_capabilities=selenium_webdriver.DesiredCapabilities.ANDROID) 165 elif browser_str == "chrome_android": 166 tlib_logger.debug("Running Chrome on android") 167 168 desired_caps = {} 169 170 serial_id = request.config.getoption("serial_id") 171 if serial_id is not None: 172 desired_caps['udid'] = serial_id 173 else: 174 desired_caps['defaultDevice'] = True 175 176 desired_caps['deviceName']='' 177 desired_caps['platformName'] = 'Android' 178 desired_caps['browserName'] = 'Chrome' 179 desired_caps['noReset'] = True 180 181 182 #Start selendroid server 183 process = AndroidHelper.start_appium_server(tlib_logger, adb_logger) 184 b = appium_webdriver(desired_capabilities=desired_caps) 185 else: 186 #noinspection PyUnresolvedReferences 187 raise RuntimeError("{browser}s is not a valid browser".format(browser=browser_str)) 188 189 def fin(): 190 # noinspection PyStatementEffect 191 b.quit() 192 if browser_str == "android": 193 AndroidHelper.teardown_webdriver(tlib_logger, adb_logger, serial_id) 194 195 if process: 196 process.kill
197 198 request.addfinalizer(fin) 199 200 return b 201
202 203 #noinspection PyUnresolvedReferences 204 @pytest.fixture(scope="class") 205 -def mobile_base_url(request, tlib_logger):
206 """ 207 Returns value of --mobile_base_url command line parameter 208 """ 209 if request.config.getoption("mobile_base_url") is None: 210 #noinspection PyUnresolvedReferences 211 tlib_logger.error("parameter --mobile_base_url was not specified") 212 raise RuntimeError("parameter --mobile_base_url was not specified") 213 return None 214 else: 215 return request.config.getoption("mobile_base_url")
216