如果某个元素有绿色边框,我正在尝试检查Selenium。
我可以使用//div[@id="target"]/@style
来获取已解析的样式字符串...并使用字符串搜索来搜索边框...我必须解决一些显示简写的显示器(border: solid 3px green
)和其他显示扩展的(border-style: solid; border-color: green....
)......但我怎么能更干净地做到这一点?
理想情况如下://div[@id="target"]/@style.borderColor
我还想避免使用contains
选择器,因为语法很糟糕。但如果这是唯一的方式,那就这样吧。当然。
答案 0 :(得分:4)
XPath对CSS样式一无所知,它不理解属性并将它们视为简单的字符串。如果XML查询语言理解CSS样式,那会很奇怪,对吗?
此外,getAttribute()
使用与类似的构造到XPath,但不是 XPath!它还通过@
符号右侧选择属性。但请考虑这个定位器:"id=target@style"
。它会工作,但它绝对不是XPath。
它还会返回显式设置的style
属性,而不是它的内部计算值,所以除非元素上实际存在style
属性,否则它是无用的。如果定义了style
属性,请选择它。
Selenium本身无法给出正确的答案(WebDriver有getCssValue()
,但在Selenium RC中没有对应的答案,afaik)。
因此,在Selenium RC中获取元素的计算样式(从所有源计算的最终值)的唯一方法是通过JavaScript。
一直为我工作的脚本(经过轻微编辑后)是这样的(来自quirksmode.org):
function getStyle(id, stylePropJs, stylePropCss) {
var x = document.getElementById(id);
if (x.currentStyle)
var y = x.currentStyle[stylePropJs];
else if (window.getComputedStyle)
var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(stylePropCss);
return y;
}
请注意,IE需要该属性的JavaScript名称,但每个其他浏览器都使用CSS名称。此外,你不能使用速记属性,你肯定必须使用扩展的属性。因此,在您的情况下:
String script = "var x = document.getElementById('target');" +
"if (x.currentStyle) var y = x.currentStyle['borderTopColor'];" +
"else if (window.getComputedStyle) var y = document.defaultView.getComputedStyle(x,null).getPropertyValue('border-top-color');" +
"y;";
String color = selenium.getEval(script);
这将返回target
元素的顶部边框的颜色(是的,您需要调用它四次才能获得整个边框)。但猜猜怎么了!每个浏览器都以不同的格式返回颜色。幸运的是,至少在Java中,有一个Color
类可以轻松地重新格式化它:
String color = Color.fromString(color).asHex();
现在您已经存储了十六进制编码颜色,您可以轻松检查它是否为绿色。