You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法定位并点击ul下拉列表中的li元素问题求助

问题:无法定位下拉列表中的“Last Month”元素

我尝试点击ul下拉列表中的li元素选择“Last Month”选项时,遇到错误:

Message: no such element: Unable to locate element

我的代码如下:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 假设msgbox为弹窗函数,省略导入

def click_on(xpath):
    timeout = time.time() + 30
    while True:
        try:
            driver.find_element(By.XPATH, xpath).click()
            break
        except Exception:
            if time.time() > timeout:
                msgbox('Process timed out after 30 seconds.', 'Error')
                exit()

click_on('//*[@id="popover_otrppv916b"]/div/div[2]/div[1]/div/div/div/div/ul/li[9]/div/span')

对应的HTML结构截图:
HTML结构截图

我也尝试过仅点击

标签和
  • 标签(而非标签),但仍出现相同错误。


    解决方法
    • 放弃动态ID定位:你用的popover_otrppv916b是动态生成的ID,页面刷新后会变化,直接导致XPATH失效。改用基于文本或固定属性的定位方式,比如:

      # 匹配包含"Last Month"文本的span元素
      click_on('//ul[contains(@class, "dropdown-menu")]/li//span[text()="Last Month"]')
      

      或者通过父元素的固定class定位:

      click_on('//ul[@class="dropdown-menu show"]/li[.//span[text()="Last Month"]]')
      
    • 先展开下拉列表:很多下拉列表需要先点击触发按钮,让ul列表显示出来才能定位内部元素。先添加触发步骤:

      # 先点击下拉触发按钮(替换成实际触发按钮的XPATH)
      click_on('//div[contains(@class, "daterangepicker")]/div[1]/div/button')
      # 等待列表展开(也可以用显式等待替代sleep)
      time.sleep(1)
      # 再点击目标选项
      click_on('//li//span[text()="Last Month"]')
      
    • 用显式等待替代循环重试:Selenium自带的WebDriverWait比手写循环更可靠,能等待元素进入可点击状态:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      def click_on(xpath):
          try:
              element = WebDriverWait(driver, 30).until(
                  EC.element_to_be_clickable((By.XPATH, xpath))
              )
              element.click()
          except Exception:
              msgbox('Process timed out after 30 seconds.', 'Error')
              exit()
      
    • 检查是否存在iframe:如果目标元素嵌套在iframe里,必须先切换到iframe才能定位:

      # 替换成实际的iframe定位方式(ID/XPATH等)
      iframe = driver.find_element(By.ID, "iframe-id")
      driver.switch_to.frame(iframe)
      # 执行点击操作
      click_on('//li//span[text()="Last Month"]')
      # 操作完成后切回主文档
      driver.switch_to.default_content()
      

    内容的提问来源于stack exchange,提问作者Mitch Frei

  • 相关产品推荐
    方舟 Agent Plan

    超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

    最近更新时间:2026.08.01 19:35:20