Skip to content

Commit 781e218

Browse files
committed
Include "timeout" values for Shadow DOM methods
1 parent b993671 commit 781e218

File tree

1 file changed

+66
-39
lines changed

1 file changed

+66
-39
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 66 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ def click(
225225
self.click_partial_link_text(selector, timeout=timeout)
226226
return
227227
if self.__is_shadow_selector(selector):
228-
self.__shadow_click(selector)
228+
self.__shadow_click(selector, timeout)
229229
return
230230
element = page_actions.wait_for_element_visible(
231231
self.driver, selector, by, timeout=timeout
@@ -500,7 +500,7 @@ def update_text(
500500
timeout = self.__get_new_timeout(timeout)
501501
selector, by = self.__recalculate_selector(selector, by)
502502
if self.__is_shadow_selector(selector):
503-
self.__shadow_type(selector, text)
503+
self.__shadow_type(selector, text, timeout)
504504
return
505505
element = self.wait_for_element_visible(
506506
selector, by=by, timeout=timeout
@@ -577,7 +577,7 @@ def add_text(self, selector, text, by=By.CSS_SELECTOR, timeout=None):
577577
timeout = self.__get_new_timeout(timeout)
578578
selector, by = self.__recalculate_selector(selector, by)
579579
if self.__is_shadow_selector(selector):
580-
self.__shadow_type(selector, text, clear_first=False)
580+
self.__shadow_type(selector, text, timeout, clear_first=False)
581581
return
582582
element = self.wait_for_element_visible(
583583
selector, by=by, timeout=timeout
@@ -675,7 +675,7 @@ def clear(self, selector, by=By.CSS_SELECTOR, timeout=None):
675675
timeout = self.__get_new_timeout(timeout)
676676
selector, by = self.__recalculate_selector(selector, by)
677677
if self.__is_shadow_selector(selector):
678-
self.__shadow_clear(selector)
678+
self.__shadow_clear(selector, timeout)
679679
return
680680
element = self.wait_for_element_visible(
681681
selector, by=by, timeout=timeout
@@ -1237,7 +1237,7 @@ def get_text(self, selector, by=By.CSS_SELECTOR, timeout=None):
12371237
timeout = self.__get_new_timeout(timeout)
12381238
selector, by = self.__recalculate_selector(selector, by)
12391239
if self.__is_shadow_selector(selector):
1240-
return self.__get_shadow_text(selector)
1240+
return self.__get_shadow_text(selector, timeout)
12411241
self.wait_for_ready_state_complete()
12421242
time.sleep(0.01)
12431243
element = page_actions.wait_for_element_visible(
@@ -1272,7 +1272,9 @@ def get_attribute(
12721272
self.wait_for_ready_state_complete()
12731273
time.sleep(0.01)
12741274
if self.__is_shadow_selector(selector):
1275-
return self.__get_shadow_attribute(selector, attribute)
1275+
return self.__get_shadow_attribute(
1276+
selector, attribute, timeout=timeout
1277+
)
12761278
element = page_actions.wait_for_element_present(
12771279
self.driver, selector, by, timeout
12781280
)
@@ -5954,8 +5956,19 @@ def __get_shadow_element(self, selector, timeout=None):
59545956
and self.is_chromium()
59555957
and int(self.__get_major_browser_version()) >= 96
59565958
):
5957-
element = shadow_root.find_element(
5958-
By.CSS_SELECTOR, value=selector_part)
5959+
found = False
5960+
for i in range(int(timeout) * 3):
5961+
try:
5962+
element = shadow_root.find_element(
5963+
By.CSS_SELECTOR, value=selector_part)
5964+
found = True
5965+
break
5966+
except Exception:
5967+
time.sleep(0.2)
5968+
continue
5969+
if not found:
5970+
element = shadow_root.find_element(
5971+
By.CSS_SELECTOR, value=selector_part)
59595972
else:
59605973
element = page_actions.wait_for_element_present(
59615974
shadow_root,
@@ -5985,12 +5998,12 @@ def __is_shadow_selector(self, selector):
59855998
return True
59865999
return False
59876000

5988-
def __shadow_click(self, selector):
5989-
element = self.__get_shadow_element(selector)
6001+
def __shadow_click(self, selector, timeout):
6002+
element = self.__get_shadow_element(selector, timeout=timeout)
59906003
element.click()
59916004

5992-
def __shadow_type(self, selector, text, clear_first=True):
5993-
element = self.__get_shadow_element(selector)
6005+
def __shadow_type(self, selector, text, timeout, clear_first=True):
6006+
element = self.__get_shadow_element(selector, timeout=timeout)
59946007
if clear_first:
59956008
try:
59966009
element.clear()
@@ -6010,29 +6023,31 @@ def __shadow_type(self, selector, text, clear_first=True):
60106023
if settings.WAIT_FOR_RSC_ON_PAGE_LOADS:
60116024
self.wait_for_ready_state_complete()
60126025

6013-
def __shadow_clear(self, selector):
6014-
element = self.__get_shadow_element(selector)
6026+
def __shadow_clear(self, selector, timeout):
6027+
element = self.__get_shadow_element(selector, timeout=timeout)
60156028
try:
60166029
element.clear()
60176030
backspaces = Keys.BACK_SPACE * 42 # Autofill Defense
60186031
element.send_keys(backspaces)
60196032
except Exception:
60206033
pass
60216034

6022-
def __get_shadow_text(self, selector):
6023-
element = self.__get_shadow_element(selector)
6035+
def __get_shadow_text(self, selector, timeout):
6036+
element = self.__get_shadow_element(selector, timeout=timeout)
60246037
return element.text
60256038

6026-
def __get_shadow_attribute(self, selector, attribute):
6027-
element = self.__get_shadow_element(selector)
6039+
def __get_shadow_attribute(self, selector, attribute, timeout):
6040+
element = self.__get_shadow_element(selector, timeout=timeout)
60286041
return element.get_attribute(attribute)
60296042

6030-
def __wait_for_shadow_text_visible(self, text, selector):
6043+
def __wait_for_shadow_text_visible(self, text, selector, timeout):
60316044
start_ms = time.time() * 1000.0
60326045
stop_ms = start_ms + (settings.SMALL_TIMEOUT * 1000.0)
60336046
for x in range(int(settings.SMALL_TIMEOUT * 10)):
60346047
try:
6035-
actual_text = self.__get_shadow_text(selector).strip()
6048+
actual_text = self.__get_shadow_text(
6049+
selector, timeout=1
6050+
).strip()
60366051
text = text.strip()
60376052
if text not in actual_text:
60386053
msg = (
@@ -6048,7 +6063,7 @@ def __wait_for_shadow_text_visible(self, text, selector):
60486063
if now_ms >= stop_ms:
60496064
break
60506065
time.sleep(0.1)
6051-
actual_text = self.__get_shadow_text(selector).strip()
6066+
actual_text = self.__get_shadow_text(selector, timeout=1).strip()
60526067
text = text.strip()
60536068
if text not in actual_text:
60546069
msg = "Expected text {%s} in element {%s} was not visible!" % (
@@ -6058,12 +6073,14 @@ def __wait_for_shadow_text_visible(self, text, selector):
60586073
page_actions.timeout_exception("ElementNotVisibleException", msg)
60596074
return True
60606075

6061-
def __wait_for_exact_shadow_text_visible(self, text, selector):
6076+
def __wait_for_exact_shadow_text_visible(self, text, selector, timeout):
60626077
start_ms = time.time() * 1000.0
60636078
stop_ms = start_ms + (settings.SMALL_TIMEOUT * 1000.0)
60646079
for x in range(int(settings.SMALL_TIMEOUT * 10)):
60656080
try:
6066-
actual_text = self.__get_shadow_text(selector).strip()
6081+
actual_text = self.__get_shadow_text(
6082+
selector, timeout=1
6083+
).strip()
60676084
text = text.strip()
60686085
if text != actual_text:
60696086
msg = (
@@ -6079,7 +6096,7 @@ def __wait_for_exact_shadow_text_visible(self, text, selector):
60796096
if now_ms >= stop_ms:
60806097
break
60816098
time.sleep(0.1)
6082-
actual_text = self.__get_shadow_text(selector).strip()
6099+
actual_text = self.__get_shadow_text(selector, timeout=1).strip()
60836100
text = text.strip()
60846101
if text != actual_text:
60856102
msg = (
@@ -6089,8 +6106,8 @@ def __wait_for_exact_shadow_text_visible(self, text, selector):
60896106
page_actions.timeout_exception("ElementNotVisibleException", msg)
60906107
return True
60916108

6092-
def __assert_shadow_text_visible(self, text, selector):
6093-
self.__wait_for_shadow_text_visible(text, selector)
6109+
def __assert_shadow_text_visible(self, text, selector, timeout):
6110+
self.__wait_for_shadow_text_visible(text, selector, timeout)
60946111
if self.demo_mode:
60956112
a_t = "ASSERT TEXT"
60966113
i_n = "in"
@@ -6115,8 +6132,8 @@ def __assert_shadow_text_visible(self, text, selector):
61156132
except Exception:
61166133
pass
61176134

6118-
def __assert_exact_shadow_text_visible(self, text, selector):
6119-
self.__wait_for_exact_shadow_text_visible(text, selector)
6135+
def __assert_exact_shadow_text_visible(self, text, selector, timeout):
6136+
self.__wait_for_exact_shadow_text_visible(text, selector, timeout)
61206137
if self.demo_mode:
61216138
a_t = "ASSERT EXACT TEXT"
61226139
i_n = "in"
@@ -6185,12 +6202,12 @@ def __is_shadow_attribute_present(self, selector, attribute, value=None):
61856202
except Exception:
61866203
return False
61876204

6188-
def __wait_for_shadow_element_present(self, selector):
6189-
element = self.__get_shadow_element(selector)
6205+
def __wait_for_shadow_element_present(self, selector, timeout):
6206+
element = self.__get_shadow_element(selector, timeout=timeout)
61906207
return element
61916208

6192-
def __wait_for_shadow_element_visible(self, selector):
6193-
element = self.__get_shadow_element(selector)
6209+
def __wait_for_shadow_element_visible(self, selector, timeout):
6210+
element = self.__get_shadow_element(selector, timeout=timeout)
61946211
if not element.is_displayed():
61956212
msg = "Shadow DOM Element {%s} was not visible!" % selector
61966213
page_actions.timeout_exception("NoSuchElementException", msg)
@@ -6495,7 +6512,9 @@ def wait_for_element_visible(
64956512
timeout = self.__get_new_timeout(timeout)
64966513
selector, by = self.__recalculate_selector(selector, by)
64976514
if self.__is_shadow_selector(selector):
6498-
return self.__wait_for_shadow_element_visible(selector)
6515+
return self.__wait_for_shadow_element_visible(
6516+
selector, timeout
6517+
)
64996518
return page_actions.wait_for_element_visible(
65006519
self.driver, selector, by, timeout
65016520
)
@@ -8937,7 +8956,9 @@ def wait_for_element_present(
89378956
timeout = self.__get_new_timeout(timeout)
89388957
selector, by = self.__recalculate_selector(selector, by)
89398958
if self.__is_shadow_selector(selector):
8940-
return self.__wait_for_shadow_element_present(selector)
8959+
return self.__wait_for_shadow_element_present(
8960+
selector, timeout
8961+
)
89418962
return page_actions.wait_for_element_present(
89428963
self.driver, selector, by, timeout
89438964
)
@@ -8952,7 +8973,9 @@ def wait_for_element(self, selector, by=By.CSS_SELECTOR, timeout=None):
89528973
timeout = self.__get_new_timeout(timeout)
89538974
selector, by = self.__recalculate_selector(selector, by)
89548975
if self.__is_shadow_selector(selector):
8955-
return self.__wait_for_shadow_element_visible(selector)
8976+
return self.__wait_for_shadow_element_visible(
8977+
selector, timeout
8978+
)
89568979
return page_actions.wait_for_element_visible(
89578980
self.driver, selector, by, timeout
89588981
)
@@ -9184,7 +9207,9 @@ def wait_for_text_visible(
91849207
timeout = self.__get_new_timeout(timeout)
91859208
selector, by = self.__recalculate_selector(selector, by)
91869209
if self.__is_shadow_selector(selector):
9187-
return self.__wait_for_shadow_text_visible(text, selector)
9210+
return self.__wait_for_shadow_text_visible(
9211+
text, selector, timeout
9212+
)
91889213
return page_actions.wait_for_text_visible(
91899214
self.driver, text, selector, by, timeout
91909215
)
@@ -9199,7 +9224,9 @@ def wait_for_exact_text_visible(
91999224
timeout = self.__get_new_timeout(timeout)
92009225
selector, by = self.__recalculate_selector(selector, by)
92019226
if self.__is_shadow_selector(selector):
9202-
return self.__wait_for_exact_shadow_text_visible(text, selector)
9227+
return self.__wait_for_exact_shadow_text_visible(
9228+
text, selector, timeout
9229+
)
92039230
return page_actions.wait_for_exact_text_visible(
92049231
self.driver, text, selector, by, timeout
92059232
)
@@ -9255,7 +9282,7 @@ def assert_text(
92559282
timeout = self.__get_new_timeout(timeout)
92569283
selector, by = self.__recalculate_selector(selector, by)
92579284
if self.__is_shadow_selector(selector):
9258-
self.__assert_shadow_text_visible(text, selector)
9285+
self.__assert_shadow_text_visible(text, selector, timeout)
92599286
return True
92609287
self.wait_for_text_visible(text, selector, by=by, timeout=timeout)
92619288
if self.demo_mode:
@@ -9301,7 +9328,7 @@ def assert_exact_text(
93019328
timeout = self.__get_new_timeout(timeout)
93029329
selector, by = self.__recalculate_selector(selector, by)
93039330
if self.__is_shadow_selector(selector):
9304-
self.__assert_exact_shadow_text_visible(text, selector)
9331+
self.__assert_exact_shadow_text_visible(text, selector, timeout)
93059332
return True
93069333
self.wait_for_exact_text_visible(
93079334
text, selector, by=by, timeout=timeout

0 commit comments

Comments
 (0)