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
相关产品推荐
相关产品推荐

