Python Selenium单击菜单上的所有元素

时间:2016-07-12 16:04:41

标签: python html selenium pycharm

我正在尝试点击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">

2 个答案:

答案 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()