Skip to content

Commit 82d9a67

Browse files
authored
Merge pull request #430 from seleniumbase/add-click-nth-visible-element
Add click_nth_visible_element(selector, number, by=By.CSS_SELECTOR)
2 parents b562ddc + 9641c14 commit 82d9a67

File tree

5 files changed

+44
-2
lines changed

5 files changed

+44
-2
lines changed

help_docs/method_summary.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ self.find_visible_elements(selector, by=By.CSS_SELECTOR, limit=0)
100100

101101
self.click_visible_elements(selector, by=By.CSS_SELECTOR, limit=0)
102102

103+
self.click_nth_visible_element(selector, number, by=By.CSS_SELECTOR)
104+
103105
self.click_if_visible(selector, by=By.CSS_SELECTOR)
104106

105107
self.is_element_in_an_iframe(selector, by=By.CSS_SELECTOR)

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pip>=19.3.1
2-
setuptools>=42.0.0
2+
setuptools>=42.0.1
33
setuptools-scm>=3.3.3
44
wheel>=0.33.6
55
six>=1.13.0

seleniumbase/console_scripts/run.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def show_usage():
4242
def show_basic_usage():
4343
seleniumbase_logo = logo_helper.get_seleniumbase_logo()
4444
print(seleniumbase_logo)
45+
print("%s" % get_version()[0:1])
4546
print("")
4647
print('Usage: "seleniumbase [COMMAND] [PARAMETERS]"')
4748
print("Commands:")
@@ -256,6 +257,16 @@ def show_grid_node_usage():
256257
print("")
257258

258259

260+
def get_version():
261+
import pkg_resources
262+
return pkg_resources.require("seleniumbase")[0:1]
263+
264+
265+
def show_version_info():
266+
version = get_version()
267+
print('\n%s\n' % version)
268+
269+
259270
def show_detailed_help():
260271
show_basic_usage()
261272
print("More Info:")
@@ -359,6 +370,11 @@ def main():
359370
else:
360371
show_basic_usage()
361372
show_grid_node_usage()
373+
elif command == "version" or command == "--version":
374+
if len(command_args) == 0:
375+
show_version_info()
376+
else:
377+
show_basic_usage()
362378
elif command == "help" or command == "--help":
363379
if len(command_args) >= 1:
364380
if command_args[0] == "install":

seleniumbase/fixtures/base_case.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,7 @@ def find_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
947947
""" Returns a list of matching WebElements.
948948
If "limit" is set and > 0, will only return that many elements. """
949949
self.wait_for_ready_state_complete()
950+
time.sleep(0.05)
950951
selector, by = self.__recalculate_selector(selector, by)
951952
elements = self.driver.find_elements(by=by, value=selector)
952953
if limit and limit > 0 and len(elements) > limit:
@@ -957,6 +958,7 @@ def find_visible_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
957958
""" Returns a list of matching WebElements that are visible.
958959
If "limit" is set and > 0, will only return that many elements. """
959960
self.wait_for_ready_state_complete()
961+
time.sleep(0.05)
960962
selector, by = self.__recalculate_selector(selector, by)
961963
v_elems = page_actions.find_visible_elements(self.driver, selector, by)
962964
if limit and limit > 0 and len(v_elems) > limit:
@@ -999,6 +1001,28 @@ def click_visible_elements(self, selector, by=By.CSS_SELECTOR, limit=0):
9991001
except (StaleElementReferenceException, ENI_Exception):
10001002
return # Probably on new page / Elements are all stale
10011003

1004+
def click_nth_visible_element(self, selector, number, by=By.CSS_SELECTOR):
1005+
""" Finds all matching page elements and clicks the nth visible one.
1006+
Example: self.click_nth_visible_element('[type="checkbox"]', 5)
1007+
(Clicks the 5th visible checkbox on the page.) """
1008+
elements = self.find_visible_elements(selector, by=by)
1009+
if len(elements) < number:
1010+
raise Exception("Not enough matching {%s} elements of type {%s} to"
1011+
" click number %s!" % (selector, by, number))
1012+
number = number - 1
1013+
if number < 0:
1014+
number = 0
1015+
element = elements[number]
1016+
self.wait_for_ready_state_complete()
1017+
try:
1018+
self.__scroll_to_element(element)
1019+
element.click()
1020+
except (StaleElementReferenceException, ENI_Exception):
1021+
self.wait_for_ready_state_complete()
1022+
time.sleep(0.05)
1023+
self.__scroll_to_element(element)
1024+
element.click()
1025+
10021026
def click_if_visible(self, selector, by=By.CSS_SELECTOR):
10031027
""" If the page selector exists and is visible, clicks on the element.
10041028
This method only clicks on the first matching element found.

setup.py

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

4646
setup(
4747
name='seleniumbase',
48-
version='1.33.5',
48+
version='1.33.6',
4949
description='Fast, Easy, and Reliable Browser Automation & Testing.',
5050
long_description=long_description,
5151
long_description_content_type='text/markdown',

0 commit comments

Comments
 (0)