XPath随机选择子节点
我正在做一些使用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节点。
如果XPath表达式不会从一次调用更改为另一次,并且输入源也将相同,那么您将需要通过参数化提供差异,否则与相同的输入将始终输出相同的结果(这就是为什么我对声明范例发表评论)。
喜欢的东西:
/table[@id='mytable']/tbody/tr[$pseudoRandom mod count(../tr) + 1]
如果有将是每个输入源的一个评价,XPath的最简单的伪随机性会
/table[@id='mytable']/tbody/tr[count(//node()|//@*) mod count(../tr) + 1]
换句话说,使得一些伪随机性以整个输入源的某些属性作为种子进行计算。
构建动态的XPath表达式,然后评估其:
/table[@id='mytable']/tbody/tr[position() = {yourRandom}]
其中
{yourRandom}
必须在XPath表达式的 “骨架” 以获得的随机数被取代在托管XPath的PL中。
例如在C#中,将使用string.Format()
方法构造XPath表达式。
如果您使用的是XSLT,那么调用转换的代码可能会提供一个以XML片段编码的随机数序列作为外部参数。然后,XSLT代码将为每个XPath表达式使用每个连续的随机数。
如果你正在使用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
'// table [@ id ='mytable'] // tr [0]'因为'[0]'将被扩展为'[position()= 0],所以什么也不选。 – 2011-02-25 15:49:20
@Ajjandro哎呀!纠正。怪一个星期五下午昏昏欲睡 – Rory 2011-02-25 16:02:02
你是什么意思的“随机”?请注意,我们处于声明环境... – 2011-02-25 16:03:32