Skip to content

Commit a816082

Browse files
committed
Improve Shadow DOM compatibility
1 parent b4080d5 commit a816082

File tree

1 file changed

+37
-20
lines changed

1 file changed

+37
-20
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5923,14 +5923,21 @@ def __get_shadow_element(self, selector, timeout=None):
59235923
chromedriver_version = chrome_dr_version.split(" ")[0]
59245924
major_c_dr_version = chromedriver_version.split(".")[0]
59255925
if int(major_c_dr_version) < 96:
5926+
upgrade_to = "latest"
5927+
major_browser_version = (
5928+
self.__get_major_browser_version()
5929+
)
5930+
if int(major_browser_version) >= 96:
5931+
upgrade_to = str(major_browser_version)
59265932
message = (
5927-
"You need to upgrade to a newer version of "
5928-
"chromedriver to interact with Shadow root "
5929-
"elements!\n(Current driver version is: %s)"
5933+
"You need to upgrade to a newer\n"
5934+
"version of chromedriver to interact\n"
5935+
"with Shadow root elements!\n"
5936+
"(Current driver version is: %s)"
59305937
"\n(Minimum driver version is: 96.*)"
5931-
"\nTo upgrade: "
5932-
'"seleniumbase install chromedriver latest"'
5933-
% chromedriver_version
5938+
"\nTo upgrade, run this:"
5939+
'\n"seleniumbase install chromedriver %s"'
5940+
% (chromedriver_version, upgrade_to)
59345941
)
59355942
raise Exception(message)
59365943
if timeout != 0.1: # Skip wait for special 0.1 (See above)
@@ -5947,9 +5954,15 @@ def __get_shadow_element(self, selector, timeout=None):
59475954
# Firefox users will likely hit:
59485955
# https://github.com/mozilla/geckodriver/issues/1711
59495956
# When Firefox adds support, switch to element.shadow_root
5950-
shadow_root = self.execute_script(
5951-
"return arguments[0].shadowRoot", element
5952-
)
5957+
try:
5958+
shadow_root = self.execute_script(
5959+
"return arguments[0].shadowRoot", element
5960+
)
5961+
except Exception:
5962+
time.sleep(2)
5963+
shadow_root = self.execute_script(
5964+
"return arguments[0].shadowRoot", element
5965+
)
59535966
if timeout == 0.1 and not shadow_root:
59545967
raise Exception(
59555968
"Element {%s} has no shadow root!" % selector_chain
@@ -5971,19 +5984,23 @@ def __get_shadow_element(self, selector, timeout=None):
59715984
and self.is_chromium()
59725985
and int(self.__get_major_browser_version()) >= 96
59735986
):
5974-
found = False
5975-
for i in range(int(timeout) * 3):
5976-
try:
5977-
element = shadow_root.find_element(
5978-
By.CSS_SELECTOR, value=selector_part)
5979-
found = True
5980-
break
5981-
except Exception:
5982-
time.sleep(0.2)
5983-
continue
5984-
if not found:
5987+
if timeout == 0.1:
59855988
element = shadow_root.find_element(
59865989
By.CSS_SELECTOR, value=selector_part)
5990+
else:
5991+
found = False
5992+
for i in range(int(timeout) * 4):
5993+
try:
5994+
element = shadow_root.find_element(
5995+
By.CSS_SELECTOR, value=selector_part)
5996+
found = True
5997+
break
5998+
except Exception:
5999+
time.sleep(0.2)
6000+
continue
6001+
if not found:
6002+
element = shadow_root.find_element(
6003+
By.CSS_SELECTOR, value=selector_part)
59876004
else:
59886005
element = page_actions.wait_for_element_present(
59896006
shadow_root,

0 commit comments

Comments
 (0)