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
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
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
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
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
103 @pytest.fixture(scope='class')
104 -def browser(request, tlib_logger, adb_logger, chromedriver_version):
110
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
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
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
191 process = AndroidHelper.start_appium_server(tlib_logger, adb_logger)
192 b = appium_webdriver(desired_capabilities=desired_caps)
193 else:
194
195 raise RuntimeError("{browser}s is not a valid browser".format(browser=browser_str))
196
197 def fin():
198
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
209 b.browser_name = browser_str
210 return b
211
212
213
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
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