Skip to content

Commit 9301afd

Browse files
committed
Add js_click_all() and jquery_click_all()
1 parent 6e40a0b commit 9301afd

File tree

2 files changed

+49
-4
lines changed

2 files changed

+49
-4
lines changed

help_docs/method_summary.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,10 +184,14 @@ self.slow_scroll_to(selector, by=By.CSS_SELECTOR)
184184

185185
self.click_xpath(xpath)
186186

187-
self.js_click(selector, by=By.CSS_SELECTOR)
187+
self.js_click(selector, by=By.CSS_SELECTOR, all_matches=False)
188+
189+
self.js_click_all(selector, by=By.CSS_SELECTOR)
188190

189191
self.jquery_click(selector, by=By.CSS_SELECTOR)
190192

193+
self.jquery_click_all(selector, by=By.CSS_SELECTOR)
194+
191195
self.hide_element(selector, by=By.CSS_SELECTOR)
192196

193197
self.hide_elements(selector, by=By.CSS_SELECTOR)

seleniumbase/fixtures/base_case.py

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)