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
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
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
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
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
95 @pytest.fixture(scope='class')
96 -def browser(request, tlib_logger, adb_logger, chromedriver_version):
102
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
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
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
183 process = AndroidHelper.start_appium_server(tlib_logger, adb_logger)
184 b = appium_webdriver(desired_capabilities=desired_caps)
185 else:
186
187 raise RuntimeError("{browser}s is not a valid browser".format(browser=browser_str))
188
189 def fin():
190
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
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
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