2011-02-25 111 views
5

我正在做一些使用Selenium IDE的Web应用程序测试,并且希望引入一些随机性来展开我们的测试。我目前使用Selenium的storeAttributeValue,在那里你给它一个XPath表达式,并且它存储了匹配它的第一个元素(sorta)。不过,我不想存储第一场比赛,我希望它随机选择一个子节点。XPath随机选择子节点

例如

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

是否有某种方式(完全的XPath),我可以说“给我一个随机TR”,即//table[@id='mytable']//tr[SOMETHINGHERE]其每次我'evalulate'/'run'它会返回一个位于集合//table[@id='mytable']//tr中的tr节点。

+0

'// table [@ id ='mytable'] // tr [0]'因为'[0]'将被扩展为'[position()= 0],所以什么也不选。 – 2011-02-25 15:49:20

+0

@Ajjandro哎呀!纠正。怪一个星期五下午昏昏欲睡 – Rory 2011-02-25 16:02:02

+0

你是什么意思的“随机”?请注意,我们处于声明环境... – 2011-02-25 16:03:32

回答

4

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

喜欢的东西:

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

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

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

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

0

构建动态的XPath表达式,然后评估其:

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

其中

{yourRandom}

必须在XPath表达式的 “骨架” 以获得的随机数被取代在托管XPath的PL中。

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

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

2

如果你正在使用bash命令行,你可以从$随机变量的伪随机数像这样:

/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