Python 单击菜单上的所有元素

Python 单击菜单上的所有元素,python,html,selenium,pycharm,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, docu

我试图单击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">

尝试使用以下选择器抓取所有元素:

all_elems = driver.find_elements_by_css_selector('nav.python-navigation ul.navigation li')

请记住,每次单击其中一个元素时,整个页面都会重新加载,您可能会遇到StaleElementExceptions

尝试使用以下选择器获取所有元素:

all_elems = driver.find_elements_by_css_selector('nav.python-navigation ul.navigation li')

请记住,每次单击其中一个元素时,整个页面都会重新加载,您可能会遇到StaleElementExceptions,因为只有一个元素的ID为mainnav,因此您的代码在技术上工作正常。它抓取一个元素并单击它,然后退出。我猜点击会落在DOM中第一个可点击的元素上

要获得所有可单击的选项卡,您需要使用不同的方法。下面是一个使用CSS路径的路径(未经测试):

但是我认为^^^^实际上不起作用,因为
click()
会重新加载页面,所以您会发现的所有元素在第一次单击后都会过时

相反,您可以利用
nth of type
技术仅在需要时获取每个元素,然后单击它(测试并工作):


只有一个元素的ID
mainnav
,因此您的代码在技术上工作正常。它抓取一个元素并单击它,然后退出。我猜点击会落在DOM中第一个可点击的元素上

要获得所有可单击的选项卡,您需要使用不同的方法。下面是一个使用CSS路径的路径(未经测试):

但是我认为^^^^实际上不起作用,因为
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()