@@ -68,6 +68,9 @@ def test_anything(self):
68
68
if sys .version_info [0 ] < 3 :
69
69
reload (sys ) # noqa: F821
70
70
sys .setdefaultencoding ("utf8" )
71
+ selenium4 = False
72
+ if sys .version_info [0 ] == 3 and sys .version_info [1 ] >= 7 :
73
+ selenium4 = True
71
74
72
75
73
76
class BaseCase (unittest .TestCase ):
@@ -5736,9 +5739,48 @@ def __get_shadow_element(self, selector, timeout=None):
5736
5739
element = self .get_element (selectors [0 ])
5737
5740
selector_chain = selectors [0 ]
5738
5741
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
+ "\n To 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
+ )
5742
5784
if timeout == 0.1 and not shadow_root :
5743
5785
raise Exception (
5744
5786
"Element {%s} has no shadow root!" % selector_chain
@@ -5755,12 +5797,20 @@ def __get_shadow_element(self, selector, timeout=None):
5755
5797
selector_chain += "::shadow "
5756
5798
selector_chain += selector_part
5757
5799
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
+ )
5764
5814
except Exception :
5765
5815
msg = (
5766
5816
"Shadow DOM Element {%s} was not present after %s seconds!"
@@ -10101,6 +10151,15 @@ def __jquery_click(self, selector, by=By.CSS_SELECTOR):
10101
10151
click_script = """jQuery('%s')[0].click();""" % selector
10102
10152
self .safe_execute_script (click_script )
10103
10153
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
+
10104
10163
def __get_href_from_link_text (self , link_text , hard_fail = True ):
10105
10164
href = self .get_link_attribute (link_text , "href" , hard_fail )
10106
10165
if not href :
0 commit comments