1 import os
2
3 __author__ = 'AOsorio1'
4
5
6 import pytest
7
8 from selenium import webdriver
9 from _pytest.python import FixtureRequest
10 from _pytest.mark import MarkInfo
11
12 import jinja2
13 from tlib.base import TestHelper
14 from tlib.base.PytestTester import PytestTester
15 from selenium.webdriver.support.ui import WebDriverWait
16 from selenium.common.exceptions import NoSuchElementException, ElementNotVisibleException, TimeoutException
17 import logging
103
104
105 @pytest.fixture(scope='function', autouse=True)
107 """
108 Generates HTML page with screenshots for each test
109 @type request: FixtureRequest
110 """
111 self.__class__._test_params = request.keywords.node._genid
112 self.__class__._screenshots = {}
113
114
115 marker = request.node.get_marker("testcasename")
116 if marker is None:
117 self.__class__._test_case_id = "UNKNOWN_TEST_CASE_ID"
118 else:
119 self.__class__._test_case_id = marker.args[0]
120
121
122 def generate_screenshots():
123 if len(self.__class__._screenshots) > 0:
124
125 html = self.__class__._tc_screenshot_template.render(test_case_id=self.__class__._test_case_id,
126 test_case_name=request.keywords.node.name,
127 screenshots=self.__class__._screenshots)
128
129 html_file = "%s.html" % self.__class__._test_params
130 relative_filename = os.path.join(self.__class__._test_case_id, html_file)
131 full_filename = os.path.join(self.screenshot_folder(), relative_filename)
132
133 f = open(full_filename, "w")
134 try:
135 f.write(html)
136 finally:
137 f.close()
138
139
140 self.__class__._screenshot_report[request.keywords.node.name] = relative_filename
141
142 request.addfinalizer(generate_screenshots)
143
144
145 - def navigate(self, page, save_screenshot=True):
153
154
161
162
164 """
165 Saves screen shot for the current page
166 """
167
168 self.wait_for_page_loaded()
169
170
171 test_folder = os.path.join(self.screenshot_folder(), self.__class__._test_case_id, self.__class__._test_params)
172
173 try:
174 os.makedirs(test_folder)
175 except WindowsError:
176 pass
177
178
179 i = len(os.listdir(test_folder)) + 1
180
181
182 img_filename = "%02d.jpg" % i
183 full_path = os.path.join(test_folder, img_filename)
184
185 self.__class__._screenshots[i] = {"filename": "%s/%s" % (self.__class__._test_params, img_filename),
186 "description": description}
187
188 self.browser.get_screenshot_as_file(full_path)
189
190
191 - def wait_for_page_loaded(self, timeout=10):
192 """
193 Waist until document.readyState is equal to complete
194 """
195 condition = lambda *args: self.browser.execute_script("return document.readyState") == "complete"
196 try:
197 WebDriverWait(self.browser, timeout*1000).until(condition)
198 except TimeoutException:
199 self.test_logger.error('Timeout while waiting for page to load')
200 pytest.fail('Timeout while waiting for page to load')
201
202
203 @pytest.fixture(scope='function', autouse=True)
205 """
206 Goes to homepage before each test, unless marker skipsetup is given
207 """
208
209 marks = {}
210 for k,v in request.node.function.__dict__.iteritems():
211 if isinstance(v, MarkInfo):
212 marks[k] = v
213
214
215 if not marks.has_key('skipsetup'):
216 self.go_home()
217 else:
218 self.test_logger.info("Skipping setup")
219