我正在尝试点击python.org导航菜单上的所有元素。我的代码运行没有任何错误,但只点击了“community”元素。这是我的代码:
driver = webdriver.Chrome("/Users/drao/Documents/chromedriver")
driver.get("http://www.python.org")
driver.maximize_window()
#finds all elements under mainnav (about, downloads, documentation...)
all_elems = driver.find_elements_by_id('mainnav')
for elem in all_elems:
if elem.is_displayed():
elem.click()
这是网页的html
<nav id="mainnav" class="python-navigation main-navigation do-not-print" role="navigation">
答案 0 :(得分:0)
尝试使用以下选择器抓取所有元素:
all_elems = driver.find_elements_by_css_selector('nav.python-navigation ul.navigation li')
请记住,每次单击其中一个元素时,整个页面都会重新加载,您可能会遇到StaleElementExceptions
答案 1 :(得分:0)
只有一个ID为mainnav
的元素,因此您的代码在技术上正常运行。它抓住一个元素并单击它,然后退出。我想点击会落到DOM中的第一个可点击元素。
要获取所有可点击的标签,您需要使用其他方法。这是一个使用CSS路径(这是未经测试的):
driver = webdriver.Chrome("/Users/drao/Documents/chromedriver")
driver.get("http://www.python.org")
driver.maximize_window()
#finds all elements under mainnav (about, downloads, documentation...)
all_elems = driver.find_elements_by_css_selector('nav#mainnav > ul > li')
for elem in all_elems:
if elem.is_displayed():
elem.click()
我不认为^^^实际上会工作,因为click()
会重新加载页面,所以你找到的所有元素在第一次点击后都会过时。
您可以使用nth-of-type
技术仅在需要时获取每个元素并单击它(已测试并正常工作):
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.python.org")
driver.maximize_window()
try:
#finds all elements under mainnav (about, downloads, documentation...)
all_elems = driver.find_elements_by_css_selector('nav#mainnav > ul > li')
# all_elems is now only useful as a count of all the elems on the screen
for index, _ in enumerate(all_elems, 1):
css_path = "nav#mainnav > ul > li:nth-of-type({0})"
elem = driver.find_element_by_css_selector(css_path.format(index))
if elem.is_displayed():
elem.click()
finally:
driver.close()