XPath随机选择一个子节点

时间:2011-02-25 15:40:31

标签: xml xpath selenium

我正在使用Selenium IDE进行一些Web应用程序测试,并希望引入一些随机性来分散我们的测试。我目前正在使用Selenium的storeAttributeValue,你给它一个XPath表达式,它存储匹配它的第一个元素(sorta)。但是我不想存储第一个匹配项,我希望它随机选择一个子节点。

e.g。

//table[@id='mytable']//tr选择此表的所有tr子项。 //table[@id='mytable']//tr[0]选择第一个tr(假设现在嵌套表) //table[@id='mytable']//tr[3]选择第三个tr等。

是否有某种方式(完全在xpath中)我可以说“给我一个随机的tr”,即//table[@id='mytable']//tr[SOMETHINGHERE]每当我'评估'/'运行'它将'返回'一个tr节点//table[@id='mytable']//tr

的集合

3 个答案:

答案 0 :(得分:5)

如果XPath表达式不会从一个调用更改为另一个调用,并且输入源也将相同,那么您将需要通过参数化提供方差,否则使用相同的函数相同的输入将始终输出相同的结果这就是为什么我对声明性范例进行评论)。

类似的东西:

/table[@id='mytable']/tbody/tr[$pseudoRandom mod count(../tr) + 1]

如果每个输入源有一个评估,XPath中最简单的伪随机性将是

/table[@id='mytable']/tbody/tr[count(//node()|//@*) mod count(../tr) + 1]

换句话说,使用整个输入源的某些属性作为种子进行一些伪随机性计算。

答案 1 :(得分:3)

如果您使用的是bash命令行,则可以从$ RANDOM变量中获取伪随机数,如下所示:

/table[@id='mytable']/tbody/tr[floor('"${RANDOM}"' mod count(../tr)+1)]

这是我在使用xmllint尝试获取随机子节点时获取随机数的唯一方法。这是使用xmllint和一些FILENAME.xml的命令:

xmllint --format --recover --xpath '/table[@id='mytable']/tbody/tr[floor('"${RANDOM}"' mod count(../tr)+1)]' FILENAME.xml

答案 2 :(得分:1)

动态构造XPath表达式,然后对其进行评估:

/table[@id='mytable']/tbody/tr[position() = {yourRandom}]

其中

{yourRandom}

必须在XP托管表达式的“骨架”中使用PL托管XPath中获得的随机数替换

例如在C#中,可以使用string.Format()方法构造XPath表达式。

如果您使用的是XSLT ,则调用转换的代码可以提供XML片段中编码的随机数序列作为外部参数。然后,XSLT代码将为每个XPath表达式使用每个连续的随机数。