Selenium C#:如何通过部分Name定位元素?
解决通过部分匹配name属性定位元素的问题
嘿,我看你在尝试用部分匹配name属性定位元素时踩坑了,这问题我之前也碰到过!咱们先说说你代码里的问题:
你第一段代码里把XPath的语法//*[contains('Price')]直接传给By.Name()是完全错误的——By.Name()方法只接受精确匹配的name属性字符串,根本不支持XPath表达式,所以肯定找不到元素。第二段没写完的代码估计也是类似的逻辑错误,才会抛出编译问题。
下面给你两种靠谱的解决方案,都是能实现部分匹配name属性的:
方法一:用XPath精准定位
直接使用XPath表达式,明确指定匹配name属性包含"Price"的元素,注意要加上前缀.来限定在父元素(也就是你找到的第一个x-container)的子节点范围内查找:
var element = Driver.FindElements(By.ClassName("x-container")).First() .FindElement(By.XPath(".//*[contains(@name, 'Price')]"));
如果需要忽略大小写匹配,可以把表达式改成:
.By.XPath(".//*[contains(lower-case(@name), 'price')]")
方法二:用CSS选择器更简洁
CSS选择器里用[name*='Price']就能匹配name属性包含"Price"的元素,写法更清爽,性能也不错:
var element = Driver.FindElements(By.ClassName("x-container")).First() .FindElement(By.CssSelector("[name*='Price']"));
最后再给你两个小提醒:
- 先确认
Driver.FindElements(By.ClassName("x-container"))确实能找到元素,不然First()会直接抛出异常,建议改成FirstOrDefault()后再判断是否为null,避免崩溃。 - 用浏览器F12开发者工具检查目标元素的
name属性,确保确实包含"Price",别犯拼写错误或者大小写不匹配的低级错误哦!
内容的提问来源于stack exchange,提问作者KVN
相关产品推荐
相关产品推荐

