如何使用Selenium的xpath获得第二个属性级别

时间:2012-06-29 20:00:30

标签: xpath selenium selenium-rc

如果某个元素有绿色边框,我正在尝试检查Selenium。

我可以使用//div[@id="target"]/@style来获取已解析的样式字符串...并使用字符串搜索来搜索边框...我必须解决一些显示简写的显示器(border: solid 3px green)和其他显示扩展的(border-style: solid; border-color: green....)......但我怎么能更干净地做到这一点?

理想情况如下://div[@id="target"]/@style.borderColor

我还想避免使用contains选择器,因为语法很糟糕。但如果这是唯一的方式,那就这样吧。当然。

1 个答案:

答案 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();

现在您已经存储了十六进制编码颜色,您可以轻松检查它是否为绿色。