3

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

有人遇到这个吗?

4

5 回答 5

2

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

于 2009-03-05T17:55:57.803 回答
1

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

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

于 2012-04-09T22:53:30.167 回答
0

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

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

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

你能分享你正在尝试做的事情吗?通常,当我尝试从元素中获取属性或文本值时,这些东西会出现。

于 2009-02-17T15:26:46.233 回答
0

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

特别是“ends-with”功能不可用 - 我使用像这样的表达式

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

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

于 2009-03-26T11:57:25.820 回答
0

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

    var result = xpathResult.iterateNext();

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

您可以做的是修改 htmlutils.js,将第 1177-1181 行替换为以下内容:

    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 进行了特殊处理(它将其文本内容作为字符串返回),因此现在您可以执行类似的操作

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

如果您像我一样使用 SeleniumRC Java 客户端,那么selenium是 DefaultSelenium 的一个实例。当然,这是一个简单的示例,因为您可以只使用 getXpathCount() 并且还有其他 XPathResult 类型要处理,但这应该可以让您走上正确的道路。

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

于 2009-09-30T22:46:03.720 回答