1

我正在尝试检查 Selenium 元素是否具有绿色边框。

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

理想情况下是这样的://div[@id="target"]/@style.borderColor

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

4

1 回答 1

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

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

于 2012-06-29T23:42:33.083 回答