【问题标题】:XPath select a child node at randomXPath 随机选择一个子节点
【发布时间】:2011-02-25 15:40:31
【问题描述】:

我正在使用 Selenium IDE 进行一些网络应用程序测试,并且想引入一些随机性来展开我们的测试。我目前正在使用 Selenium 的 storeAttributeValue,您可以在其中给它一个 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],每次我“评估”/“运行”它都会“返回”集合中的一个 tr 节点//table[@id='mytable']//tr.

【问题讨论】:

  • //table[@id='mytable']//tr[0] 不选择任何内容,因为 [0] 将扩展为 [position() = 0]
  • @Alejandro 哎呀!已更正。归咎于周五下午的困倦
  • “随机”是什么意思?请注意,我们处于声明性环境中......
  • @Alejandro:我已经详细说明了我的想法。

标签: xml xpath selenium


【解决方案1】:

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

类似:

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

如果要对每个输入源进行一次评估,XPath 中最简单的伪随机性将是

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

也就是说,以整个输入源的某些属性为种子,进行一些伪随机性计算。

【讨论】:

    【解决方案2】:

    如果你使用 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
    

    【讨论】:

      【解决方案3】:

      动态构造 XPath 表达式,然后对其求值:

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

      在哪里

      {yourRandom}

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-16
        相关资源
        最近更新 更多