@@ -225,7 +225,7 @@ def click(
225
225
self.click_partial_link_text(selector, timeout=timeout)
226
226
return
227
227
if self.__is_shadow_selector(selector):
228
- self.__shadow_click(selector)
228
+ self.__shadow_click(selector, timeout )
229
229
return
230
230
element = page_actions.wait_for_element_visible(
231
231
self.driver, selector, by, timeout=timeout
@@ -500,7 +500,7 @@ def update_text(
500
500
timeout = self.__get_new_timeout(timeout)
501
501
selector, by = self.__recalculate_selector(selector, by)
502
502
if self.__is_shadow_selector(selector):
503
- self.__shadow_type(selector, text)
503
+ self.__shadow_type(selector, text, timeout )
504
504
return
505
505
element = self.wait_for_element_visible(
506
506
selector, by=by, timeout=timeout
@@ -577,7 +577,7 @@ def add_text(self, selector, text, by=By.CSS_SELECTOR, timeout=None):
577
577
timeout = self.__get_new_timeout(timeout)
578
578
selector, by = self.__recalculate_selector(selector, by)
579
579
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)
581
581
return
582
582
element = self.wait_for_element_visible(
583
583
selector, by=by, timeout=timeout
@@ -675,7 +675,7 @@ def clear(self, selector, by=By.CSS_SELECTOR, timeout=None):
675
675
timeout = self.__get_new_timeout(timeout)
676
676
selector, by = self.__recalculate_selector(selector, by)
677
677
if self.__is_shadow_selector(selector):
678
- self.__shadow_clear(selector)
678
+ self.__shadow_clear(selector, timeout )
679
679
return
680
680
element = self.wait_for_element_visible(
681
681
selector, by=by, timeout=timeout
@@ -1237,7 +1237,7 @@ def get_text(self, selector, by=By.CSS_SELECTOR, timeout=None):
1237
1237
timeout = self.__get_new_timeout(timeout)
1238
1238
selector, by = self.__recalculate_selector(selector, by)
1239
1239
if self.__is_shadow_selector(selector):
1240
- return self.__get_shadow_text(selector)
1240
+ return self.__get_shadow_text(selector, timeout )
1241
1241
self.wait_for_ready_state_complete()
1242
1242
time.sleep(0.01)
1243
1243
element = page_actions.wait_for_element_visible(
@@ -1272,7 +1272,9 @@ def get_attribute(
1272
1272
self.wait_for_ready_state_complete()
1273
1273
time.sleep(0.01)
1274
1274
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
+ )
1276
1278
element = page_actions.wait_for_element_present(
1277
1279
self.driver, selector, by, timeout
1278
1280
)
@@ -5954,8 +5956,19 @@ def __get_shadow_element(self, selector, timeout=None):
5954
5956
and self.is_chromium()
5955
5957
and int(self.__get_major_browser_version()) >= 96
5956
5958
):
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)
5959
5972
else:
5960
5973
element = page_actions.wait_for_element_present(
5961
5974
shadow_root,
@@ -5985,12 +5998,12 @@ def __is_shadow_selector(self, selector):
5985
5998
return True
5986
5999
return False
5987
6000
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 )
5990
6003
element.click()
5991
6004
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 )
5994
6007
if clear_first:
5995
6008
try:
5996
6009
element.clear()
@@ -6010,29 +6023,31 @@ def __shadow_type(self, selector, text, clear_first=True):
6010
6023
if settings.WAIT_FOR_RSC_ON_PAGE_LOADS:
6011
6024
self.wait_for_ready_state_complete()
6012
6025
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 )
6015
6028
try:
6016
6029
element.clear()
6017
6030
backspaces = Keys.BACK_SPACE * 42 # Autofill Defense
6018
6031
element.send_keys(backspaces)
6019
6032
except Exception:
6020
6033
pass
6021
6034
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 )
6024
6037
return element.text
6025
6038
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 )
6028
6041
return element.get_attribute(attribute)
6029
6042
6030
- def __wait_for_shadow_text_visible(self, text, selector):
6043
+ def __wait_for_shadow_text_visible(self, text, selector, timeout ):
6031
6044
start_ms = time.time() * 1000.0
6032
6045
stop_ms = start_ms + (settings.SMALL_TIMEOUT * 1000.0)
6033
6046
for x in range(int(settings.SMALL_TIMEOUT * 10)):
6034
6047
try:
6035
- actual_text = self.__get_shadow_text(selector).strip()
6048
+ actual_text = self.__get_shadow_text(
6049
+ selector, timeout=1
6050
+ ).strip()
6036
6051
text = text.strip()
6037
6052
if text not in actual_text:
6038
6053
msg = (
@@ -6048,7 +6063,7 @@ def __wait_for_shadow_text_visible(self, text, selector):
6048
6063
if now_ms >= stop_ms:
6049
6064
break
6050
6065
time.sleep(0.1)
6051
- actual_text = self.__get_shadow_text(selector).strip()
6066
+ actual_text = self.__get_shadow_text(selector, timeout=1 ).strip()
6052
6067
text = text.strip()
6053
6068
if text not in actual_text:
6054
6069
msg = "Expected text {%s} in element {%s} was not visible!" % (
@@ -6058,12 +6073,14 @@ def __wait_for_shadow_text_visible(self, text, selector):
6058
6073
page_actions.timeout_exception("ElementNotVisibleException", msg)
6059
6074
return True
6060
6075
6061
- def __wait_for_exact_shadow_text_visible(self, text, selector):
6076
+ def __wait_for_exact_shadow_text_visible(self, text, selector, timeout ):
6062
6077
start_ms = time.time() * 1000.0
6063
6078
stop_ms = start_ms + (settings.SMALL_TIMEOUT * 1000.0)
6064
6079
for x in range(int(settings.SMALL_TIMEOUT * 10)):
6065
6080
try:
6066
- actual_text = self.__get_shadow_text(selector).strip()
6081
+ actual_text = self.__get_shadow_text(
6082
+ selector, timeout=1
6083
+ ).strip()
6067
6084
text = text.strip()
6068
6085
if text != actual_text:
6069
6086
msg = (
@@ -6079,7 +6096,7 @@ def __wait_for_exact_shadow_text_visible(self, text, selector):
6079
6096
if now_ms >= stop_ms:
6080
6097
break
6081
6098
time.sleep(0.1)
6082
- actual_text = self.__get_shadow_text(selector).strip()
6099
+ actual_text = self.__get_shadow_text(selector, timeout=1 ).strip()
6083
6100
text = text.strip()
6084
6101
if text != actual_text:
6085
6102
msg = (
@@ -6089,8 +6106,8 @@ def __wait_for_exact_shadow_text_visible(self, text, selector):
6089
6106
page_actions.timeout_exception("ElementNotVisibleException", msg)
6090
6107
return True
6091
6108
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 )
6094
6111
if self.demo_mode:
6095
6112
a_t = "ASSERT TEXT"
6096
6113
i_n = "in"
@@ -6115,8 +6132,8 @@ def __assert_shadow_text_visible(self, text, selector):
6115
6132
except Exception:
6116
6133
pass
6117
6134
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 )
6120
6137
if self.demo_mode:
6121
6138
a_t = "ASSERT EXACT TEXT"
6122
6139
i_n = "in"
@@ -6185,12 +6202,12 @@ def __is_shadow_attribute_present(self, selector, attribute, value=None):
6185
6202
except Exception:
6186
6203
return False
6187
6204
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 )
6190
6207
return element
6191
6208
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 )
6194
6211
if not element.is_displayed():
6195
6212
msg = "Shadow DOM Element {%s} was not visible!" % selector
6196
6213
page_actions.timeout_exception("NoSuchElementException", msg)
@@ -6495,7 +6512,9 @@ def wait_for_element_visible(
6495
6512
timeout = self.__get_new_timeout(timeout)
6496
6513
selector, by = self.__recalculate_selector(selector, by)
6497
6514
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
+ )
6499
6518
return page_actions.wait_for_element_visible(
6500
6519
self.driver, selector, by, timeout
6501
6520
)
@@ -8937,7 +8956,9 @@ def wait_for_element_present(
8937
8956
timeout = self.__get_new_timeout(timeout)
8938
8957
selector, by = self.__recalculate_selector(selector, by)
8939
8958
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
+ )
8941
8962
return page_actions.wait_for_element_present(
8942
8963
self.driver, selector, by, timeout
8943
8964
)
@@ -8952,7 +8973,9 @@ def wait_for_element(self, selector, by=By.CSS_SELECTOR, timeout=None):
8952
8973
timeout = self.__get_new_timeout(timeout)
8953
8974
selector, by = self.__recalculate_selector(selector, by)
8954
8975
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
+ )
8956
8979
return page_actions.wait_for_element_visible(
8957
8980
self.driver, selector, by, timeout
8958
8981
)
@@ -9184,7 +9207,9 @@ def wait_for_text_visible(
9184
9207
timeout = self.__get_new_timeout(timeout)
9185
9208
selector, by = self.__recalculate_selector(selector, by)
9186
9209
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
+ )
9188
9213
return page_actions.wait_for_text_visible(
9189
9214
self.driver, text, selector, by, timeout
9190
9215
)
@@ -9199,7 +9224,9 @@ def wait_for_exact_text_visible(
9199
9224
timeout = self.__get_new_timeout(timeout)
9200
9225
selector, by = self.__recalculate_selector(selector, by)
9201
9226
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
+ )
9203
9230
return page_actions.wait_for_exact_text_visible(
9204
9231
self.driver, text, selector, by, timeout
9205
9232
)
@@ -9255,7 +9282,7 @@ def assert_text(
9255
9282
timeout = self.__get_new_timeout(timeout)
9256
9283
selector, by = self.__recalculate_selector(selector, by)
9257
9284
if self.__is_shadow_selector(selector):
9258
- self.__assert_shadow_text_visible(text, selector)
9285
+ self.__assert_shadow_text_visible(text, selector, timeout )
9259
9286
return True
9260
9287
self.wait_for_text_visible(text, selector, by=by, timeout=timeout)
9261
9288
if self.demo_mode:
@@ -9301,7 +9328,7 @@ def assert_exact_text(
9301
9328
timeout = self.__get_new_timeout(timeout)
9302
9329
selector, by = self.__recalculate_selector(selector, by)
9303
9330
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 )
9305
9332
return True
9306
9333
self.wait_for_exact_text_visible(
9307
9334
text, selector, by=by, timeout=timeout
0 commit comments