@@ -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
0 commit comments