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