@@ -1545,8 +1545,9 @@ def click_xpath(self, xpath):
15451545 # so self.click_xpath() is just a longer name for the same action.
15461546 self .click (xpath , by = By .XPATH )
15471547
1548- def js_click (self , selector , by = By .CSS_SELECTOR ):
1549- """ Clicks an element using pure JS. Does not use jQuery. """
1548+ def js_click (self , selector , by = By .CSS_SELECTOR , all_matches = False ):
1549+ """ Clicks an element using pure JS. Does not use jQuery.
1550+ If "all_matches" is False, only the first match is clicked. """
15501551 selector , by = self .__recalculate_selector (selector , by )
15511552 if by == By .LINK_TEXT :
15521553 message = (
@@ -1566,9 +1567,16 @@ def js_click(self, selector, by=By.CSS_SELECTOR):
15661567 css_selector = self .convert_to_css_selector (selector , by = by )
15671568 css_selector = re .escape (css_selector )
15681569 css_selector = self .__escape_quotes_if_needed (css_selector )
1569- self .__js_click (selector , by = by ) # The real "magic" happens here
1570+ if not all_matches :
1571+ self .__js_click (selector , by = by ) # The real "magic" happens
1572+ else :
1573+ self .__js_click_all (selector , by = by ) # The real "magic" happens
15701574 self .__demo_mode_pause_if_active ()
15711575
1576+ def js_click_all (self , selector , by = By .CSS_SELECTOR ):
1577+ """ Clicks all matching elements using pure JS. (No jQuery) """
1578+ self .js_click (selector , by = By .CSS_SELECTOR , all_matches = True )
1579+
15721580 def jquery_click (self , selector , by = By .CSS_SELECTOR ):
15731581 """ Clicks an element using jQuery. Different from using pure JS. """
15741582 selector , by = self .__recalculate_selector (selector , by )
@@ -1582,6 +1590,18 @@ def jquery_click(self, selector, by=By.CSS_SELECTOR):
15821590 self .safe_execute_script (click_script )
15831591 self .__demo_mode_pause_if_active ()
15841592
1593+ def jquery_click_all (self , selector , by = By .CSS_SELECTOR ):
1594+ """ Clicks all matching elements using jQuery. """
1595+ selector , by = self .__recalculate_selector (selector , by )
1596+ self .wait_for_element_present (
1597+ selector , by = by , timeout = settings .SMALL_TIMEOUT )
1598+ if self .is_element_visible (selector , by = by ):
1599+ self .__demo_mode_highlight_if_active (selector , by )
1600+ selector = self .convert_to_css_selector (selector , by = by )
1601+ click_script = """jQuery('%s').click()""" % selector
1602+ self .safe_execute_script (click_script )
1603+ self .__demo_mode_pause_if_active ()
1604+
15851605 def hide_element (self , selector , by = By .CSS_SELECTOR ):
15861606 """ Hide the first element on the page that matches the selector. """
15871607 selector , by = self .__recalculate_selector (selector , by )
@@ -3273,6 +3293,27 @@ def __js_click(self, selector, by=By.CSS_SELECTOR):
32733293 % css_selector )
32743294 self .execute_script (script )
32753295
3296+ def __js_click_all (self , selector , by = By .CSS_SELECTOR ):
3297+ """ Clicks all matching elements using pure JS. (No jQuery) """
3298+ selector , by = self .__recalculate_selector (selector , by )
3299+ css_selector = self .convert_to_css_selector (selector , by = by )
3300+ css_selector = re .escape (css_selector )
3301+ css_selector = self .__escape_quotes_if_needed (css_selector )
3302+ script = ("""var simulateClick = function (elem) {
3303+ var evt = new MouseEvent('click', {
3304+ bubbles: true,
3305+ cancelable: true,
3306+ view: window
3307+ });
3308+ var canceled = !elem.dispatchEvent(evt);
3309+ };
3310+ var $elements = document.querySelectorAll('%s');
3311+ var index = 0, length = $elements.length;
3312+ for(; index < length; index++){
3313+ simulateClick($elements[index]);}"""
3314+ % css_selector )
3315+ self .execute_script (script )
3316+
32763317 def __jquery_click (self , selector , by = By .CSS_SELECTOR ):
32773318 """ Clicks an element using jQuery. Different from using pure JS. """
32783319 selector , by = self .__recalculate_selector (selector , by )
0 commit comments