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

Selenium如何定位id每次运行动态变化的下拉列表并选中其中选项

修复方案

核心问题

你原有代码的XPath语法完全错误://id=[starts-with(.,'TableName')]不符合XPath属性匹配规则,starts-with第一个参数需要指定要匹配的属性,.代表的是元素文本而非属性。

修改后代码

下拉列表的id虽然动态生成,但固定以TableName_为前缀,结合这一特征即可稳定匹配:

// 点击触发下拉展开的代码可以保留,建议后续替换为相对路径XPath避免页面结构变动后失效
IWebElement fltTableNm = _driver.FindElement(By.XPath("/html/body/div[4]/div/div/div/div[1]/div/div/div[1]/div/div[3]/table/tbody/tr[2]/td[2]/fieldset[2]/div[1]/div[1]/div/span/span"));
fltTableNm.Click();
Thread.Sleep(1000);

// 替换原定位代码,两种方案按需选择
// 方案1:仅通过id前缀匹配,适合页面只有一个该类下拉的场景
IWebElement slctfltTableNm = _driver.FindElement(By.XPath("//ul[starts-with(@id, 'TableName_')]/li[1]"));

// 方案2:结合更多固定属性匹配,精准度更高,适合页面存在多个同类下拉的场景
// IWebElement slctfltTableNm = _driver.FindElement(By.XPath("//ul[starts-with(@id, 'TableName_') and @data-role='staticlist' and @role='listbox']/li[@data-offset-index='0']"));

slctfltTableNm.Click();

优化建议

建议把硬等待Thread.Sleep(1000)替换为Selenium显式等待,稳定性更高:

using OpenQA.Selenium.Support.UI;
using SeleniumExtras.WaitHelpers;

WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(3));
IWebElement slctfltTableNm = wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//ul[starts-with(@id, 'TableName_')]/li[1]")));
slctfltTableNm.Click();

内容的提问来源于stack exchange,提问作者Anneline van der Merwe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:54:04