C# Selenium如何按style位置值范围查找元素?
问题解决与解答
一、你的XPath错误原因及修正
你原来的XPath用contains(@style,'top:<200')和contains(@style,'top:>100')完全不匹配实际场景——你的style属性里并没有<或>符号,只有类似top:131;的数值格式,所以根本找不到任何元素。
正确的做法是从style属性中提取top的数值再做范围比较,对应的XPath如下:
driver1.FindElements(By.XPath(@"//area[contains(@class,'minimap') and number(substring-before(substring-after(@style, 'top:'), ';')) > 100 and number(substring-before(substring-after(@style, 'top:'), ';')) < 200]"));
XPath逻辑说明:
substring-after(@style, 'top:'):提取top:之后的字符串部分substring-before(..., ';'):提取上述结果中;之前的数值部分number(...):把提取到的字符串转换成数字,方便做大小比较- 直接定位
area元素(比//*更精准),同时保留contains(@class,'minimap')的过滤条件
二、C# Selenium中能否按位置值范围查找元素?
可以,有两种常用方式:
方式1:直接用XPath在定位阶段筛选(推荐)
就是上面给出的XPath写法,直接在定位时完成数值范围过滤,执行效率更高。
方式2:先获取所有目标元素,再在C#代码中筛选
如果XPath的字符串处理逻辑对你来说太复杂,也可以先拿到所有符合class的元素,再遍历提取top值做判断:
using System.Collections.Generic; // 先获取所有带minimap类的area元素 var allMinimapAreas = driver1.FindElements(By.CssSelector("area.minimap")); var filteredElements = new List<IWebElement>(); foreach (var element in allMinimapAreas) { string styleAttr = element.GetAttribute("style"); // 提取top数值,处理可能存在的空格 string topValueStr = styleAttr.Split(new[] { "top:" }, System.StringSplitOptions.None)[1] .Split(';')[0] .Trim(); if (int.TryParse(topValueStr, out int topValue)) { if (topValue > 100 && topValue < 200) { filteredElements.Add(element); } } }
内容的提问来源于stack exchange,提问作者mandang
相关产品推荐
相关产品推荐

