Selenium Python:遍历菜单项并判断Workloads是否展开
定位Workloads菜单并判断展开状态
解决遍历ng-star-inserted元素出错的问题
你循环出错大概率是因为元素未加载完成或者定位范围太广(包含了非菜单项的元素),可以按以下步骤修正:
- 先等待所有菜单项加载完成,避免因DOM未渲染导致的元素找不到问题
- 缩小定位范围,给
ng-star-inserted加上菜单项的标签限制(比如li、a,根据你页面实际结构调整)
示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("你的页面URL") # 等待菜单项加载,超时10秒 wait = WebDriverWait(driver, 10) # 假设菜单项是<li>标签,带ng-star-inserted类 menu_items = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "li.ng-star-inserted"))) # 遍历找Workloads for item in menu_items: try: # 去除文本前后空格,避免匹配失败 item_text = item.text.strip() if item_text == "Workloads": # 获取aria-expanded属性判断是否展开 is_expanded = item.get_attribute("aria-expanded") == "true" print(f"Workloads菜单状态: {'已展开' if is_expanded else '未展开'}") break except Exception as e: # 跳过不可交互的元素 continue
快速定位的XPath写法
不用遍历,直接用XPath定位到Workloads菜单,更高效:
基础写法(精确匹配文本)
# 定位文本为Workloads、带ng-star-inserted类的li元素 workloads_menu = wait.until(EC.presence_of_element_located( (By.XPATH, "//li[contains(@class, 'ng-star-inserted') and text()='Workloads']") )) is_expanded = workloads_menu.get_attribute("aria-expanded") == "true"
兼容文本含空格的写法
如果菜单文本前后有空格或换行,用contains匹配:
workloads_menu = wait.until(EC.presence_of_element_located( (By.XPATH, "//li[contains(@class, 'ng-star-inserted') and contains(text(), 'Workloads')]") ))
若菜单项文本在子标签内(比如)
如果Workloads文本在<li>下的<a>标签里,调整XPath:
# 定位父元素li的aria-expanded属性 workloads_menu = wait.until(EC.presence_of_element_located( (By.XPATH, "//li[contains(@class, 'ng-star-inserted') and .//a[text()='Workloads']]") ))
注意事项
- 替换代码中的标签(
li、a)为你页面实际的菜单项标签 aria-expanded属性值通常是字符串"true"或"false",注意不要和布尔值混淆- 如果菜单需要点击才能显示,要先处理菜单的展开操作(比如点击父菜单)
内容的提问来源于stack exchange,提问作者JimmyG
相关产品推荐
相关产品推荐

