@@ -1545,8 +1545,9 @@ def click_xpath(self, xpath):
1545
1545
# so self.click_xpath() is just a longer name for the same action.
1546
1546
self .click (xpath , by = By .XPATH )
1547
1547
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. """
1550
1551
selector , by = self .__recalculate_selector (selector , by )
1551
1552
if by == By .LINK_TEXT :
1552
1553
message = (
@@ -1566,9 +1567,16 @@ def js_click(self, selector, by=By.CSS_SELECTOR):
1566
1567
css_selector = self .convert_to_css_selector (selector , by = by )
1567
1568
css_selector = re .escape (css_selector )
1568
1569
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
1570
1574
self .__demo_mode_pause_if_active ()
1571
1575
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
+
1572
1580
def jquery_click (self , selector , by = By .CSS_SELECTOR ):
1573
1581
""" Clicks an element using jQuery. Different from using pure JS. """
1574
1582
selector , by = self .__recalculate_selector (selector , by )
@@ -1582,6 +1590,18 @@ def jquery_click(self, selector, by=By.CSS_SELECTOR):
1582
1590
self .safe_execute_script (click_script )
1583
1591
self .__demo_mode_pause_if_active ()
1584
1592
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
+
1585
1605
def hide_element (self , selector , by = By .CSS_SELECTOR ):
1586
1606
""" Hide the first element on the page that matches the selector. """
1587
1607
selector , by = self .__recalculate_selector (selector , by )
@@ -3273,6 +3293,27 @@ def __js_click(self, selector, by=By.CSS_SELECTOR):
3273
3293
% css_selector )
3274
3294
self .execute_script (script )
3275
3295
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
+
3276
3317
def __jquery_click (self , selector , by = By .CSS_SELECTOR ):
3277
3318
""" Clicks an element using jQuery. Different from using pure JS. """
3278
3319
selector , by = self .__recalculate_selector (selector , by )
0 commit comments