Skip to content

Commit 4911f8a

Browse files
committed
Update code for Shadow DOM changes in Chromium 96+
1 parent e20ffe2 commit 4911f8a

File tree

1 file changed

+68
-9
lines changed

1 file changed

+68
-9
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 68 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ def test_anything(self):
6868
if sys.version_info[0] < 3:
6969
reload(sys) # noqa: F821
7070
sys.setdefaultencoding("utf8")
71+
selenium4 = False
72+
if sys.version_info[0] == 3 and sys.version_info[1] >= 7:
73+
selenium4 = True
7174

7275

7376
class BaseCase(unittest.TestCase):
@@ -5736,9 +5739,48 @@ def __get_shadow_element(self, selector, timeout=None):
57365739
element = self.get_element(selectors[0])
57375740
selector_chain = selectors[0]
57385741
for selector_part in selectors[1:]:
5739-
shadow_root = self.execute_script(
5740-
"return arguments[0].shadowRoot", element
5741-
)
5742+
shadow_root = None
5743+
if (
5744+
selenium4
5745+
and self.is_chromium()
5746+
and int(self.__get_major_browser_version()) >= 96
5747+
):
5748+
try:
5749+
shadow_root = element.shadow_root
5750+
except Exception:
5751+
if self.browser == "chrome":
5752+
chrome_dict = self.driver.capabilities["chrome"]
5753+
chrome_dr_version = chrome_dict["chromedriverVersion"]
5754+
chromedriver_version = chrome_dr_version.split(" ")[0]
5755+
major_c_dr_version = chromedriver_version.split(".")[0]
5756+
if int(major_c_dr_version) < 96:
5757+
message = (
5758+
"You need to upgrade to a newer version of "
5759+
"chromedriver to interact with Shadow root "
5760+
"elements!\n(Current driver version is: %s)"
5761+
"\n(Minimum driver version is: 96.*)"
5762+
"\nTo upgrade: "
5763+
'"seleniumbase install chromedriver latest"'
5764+
% chromedriver_version
5765+
)
5766+
raise Exception(message)
5767+
if timeout != 0.1: # Skip wait for special 0.1 (See above)
5768+
time.sleep(2)
5769+
try:
5770+
shadow_root = element.shadow_root
5771+
except Exception:
5772+
raise Exception(
5773+
"Element {%s} has no shadow root!" % selector_chain
5774+
)
5775+
else: # This part won't work on Chrome 96 or newer.
5776+
# If using Chrome 96 or newer (and on an old Python version),
5777+
# you'll need to upgrade in order to access Shadow roots.
5778+
# Firefox users will likely hit:
5779+
# https://github.com/mozilla/geckodriver/issues/1711
5780+
# When Firefox adds support, switch to element.shadow_root
5781+
shadow_root = self.execute_script(
5782+
"return arguments[0].shadowRoot", element
5783+
)
57425784
if timeout == 0.1 and not shadow_root:
57435785
raise Exception(
57445786
"Element {%s} has no shadow root!" % selector_chain
@@ -5755,12 +5797,20 @@ def __get_shadow_element(self, selector, timeout=None):
57555797
selector_chain += "::shadow "
57565798
selector_chain += selector_part
57575799
try:
5758-
element = page_actions.wait_for_element_present(
5759-
shadow_root,
5760-
selector_part,
5761-
by=By.CSS_SELECTOR,
5762-
timeout=timeout,
5763-
)
5800+
if (
5801+
selenium4
5802+
and self.is_chromium()
5803+
and int(self.__get_major_browser_version()) >= 96
5804+
):
5805+
element = shadow_root.find_element(
5806+
By.CSS_SELECTOR, value=selector_part)
5807+
else:
5808+
element = page_actions.wait_for_element_present(
5809+
shadow_root,
5810+
selector_part,
5811+
by=By.CSS_SELECTOR,
5812+
timeout=timeout,
5813+
)
57645814
except Exception:
57655815
msg = (
57665816
"Shadow DOM Element {%s} was not present after %s seconds!"
@@ -10101,6 +10151,15 @@ def __jquery_click(self, selector, by=By.CSS_SELECTOR):
1010110151
click_script = """jQuery('%s')[0].click();""" % selector
1010210152
self.safe_execute_script(click_script)
1010310153

10154+
def __get_major_browser_version(self):
10155+
try:
10156+
version = self.driver.__dict__["caps"]["browserVersion"]
10157+
except Exception:
10158+
version = self.driver.__dict__["caps"]["version"]
10159+
self.driver.__dict__["caps"]["browserVersion"] = version
10160+
major_browser_version = version.split(".")[0]
10161+
return major_browser_version
10162+
1010410163
def __get_href_from_link_text(self, link_text, hard_fail=True):
1010510164
href = self.get_link_attribute(link_text, "href", hard_fail)
1010610165
if not href:

0 commit comments

Comments
 (0)