Selenium 如何选择按钮下拉菜单中的指定选项?
数据小许
结论
这个菜单里的控件是普通按钮和菜单项。给出的 HTML 显示,Choice 4 是带有 role="menuitem" 的 <li>,因此需要先点击下拉按钮,再等待并点击对应的 <li>。Selenium 的 Select() 和 //select/option 定位方式不适用于这里。
使用 WebDriverWait 选择菜单项
你后来确认按钮的 class 是 SLP-btn SLP-btn-primary SLP-dropdown-trigger,并通过第二个匹配按钮成功打开了菜单。可以这样写:
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
driver.get("https://sample URL")
wait = WebDriverWait(driver, 10)
trigger = (By.XPATH, '(//button[@class="SLP-btn SLP-btn-primary SLP-dropdown-trigger"])[2]')
choice = (By.XPATH, "//li[@role='menuitem' and normalize-space()='Choice 4']")
wait.until(EC.element_to_be_clickable(trigger)).click()
wait.until(EC.element_to_be_clickable(choice)).click()
WebDriverWait 会等到元素可以点击后再继续,避免菜单还没展开或选项还没出现时就查找元素。XPath 中的 normalize-space() 会忽略选项文本前后的空白。
为什么原来的定位会失败
原代码查找的是:
//select/option[contains(text(),'Choice 4')]
这个 XPath 只匹配 <select> 内部的 <option>。页面实际使用的是 <ul> 和 <li>,所以它找不到目标元素,并触发 NoSuchElementException。Select() 也只适用于原生 HTML <select> 控件。
检查按钮的方式也会影响看到的 HTML。在这个案例中,点击后查看页面没有显示正确的按钮结构;将鼠标悬停在下拉菜单上,再使用 Chrome Inspect,才找到了按钮触发器。
定位器注意事项
示例中的 [2] 表示匹配结果中的第二个按钮。只有目标触发器确实稳定地排在第二位时,才适合这样定位。如果页面布局或按钮数量可能变化,应根据实际 DOM,为目标按钮选择更明确的定位条件。若页面上可能有多个 Choice 4,也应将菜单项定位器限制在对应的菜单容器内。
备注:内容仅供参考。
