Skip to content

Commit 998655d

Browse files
authored
Merge pull request #536 from seleniumbase/error-output-and-logging
Update error output, refactor logging, and update dependencies
2 parents dffbc7d + 6a0b9c7 commit 998655d

File tree

5 files changed

+83
-27
lines changed

5 files changed

+83
-27
lines changed

requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ pymysql==0.9.3
4242
pyotp==2.3.0
4343
boto==2.49.0
4444
cffi==1.14.0
45-
tqdm==4.44.1
45+
tqdm==4.45.0
4646
flake8==3.7.9
4747
certifi>=2019.11.28
4848
pdfminer.six==20191110;python_version<"3.5"
49-
pdfminer.six==20200124;python_version>="3.5"
49+
pdfminer.six==20200402;python_version>="3.5"

seleniumbase/core/log_helper.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@ def log_screenshot(test_logpath, driver, screenshot=None, get=False):
2525
print("WARNING: Unable to get screenshot for failure logs!")
2626

2727

28-
def log_test_failure_data(test, test_logpath, driver, browser):
28+
def log_test_failure_data(test, test_logpath, driver, browser, url=None):
2929
basic_info_name = settings.BASIC_INFO_NAME
3030
basic_file_path = "%s/%s" % (test_logpath, basic_info_name)
3131
log_file = codecs.open(basic_file_path, "w+", "utf-8")
32-
last_page = get_last_page(driver)
32+
if url:
33+
last_page = url
34+
else:
35+
last_page = get_last_page(driver)
3336
data_to_save = []
3437
data_to_save.append("Last Page: %s" % last_page)
3538
data_to_save.append(" Browser: %s" % browser)
@@ -56,13 +59,16 @@ def log_test_failure_data(test, test_logpath, driver, browser):
5659
log_file.close()
5760

5861

59-
def log_page_source(test_logpath, driver):
62+
def log_page_source(test_logpath, driver, source=None):
6063
html_file_name = settings.PAGE_SOURCE_NAME
61-
try:
62-
page_source = driver.page_source
63-
except Exception:
64-
# Since we can't get the page source from here, skip saving it
65-
return
64+
if source:
65+
page_source = source
66+
else:
67+
try:
68+
page_source = driver.page_source
69+
except Exception:
70+
# Since we can't get the page source from here, skip saving it
71+
return
6672
html_file_path = "%s/%s" % (test_logpath, html_file_name)
6773
html_file = codecs.open(html_file_path, "w+", "utf-8")
6874
rendered_source = get_html_source_with_base_href(driver, page_source)

seleniumbase/fixtures/base_case.py

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ def __init__(self, *args, **kwargs):
8080
self.__last_page_load_url = "data:,"
8181
self.__last_page_screenshot = None
8282
self.__last_page_screenshot_png = None
83+
self.__last_page_url = None
84+
self.__last_page_source = None
8385
self.__added_pytest_html_extra = None
8486
self.__delayed_assert_count = 0
8587
self.__delayed_assert_failures = []
@@ -4548,6 +4550,22 @@ def __set_last_page_screenshot(self):
45484550
except Exception:
45494551
pass
45504552

4553+
def __set_last_page_url(self):
4554+
if not self.__last_page_url:
4555+
try:
4556+
self.__last_page_url = log_helper.get_last_page(self.driver)
4557+
except Exception:
4558+
self.__last_page_url = None
4559+
4560+
def __set_last_page_source(self):
4561+
if not self.__last_page_source:
4562+
try:
4563+
self.__last_page_source = (
4564+
log_helper.get_html_source_with_base_href(
4565+
self.driver, self.driver.page_source))
4566+
except Exception:
4567+
self.__last_page_source = None
4568+
45514569
def __insert_test_result(self, state, err):
45524570
data_payload = TestcaseDataPayload()
45534571
data_payload.runtime = int(time.time() * 1000) - self.case_start_time
@@ -4574,6 +4592,8 @@ def __add_pytest_html_extra(self):
45744592
if self.with_selenium:
45754593
if not self.__last_page_screenshot:
45764594
self.__set_last_page_screenshot()
4595+
self.__set_last_page_url()
4596+
self.__set_last_page_source()
45774597
if self.report_on:
45784598
extra_url = {}
45794599
extra_url['name'] = 'URL'
@@ -4655,6 +4675,8 @@ def save_teardown_screenshot(self):
46554675
test_logpath = self.log_path + "/" + test_id
46564676
self.__create_log_path_as_needed(test_logpath)
46574677
self.__set_last_page_screenshot()
4678+
self.__set_last_page_url()
4679+
self.__set_last_page_source()
46584680
if self.is_pytest:
46594681
self.__add_pytest_html_extra()
46604682

@@ -4715,6 +4737,8 @@ def tearDown(self):
47154737
self.__create_log_path_as_needed(test_logpath)
47164738
if not self.__last_page_screenshot_png:
47174739
self.__set_last_page_screenshot()
4740+
self.__set_last_page_url()
4741+
self.__set_last_page_source()
47184742
log_helper.log_screenshot(
47194743
test_logpath,
47204744
self.driver,
@@ -4729,27 +4753,35 @@ def tearDown(self):
47294753
# Log everything if nothing specified (if testing_base)
47304754
if not self.__last_page_screenshot_png:
47314755
self.__set_last_page_screenshot()
4756+
self.__set_last_page_url()
4757+
self.__set_last_page_source()
47324758
log_helper.log_screenshot(
47334759
test_logpath,
47344760
self.driver,
47354761
self.__last_page_screenshot_png)
47364762
log_helper.log_test_failure_data(
4737-
self, test_logpath, self.driver, self.browser)
4738-
log_helper.log_page_source(test_logpath, self.driver)
4763+
self, test_logpath, self.driver, self.browser,
4764+
self.__last_page_url)
4765+
log_helper.log_page_source(
4766+
test_logpath, self.driver, self.__last_page_source)
47394767
else:
47404768
if self.with_screen_shots:
47414769
if not self.__last_page_screenshot_png:
47424770
self.__set_last_page_screenshot()
4771+
self.__set_last_page_url()
4772+
self.__set_last_page_source()
47434773
log_helper.log_screenshot(
47444774
test_logpath,
47454775
self.driver,
47464776
self.__last_page_screenshot_png)
47474777
if self.with_basic_test_info:
47484778
log_helper.log_test_failure_data(
4749-
self, test_logpath, self.driver, self.browser)
4779+
self, test_logpath, self.driver, self.browser,
4780+
self.__last_page_url)
47504781
if self.with_page_source:
47514782
log_helper.log_page_source(
4752-
test_logpath, self.driver)
4783+
test_logpath, self.driver,
4784+
self.__last_page_source)
47534785
# (Pytest) Finally close all open browser windows
47544786
self.__quit_all_drivers()
47554787
if self.headless:
@@ -4801,21 +4833,27 @@ def tearDown(self):
48014833
test_logpath = self.log_path + "/" + test_id
48024834
self.__create_log_path_as_needed(test_logpath)
48034835
log_helper.log_test_failure_data(
4804-
self, test_logpath, self.driver, self.browser)
4836+
self, test_logpath, self.driver, self.browser,
4837+
self.__last_page_url)
48054838
if len(self._drivers_list) > 0:
48064839
if not self.__last_page_screenshot_png:
48074840
self.__set_last_page_screenshot()
4841+
self.__set_last_page_url()
4842+
self.__set_last_page_source()
48084843
log_helper.log_screenshot(
48094844
test_logpath,
48104845
self.driver,
48114846
self.__last_page_screenshot_png)
4812-
log_helper.log_page_source(test_logpath, self.driver)
4847+
log_helper.log_page_source(
4848+
test_logpath, self.driver, self.__last_page_source)
48134849
elif self.save_screenshot_after_test:
48144850
test_id = self.__get_test_id()
48154851
test_logpath = self.log_path + "/" + test_id
48164852
self.__create_log_path_as_needed(test_logpath)
48174853
if not self.__last_page_screenshot_png:
48184854
self.__set_last_page_screenshot()
4855+
self.__set_last_page_url()
4856+
self.__set_last_page_source()
48194857
log_helper.log_screenshot(
48204858
test_logpath,
48214859
self.driver,

seleniumbase/fixtures/page_actions.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,12 @@ def hover_and_click(driver, hover_selector, click_selector,
142142
if now_ms >= stop_ms:
143143
break
144144
time.sleep(0.1)
145+
plural = "s"
146+
if timeout == 1:
147+
plural = ""
145148
raise NoSuchElementException(
146-
"Element {%s} was not present after %s seconds!" %
147-
(click_selector, timeout))
149+
"Element {%s} was not present after %s second%s!" % (
150+
click_selector, timeout, plural))
148151

149152

150153
def hover_element_and_click(driver, element, click_selector,
@@ -167,9 +170,12 @@ def hover_element_and_click(driver, element, click_selector,
167170
if now_ms >= stop_ms:
168171
break
169172
time.sleep(0.1)
173+
plural = "s"
174+
if timeout == 1:
175+
plural = ""
170176
raise NoSuchElementException(
171-
"Element {%s} was not present after %s seconds!" %
172-
(click_selector, timeout))
177+
"Element {%s} was not present after %s second%s!" % (
178+
click_selector, timeout, plural))
173179

174180

175181
def hover_element_and_double_click(driver, element, click_selector,
@@ -192,9 +198,12 @@ def hover_element_and_double_click(driver, element, click_selector,
192198
if now_ms >= stop_ms:
193199
break
194200
time.sleep(0.1)
201+
plural = "s"
202+
if timeout == 1:
203+
plural = ""
195204
raise NoSuchElementException(
196-
"Element {%s} was not present after %s seconds!" %
197-
(click_selector, timeout))
205+
"Element {%s} was not present after %s second%s!" % (
206+
click_selector, timeout, plural))
198207

199208

200209
def wait_for_element_present(driver, selector, by=By.CSS_SELECTOR,
@@ -225,10 +234,13 @@ def wait_for_element_present(driver, selector, by=By.CSS_SELECTOR,
225234
if now_ms >= stop_ms:
226235
break
227236
time.sleep(0.1)
237+
plural = "s"
238+
if timeout == 1:
239+
plural = ""
228240
if not element:
229241
raise NoSuchElementException(
230-
"Element {%s} was not present after %s seconds!" % (
231-
selector, timeout))
242+
"Element {%s} was not present after %s second%s!" % (
243+
selector, timeout, plural))
232244

233245

234246
def wait_for_element_visible(driver, selector, by=By.CSS_SELECTOR,

setup.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
setup(
4747
name='seleniumbase',
48-
version='1.36.9',
48+
version='1.36.10',
4949
description='Fast, Easy, and Reliable Browser Automation & Testing.',
5050
long_description=long_description,
5151
long_description_content_type='text/markdown',
@@ -124,11 +124,11 @@
124124
'pyotp==2.3.0',
125125
'boto==2.49.0',
126126
'cffi==1.14.0',
127-
'tqdm==4.44.1',
127+
'tqdm==4.45.0',
128128
'flake8==3.7.9',
129129
'certifi>=2019.11.28',
130130
'pdfminer.six==20191110;python_version<"3.5"',
131-
'pdfminer.six==20200124;python_version>="3.5"',
131+
'pdfminer.six==20200402;python_version>="3.5"',
132132
],
133133
packages=[
134134
'seleniumbase',

0 commit comments

Comments
 (0)