【问题标题】:Python Selenium Clicking All Elements on a MenuPython Selenium 单击菜单上的所有元素
【发布时间】:2016-11-14 23:52:43
【问题描述】:

我正在尝试单击 python.org 导航菜单上的所有元素。我的代码运行没有任何错误,但只点击了“社区”元素。这是我的代码:

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">

【问题讨论】:

    标签: python html selenium pycharm


    【解决方案1】:

    只有一个 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()
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2012-09-05
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多