Skip to content

Commit 63c23cb

Browse files
authored
Merge pull request #1292 from seleniumbase/fix-recorder-bugs-and-improve-deferred-asserts
Fix Recorder bugs and improve deferred asserts
2 parents 2280327 + e457cce commit 63c23cb

File tree

7 files changed

+72
-42
lines changed

7 files changed

+72
-42
lines changed

examples/test_deferred_asserts.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
This test demonstrates the use of deferred asserts.
33
Deferred asserts won't raise exceptions from failures until either
44
process_deferred_asserts() is called, or the test reaches the tearDown() step.
5-
Requires version 2.1.6 or newer for the deferred_assert_exact_text() method.
65
"""
76
import pytest
87
from seleniumbase import BaseCase

help_docs/method_summary.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -740,25 +740,29 @@ self.check_window(
740740

741741
############
742742

743-
self.deferred_assert_element(selector, by=By.CSS_SELECTOR, timeout=None)
744-
# Duplicates: self.delayed_assert_element(selector, by=By.CSS_SELECTOR, timeout=None)
743+
self.deferred_assert_element(selector, by=By.CSS_SELECTOR, timeout=None, fs=False)
744+
# Duplicates:
745+
# self.delayed_assert_element(selector, by=By.CSS_SELECTOR, timeout=None, fs=False)
745746

746747
self.deferred_assert_text(
747-
text, selector="html", by=By.CSS_SELECTOR, timeout=None)
748+
text, selector="html", by=By.CSS_SELECTOR, timeout=None, fs=False)
748749
# Duplicates:
749-
# self.delayed_assert_text(text, selector="html", by=By.CSS_SELECTOR, timeout=None)
750+
# self.delayed_assert_text(
751+
# text, selector="html", by=By.CSS_SELECTOR, timeout=None, fs=False)
750752

751753
self.deferred_assert_exact_text(
752-
text, selector="html", by=By.CSS_SELECTOR, timeout=None)
754+
text, selector="html", by=By.CSS_SELECTOR, timeout=None, fs=False)
753755
# Duplicates:
754-
# self.delayed_assert_exact_text(text, selector="html", by=By.CSS_SELECTOR, timeout=None)
756+
# self.delayed_assert_exact_text(
757+
# text, selector="html", by=By.CSS_SELECTOR, timeout=None, fs=False)
755758

756759
self.deferred_check_window(
757-
name="default", level=0, baseline=False, check_domain=True, full_diff=False)
760+
name="default", level=0, baseline=False,
761+
check_domain=True, full_diff=False, fs=False)
758762
# Duplicates:
759-
# self.deferred_check_window(
760-
# name=name, level=level, baseline=baseline, check_domain=check_domain, full_diff=full_diff)
761-
763+
# self.delayed_check_window(
764+
# name="default", level=0, baseline=False,
765+
# check_domain=True, full_diff=False, fs=False)
762766
self.process_deferred_asserts(print_only=False)
763767
# Duplicates: self.process_delayed_asserts(print_only=False)
764768

mkdocs_build/requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pkginfo==1.8.2
1515
Jinja2==3.1.2
1616
click==8.1.3
1717
zipp==3.8.0
18+
ghp-import==2.1.0
1819
readme-renderer==35.0
1920
pymdown-extensions==9.4
2021
importlib-metadata==4.11.3
@@ -24,7 +25,7 @@ lunr==0.6.2
2425
nltk==3.7
2526
watchdog==2.1.7
2627
mkdocs==1.3.0
27-
mkdocs-material==8.2.12
28+
mkdocs-material==8.2.13
2829
mkdocs-exclude-search==0.6.4
2930
mkdocs-simple-hooks==0.1.5
3031
mkdocs-material-extensions==1.0.3

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "2.5.3"
2+
__version__ = "2.5.4"

seleniumbase/extensions/recorder.zip

0 Bytes
Binary file not shown.

seleniumbase/fixtures/base_case.py

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3201,7 +3201,7 @@ def save_screenshot(
32013201
def save_screenshot_to_logs(
32023202
self, name=None, selector=None, by=By.CSS_SELECTOR
32033203
):
3204-
"""Saves a screenshot of the current page to the "latest_logs" folder.
3204+
"""Saves a screenshot of the current page to the "latest_logs/" folder.
32053205
Naming is automatic:
32063206
If NO NAME provided: "_1_screenshot.png", "_2_screenshot.png", etc.
32073207
If NAME IS provided, it becomes: "_1_name.png", "_2_name.png", etc.
@@ -10585,24 +10585,31 @@ def __get_exception_message(self):
1058510585
exc_message = sys.exc_info()
1058610586
return exc_message
1058710587

10588-
def __add_deferred_assert_failure(self):
10588+
def __add_deferred_assert_failure(self, fs=False):
1058910589
"""Add a deferred_assert failure to a list for future processing."""
1059010590
self.__check_scope()
1059110591
current_url = self.driver.current_url
1059210592
message = self.__get_exception_message()
10593+
count = self.__deferred_assert_count
1059310594
self.__deferred_assert_failures.append(
10594-
"CHECK #%s: (%s) %s\n"
10595-
% (self.__deferred_assert_count, current_url, message)
10595+
"DEFERRED ASSERT #%s: (%s) %s\n" % (count, current_url, message)
1059610596
)
10597+
if fs:
10598+
self.save_screenshot_to_logs(name="deferred_#%s" % count)
1059710599

1059810600
############
1059910601

1060010602
def deferred_assert_element(
10601-
self, selector, by=By.CSS_SELECTOR, timeout=None
10603+
self, selector, by=By.CSS_SELECTOR, timeout=None, fs=False
1060210604
):
1060310605
"""A non-terminating assertion for an element on a page.
1060410606
Failures will be saved until the process_deferred_asserts()
10605-
method is called from inside a test, likely at the end of it."""
10607+
method is called from inside a test, likely at the end of it.
10608+
If "fs" is set to True, a failure screenshot is saved to the
10609+
"latest_logs/" folder for that assertion failure. Otherwise,
10610+
only the last page screenshot is taken for all failures when
10611+
calling the process_deferred_asserts() method.
10612+
"""
1060610613
self.__check_scope()
1060710614
if not timeout:
1060810615
timeout = settings.MINI_TIMEOUT
@@ -10621,15 +10628,20 @@ def deferred_assert_element(
1062110628
self.wait_for_element_visible(selector, by=by, timeout=timeout)
1062210629
return True
1062310630
except Exception:
10624-
self.__add_deferred_assert_failure()
10631+
self.__add_deferred_assert_failure(fs=fs)
1062510632
return False
1062610633

1062710634
def deferred_assert_text(
10628-
self, text, selector="html", by=By.CSS_SELECTOR, timeout=None
10635+
self, text, selector="html", by=By.CSS_SELECTOR, timeout=None, fs=False
1062910636
):
1063010637
"""A non-terminating assertion for text from an element on a page.
1063110638
Failures will be saved until the process_deferred_asserts()
10632-
method is called from inside a test, likely at the end of it."""
10639+
method is called from inside a test, likely at the end of it.
10640+
If "fs" is set to True, a failure screenshot is saved to the
10641+
"latest_logs/" folder for that assertion failure. Otherwise,
10642+
only the last page screenshot is taken for all failures when
10643+
calling the process_deferred_asserts() method.
10644+
"""
1063310645
self.__check_scope()
1063410646
if not timeout:
1063510647
timeout = settings.MINI_TIMEOUT
@@ -10648,15 +10660,20 @@ def deferred_assert_text(
1064810660
self.wait_for_text_visible(text, selector, by=by, timeout=timeout)
1064910661
return True
1065010662
except Exception:
10651-
self.__add_deferred_assert_failure()
10663+
self.__add_deferred_assert_failure(fs=fs)
1065210664
return False
1065310665

1065410666
def deferred_assert_exact_text(
10655-
self, text, selector="html", by=By.CSS_SELECTOR, timeout=None
10667+
self, text, selector="html", by=By.CSS_SELECTOR, timeout=None, fs=False
1065610668
):
1065710669
"""A non-terminating assertion for exact text from an element.
1065810670
Failures will be saved until the process_deferred_asserts()
10659-
method is called from inside a test, likely at the end of it."""
10671+
method is called from inside a test, likely at the end of it.
10672+
If "fs" is set to True, a failure screenshot is saved to the
10673+
"latest_logs/" folder for that assertion failure. Otherwise,
10674+
only the last page screenshot is taken for all failures when
10675+
calling the process_deferred_asserts() method.
10676+
"""
1066010677
self.__check_scope()
1066110678
if not timeout:
1066210679
timeout = settings.MINI_TIMEOUT
@@ -10677,7 +10694,7 @@ def deferred_assert_exact_text(
1067710694
)
1067810695
return True
1067910696
except Exception:
10680-
self.__add_deferred_assert_failure()
10697+
self.__add_deferred_assert_failure(fs=fs)
1068110698
return False
1068210699

1068310700
def deferred_check_window(
@@ -10687,10 +10704,16 @@ def deferred_check_window(
1068710704
baseline=False,
1068810705
check_domain=True,
1068910706
full_diff=False,
10707+
fs=False,
1069010708
):
1069110709
"""A non-terminating assertion for the check_window() method.
1069210710
Failures will be saved until the process_deferred_asserts()
10693-
method is called from inside a test, likely at the end of it."""
10711+
method is called from inside a test, likely at the end of it.
10712+
If "fs" is set to True, a failure screenshot is saved to the
10713+
"latest_logs/" folder for that assertion failure. Otherwise,
10714+
only the last page screenshot is taken for all failures when
10715+
calling the process_deferred_asserts() method.
10716+
"""
1069410717
self.__check_scope()
1069510718
self.__deferred_assert_count += 1
1069610719
try:
@@ -10703,7 +10726,7 @@ def deferred_check_window(
1070310726
)
1070410727
return True
1070510728
except Exception:
10706-
self.__add_deferred_assert_failure()
10729+
self.__add_deferred_assert_failure(fs=fs)
1070710730
return False
1070810731

1070910732
def process_deferred_asserts(self, print_only=False):
@@ -10735,27 +10758,27 @@ def process_deferred_asserts(self, print_only=False):
1073510758
# Alternate naming scheme for the "deferred_assert" methods.
1073610759

1073710760
def delayed_assert_element(
10738-
self, selector, by=By.CSS_SELECTOR, timeout=None
10761+
self, selector, by=By.CSS_SELECTOR, timeout=None, fs=False
1073910762
):
1074010763
"""Same as self.deferred_assert_element()"""
1074110764
return self.deferred_assert_element(
10742-
selector=selector, by=by, timeout=timeout
10765+
selector=selector, by=by, timeout=timeout, fs=fs
1074310766
)
1074410767

1074510768
def delayed_assert_text(
10746-
self, text, selector="html", by=By.CSS_SELECTOR, timeout=None
10769+
self, text, selector="html", by=By.CSS_SELECTOR, timeout=None, fs=False
1074710770
):
1074810771
"""Same as self.deferred_assert_text()"""
1074910772
return self.deferred_assert_text(
10750-
text=text, selector=selector, by=by, timeout=timeout
10773+
text=text, selector=selector, by=by, timeout=timeout, fs=fs
1075110774
)
1075210775

1075310776
def delayed_assert_exact_text(
10754-
self, text, selector="html", by=By.CSS_SELECTOR, timeout=None
10777+
self, text, selector="html", by=By.CSS_SELECTOR, timeout=None, fs=False
1075510778
):
1075610779
"""Same as self.deferred_assert_exact_text()"""
1075710780
return self.deferred_assert_exact_text(
10758-
text=text, selector=selector, by=by, timeout=timeout
10781+
text=text, selector=selector, by=by, timeout=timeout, fs=fs
1075910782
)
1076010783

1076110784
def delayed_check_window(
@@ -10765,6 +10788,7 @@ def delayed_check_window(
1076510788
baseline=False,
1076610789
check_domain=True,
1076710790
full_diff=False,
10791+
fs=False,
1076810792
):
1076910793
"""Same as self.deferred_check_window()"""
1077010794
return self.deferred_check_window(
@@ -10773,6 +10797,7 @@ def delayed_check_window(
1077310797
baseline=baseline,
1077410798
check_domain=check_domain,
1077510799
full_diff=full_diff,
10800+
fs=fs,
1077610801
)
1077710802

1077810803
def process_delayed_asserts(self, print_only=False):

seleniumbase/js_code/recorder_js.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@
361361
document.title = sessionStorage.getItem('recorder_title');
362362
});
363363
document.body.addEventListener('click', function (event) {
364-
// Do Nothing.
364+
// Do Nothing
365365
});
366366
document.body.addEventListener('submit', function (event) {
367367
reset_if_recorder_undefined();
@@ -513,9 +513,8 @@
513513
if (rec_mode === '2' || rec_mode === '3')
514514
{
515515
el = turnIntoParentAsNeeded(el);
516-
texts = [el.innerText, el.textContent];
517-
text = texts[0];
518-
t_con = texts[1];
516+
text = el.innerText;
517+
t_con = el.textContent;
519518
origin = window.location.origin;
520519
sel_has_contains = selector.includes(':contains(');
521520
if (!text) { text = ''; }
@@ -530,6 +529,8 @@
530529
else if (rec_mode === '3') {
531530
action = 'as_et';
532531
text = text.trim();
532+
if (el.tagName.toLowerCase() == "input")
533+
text = el.value.trim();
533534
var match = /\r|\n/.exec(text);
534535
if (match) {
535536
lines = text.split(/\r\n|\r|\n/g);
@@ -550,7 +551,7 @@
550551
if (ra_len > 0 && document.recorded_actions[ra_len-1][0] === 'mo_dn')
551552
document.recorded_actions.pop();
552553
if (tag_name === 'select') {
553-
// Do Nothing. ('change' action.)
554+
// Do Nothing ('change' action)
554555
}
555556
else
556557
document.recorded_actions.push(['mo_dn', selector, '', d_now]);
@@ -662,7 +663,7 @@
662663
else if (ra_len > 0 &&
663664
document.recorded_actions[ra_len-1][0] === 'mo_dn')
664665
{
665-
// Maybe accidental drag & drop.
666+
// Accidental drag & drop.
666667
document.recorded_actions.pop();
667668
}
668669
json_rec_act = JSON.stringify(document.recorded_actions);
@@ -733,7 +734,7 @@
733734
red_border = 'thick solid #EE3344';
734735
document.querySelector('body').style.border = red_border;
735736
}
736-
// After controls for switching modes.
737+
// After switching modes
737738
if (sessionStorage.getItem('pause_recorder') === 'yes') return;
738739
const d_now = Date.now();
739740
const el = event.target;
@@ -775,7 +776,7 @@
775776
{
776777
skip_input = true;
777778
}
778-
if (!skip_input) {
779+
if (!skip_input && !el.hasAttribute('readonly')) {
779780
document.recorded_actions.push(
780781
['input', selector, el.value, d_now]);
781782
}

0 commit comments

Comments
 (0)