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

Python中使用Selenium获取下拉菜单数据的最优方法是什么?

问题原因

  • 点击日期筛选的apply按钮后,你没有等待活动日志列表完成异步加载就直接执行查找逻辑,此时对应DOM节点还未渲染完成,自然找不到目标元素。
  • 你当前大量使用绝对路径XPath选择器,页面结构稍有变动就会失效,同时也没有处理iframe场景:如果活动日志区域被包裹在独立的iframe标签中,需要先切换到对应iframe上下文才能定位到内部元素。
  • 硬等待time.sleep()容错率极低,网络波动、页面渲染速度变化都很容易导致操作失败。

优化实现方案

替换硬等待为Selenium显式等待,同时改用更稳定的属性匹配选择器,修改后代码如下:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver = webdriver.Chrome(executable_path='C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe')
driver.get('https://app.smartsheet.com/sheets/Phfqpp2qpvrfjw9jPggm8fRfWgqgj2mgXv5xjh71?view=grid')
wait = WebDriverWait(driver, 20) # 最长等待20秒,满足条件就提前执行

# 登录流程改用显式等待+属性匹配,兼容性更强
email = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@type="email"]')))
email.send_keys('USERNAME')
email.send_keys(Keys.RETURN)

password = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@type="password"]')))
password.send_keys('PASSWORD')
password.send_keys(Keys.RETURN)

# 等待活动日志按钮可点击
activity_log = wait.until(EC.element_to_be_clickable((By.XPATH, '//button[contains(@aria-label, "Activity Log")]')))
activity_log.click()

# 等待日期输入框加载完成
start_date = wait.until(EC.presence_of_element_located((By.XPATH, '//input[contains(@placeholder, "Start Date")]')))
start_date.clear()
start_date.send_keys('06/07/21')

apply = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[text()="Apply"]')))
apply.click()

# 若活动日志在iframe中,先取消下一行的注释、替换为对应iframe的定位规则
# wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[id*=activity-log]")))

# 等待所有可展开菜单元素加载完成
entries = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'clsHistoryItemCaret')))
print(f"找到可展开菜单数量:{len(entries)}")

# 遍历点击展开、提取内容即可
for entry in entries:
    entry.click()
    # 此处可添加等待展开内容加载的逻辑,再提取所需信息

排查补充

如果修改后仍找不到元素,可以手动打开浏览器调试工具,在控制台执行document.getElementsByClassName('clsHistoryItemCaret'):

  • 若返回空列表,说明类名存在动态后缀、或者元素处于Shadow DOM中,可改用CSS选择器[class*=clsHistoryItemCaret]进行模糊匹配
  • 若返回有值,说明是等待时长不足,适当调高超时时间即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 20:03:01