我正在使用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
。
答案 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}
。
例如在C#中,可以使用string.Format()
方法构造XPath表达式。
如果您使用的是XSLT ,则调用转换的代码可以提供XML片段中编码的随机数序列作为外部参数。然后,XSLT代码将为每个XPath表达式使用每个连续的随机数。