Skip to content

Commit 6d5769b

Browse files
authored
Merge pull request #289 from seleniumbase/update-methods
Add limit argument to methods that return or click multiple elements
2 parents df7014c + 4ec07d5 commit 6d5769b

File tree

3 files changed

+27
-13
lines changed

3 files changed

+27
-13
lines changed

help_docs/method_summary.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ self.is_partial_link_text_visible(partial_link_text)
7171

7272
self.is_text_visible(text, selector="html", by=By.CSS_SELECTOR)
7373

74-
self.find_elements(selector, by=By.CSS_SELECTOR)
74+
self.find_elements(selector, by=By.CSS_SELECTOR, limit=0)
7575

76-
self.find_visible_elements(selector, by=By.CSS_SELECTOR)
76+
self.find_visible_elements(selector, by=By.CSS_SELECTOR, limit=0)
7777

78-
self.click_visible_elements(selector, by=By.CSS_SELECTOR)
78+
self.click_visible_elements(selector, by=By.CSS_SELECTOR, limit=0)
7979

8080
self.is_element_in_an_iframe(selector, by=By.CSS_SELECTOR)
8181

seleniumbase/fixtures/base_case.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -640,53 +640,67 @@ def is_text_visible(self, text, selector="html", by=By.CSS_SELECTOR):
640640
by = By.LINK_TEXT
641641
return page_actions.is_text_visible(self.driver, text, selector, by)
642642

643-
def find_elements(self, selector, by=By.CSS_SELECTOR):
644-
""" Returns a list of matching WebElements. """
643+
def find_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
644+
""" Returns a list of matching WebElements.
645+
If "limit" is set and > 0, will only return that many elements. """
645646
self.wait_for_ready_state_complete()
646647
if page_utils.is_xpath_selector(selector):
647648
by = By.XPATH
648649
if page_utils.is_link_text_selector(selector):
649650
selector = page_utils.get_link_text_from_selector(selector)
650651
by = By.LINK_TEXT
651-
return self.driver.find_elements(by=by, value=selector)
652-
653-
def find_visible_elements(self, selector, by=By.CSS_SELECTOR):
654-
""" Returns a list of matching WebElements that are visible. """
652+
elements = self.driver.find_elements(by=by, value=selector)
653+
if limit and limit > 0 and len(elements) > limit:
654+
elements = elements[:limit]
655+
return elements
656+
657+
def find_visible_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
658+
""" Returns a list of matching WebElements that are visible.
659+
If "limit" is set and > 0, will only return that many elements. """
655660
self.wait_for_ready_state_complete()
656661
if page_utils.is_xpath_selector(selector):
657662
by = By.XPATH
658663
if page_utils.is_link_text_selector(selector):
659664
selector = page_utils.get_link_text_from_selector(selector)
660665
by = By.LINK_TEXT
661-
return page_actions.find_visible_elements(self.driver, selector, by)
666+
v_elems = page_actions.find_visible_elements(self.driver, selector, by)
667+
if limit and limit > 0 and len(v_elems) > limit:
668+
v_elems = v_elems[:limit]
669+
return v_elems
662670

663-
def click_visible_elements(self, selector, by=By.CSS_SELECTOR):
671+
def click_visible_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
664672
""" Finds all matching page elements and clicks visible ones in order.
665673
If a click reloads or opens a new page, the clicking will stop.
666674
Works best for actions such as clicking all checkboxes on a page.
667675
Example: self.click_visible_elements('input[type="checkbox"]')
668-
"""
676+
If "limit" is set and > 0, will only click that many elements. """
669677
elements = self.find_elements(selector, by=by)
670678
count = 0
679+
click_count = 0
671680
for element in elements:
681+
if limit and limit > 0 and click_count >= limit:
682+
return
672683
count += 1
673684
if count == 1:
674685
self.wait_for_ready_state_complete()
675686
if self.is_element_visible(selector, by=by):
676687
self.click(selector, by=by)
688+
click_count += 1
677689
else:
678690
self.wait_for_ready_state_complete()
679691
try:
680692
if element.is_displayed():
681693
self.__scroll_to_element(element)
682694
element.click()
695+
click_count += 1
683696
except (StaleElementReferenceException, ENI_Exception):
684697
self.wait_for_ready_state_complete()
685698
time.sleep(0.05)
686699
try:
687700
if element.is_displayed():
688701
self.__scroll_to_element(element)
689702
element.click()
703+
click_count += 1
690704
except (StaleElementReferenceException, ENI_Exception):
691705
return # Probably on new page / Elements are all stale
692706

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
setup(
1919
name='seleniumbase',
20-
version='1.21.0',
20+
version='1.21.1',
2121
description='Reliable Browser Automation & Testing Framework',
2222
long_description=long_description,
2323
long_description_content_type='text/markdown',

0 commit comments

Comments
 (0)