如何使用Selenium';s xpath

如何使用Selenium';s xpath,xpath,selenium,selenium-rc,Xpath,Selenium,Selenium Rc,我试图检查Selenium元素是否有绿色边框 我可以使用//div[@id=“target”]/@style来应用已解析的样式字符串。。。并使用字符串搜索来搜索边框。。。我必须解决一些显示速记(border:solid 3px green)和其他显示扩展(border style:solid;border color:green…)的浏览器的问题……但我如何才能更干净地做到这一点 理想的情况是://div[@id=“target”]/@style.borderColor 我还想避免使用conta

我试图检查Selenium元素是否有绿色边框

我可以使用
//div[@id=“target”]/@style
来应用已解析的样式字符串。。。并使用字符串搜索来搜索边框。。。我必须解决一些显示速记(
border:solid 3px green
)和其他显示扩展(
border style:solid;border color:green…
)的浏览器的问题……但我如何才能更干净地做到这一点

理想的情况是:
//div[@id=“target”]/@style.borderColor


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

XPath对CSS样式一无所知,它不理解属性,并将它们当作简单的字符串。如果XML查询语言理解CSS样式,那就很奇怪了,对吗

此外,使用类似于XPath的构造,但不是XPath!它还通过右侧的
@
符号选择属性。但是考虑这个定位器:<代码>target@style“。它可以工作,但绝对不是XPath

它还将返回显式设置的
style
属性,而不是它的内部计算值,因此除非元素上确实存在
style
属性,否则它是无用的。如果定义了
style
属性,则选择它

Selenium本身无法给出正确的答案(WebDriver有,但Selenium RC、afaik中没有对应的版本)

因此,获取Selenium RC中元素的计算样式(从所有源计算的最终值)的唯一方法是通过JavaScript

我多年来一直在使用的脚本(经过轻微编辑)如下(来源):

请注意,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中,有一个类可以轻松地重新格式化它:

String color = Color.fromString(color).asHex();

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

XPath对CSS样式一无所知,它不理解属性,并将它们当作简单的字符串。如果XML查询语言理解CSS样式,那就很奇怪了,对吗

此外,使用类似于XPath的构造,但不是XPath!它还通过右侧的
@
符号选择属性。但是考虑这个定位器:<代码>target@style“。它可以工作,但绝对不是XPath

它还将返回显式设置的
style
属性,而不是它的内部计算值,因此除非元素上确实存在
style
属性,否则它是无用的。如果定义了
style
属性,则选择它

Selenium本身无法给出正确的答案(WebDriver有,但Selenium RC、afaik中没有对应的版本)

因此,获取Selenium RC中元素的计算样式(从所有源计算的最终值)的唯一方法是通过JavaScript

我多年来一直在使用的脚本(经过轻微编辑)如下(来源):

请注意,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中,有一个类可以轻松地重新格式化它:

String color = Color.fromString(color).asHex();

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

我有点困惑。您是否暗示您可以使用Selenium中的
//div[@id=“target”]/@style
通过XPath获得
style
值?怎样或者您只是在测试它是否返回元素?是的,在selenium中。只需使用getAttribute()@SlanecOh,对,Selenium RC。它看起来像一个合适的XPath:)。而
style
属性是在
div
元素上显式键入的,还是它只是一个定义了CSS的
?或者,换句话说,你想得到计算出的边界值,还是
style
属性中的显式值?@Slanec-ouch,我想我在标题中提到了selenium。。。我会修好的。我想要计算出的值。使用XPath时链接非常好,我有点困惑。您是否暗示您可以使用Selenium中的
//div[@id=“target”]/@style
通过XPath获得
style
值?怎样或者您只是在测试它是否返回元素?是的,在selenium中。只需使用getAttribute()@SlanecOh,对,Selenium RC。它看起来像一个合适的XPath:)。而
style
属性是在
div
元素上显式键入的,还是它只是一个定义了CSS的
?或者,换句话说,你想得到计算出的边界值,还是
style
属性中的显式值?@Slanec-ouch,我想我在标题中提到了selenium。。。我会修好的。我想要计算出的值。使用XPath时的链接非常好