Selenium:我如何在测试中执行Xpath函数或表达式?

时间:2009-02-16 23:09:03

标签: xpath selenium

有没有办法在Selenium测试中执行一些Xpath代码?我知道你可以执行javascript,但我正在寻找一种方法来执行一些Xpath代码,而不仅仅是在页面上找到一个元素。

有人碰到这个吗?

5 个答案:

答案 0 :(得分:2)

据我了解,XPath函数是XPath 2.0的一部分。 Selenium不支持2.0。因此,无法在selenium中执行XPath函数。

答案 1 :(得分:1)

我认为接受的答案是不正确的。我目前正在学习使用Java的Selenium WebDriver,我被引导到以下博客文章,了解如何在Selenium 2中执行XPath函数来管理变量xpath。我相信这就是你要找的东西。

http://automationtricks.blogspot.com/2010/09/how-to-use-functions-in-xpath-in.html

答案 2 :(得分:0)

安德鲁, 有趣的问题。您可能想尝试Selenium开发人员论坛或高级用法论坛,因为我可能是目前唯一挂在StackOverflow上的Selenium开发人员:)

那就是说,我很肯定你可以做到这一点,但我现在无法得到你的代码(在没有Selenium源的笔记本电脑上)。它需要获得“浏览器机器人”的句柄(参见运行任意JS代码的示例,了解如何执行此操作)。从那里,可能有一个函数调用(或可能的调用链)可以得到你想要的东西:调用Selenium的XPath抽象。

或者,如果你只支持Firefox,只需查看JS代码来执行Firefox XPath查询并调用它。嵌入storeEval类型的命令相当容易。或者,请记住,Selenium会在Selenium的JS库中注入一个XPath库。你也可以直接打电话。你不会得到Selenium为一些简单的XPath表达式提供的快捷方式和抽象,但我确信它可以工作。

你能分享你想做的事吗?一般来说,当我试图从元素中获取属性或文本值时,这些东西就出现了。

答案 3 :(得分:0)

根据W3C XPath 1.0规范,XPath 1.0中有函数支持,但可用函数集相当有限:http://www.w3.org/TR/xpath#section-String-Functions

特别是“结束”功能不可用 - 我使用像

这样的表达式

//input[substring(@id, string-length(@id) - string-length('<idSuffix>') +1) = '<idSuffix>']

作为一种解决方法(在这种情况下,找到一个id结尾为'<idSuffix>'的输入元素)。

答案 4 :(得分:0)

看一下Selenium 1.0.1版本中htmlutils.js文件的第1177行(这是在处理所有XPath查询的eval_xpath()函数内部):

    var result = xpathResult.iterateNext();

这里的问题是,根据XPathResult specification,如果结果类型不是可迭代的节点集,则iterateNext()将抛出异常。由于Selenium盲目地假设所有XPath查询都导致节点集,因此您无法执行返回数字或字符串的查询。

您可以做的是通过用以下内容替换第1177-1181行来修改htmlutils.js:

    var iterable =
     xpathResult.resultType == xpathResult.ORDERED_NODE_ITERATOR_TYPE ||
     xpathResult.resultType == xpathResult.UNORDERED_NODE_ITERATOR_TYPE;

    if (iterable) {
     var result = xpathResult.iterateNext();
     while (result) {
         results.push(result);
         result = xpathResult.iterateNext();
     }
    } else if (xpathResult.resultType == xpathResult.NUMBER_TYPE) {
     results.push(inDocument.createTextNode(xpathResult.numberValue));
    }

我们的想法是,如果我们看到一个数字值,我们将它包装在DOM TextNode中并像往常一样传递它,就Selenium而言,这个变化或多或少是透明的。 Selenium的getText命令对TextNodes有特殊处理(它将它们的文本内容作为String返回)所以现在你可以做类似的事情

int count = Integer.parseInt(selenium.getText("xpath=count(//td) + 1"), 10);

其中 selenium 是DefaultSelenium的一个实例,如果你像我一样使用SeleniumRC Java客户端。当然这是一个简单的例子,因为您可能刚刚使用了getXpathCount()并且还有其他XPathResult类型可以处理,但这应该让您从正确的路径开始。

另请注意,上面提到的特定行仅适用于XPath查询的浏览器本机执行。使用Selenium的内置XPath库的执行之后会立即在eval_xpath()内部处理,并且可能需要进行类似的修改 - 但我还没有考虑过这个。