【问题标题】:xPath in selenium with multiple premises in multiple node layersselenium 中的 xPath,在多个节点层中具有多个前提
【发布时间】:2015-09-28 00:30:07
【问题描述】:

我在 seleniumdriver 中的 xpath 有一点问题。

我希望 xpath 定位器通过两个变量在节点层次结构的不同点使用精确匹配来缩小其选择范围。这部分完成了。

您可以将我的情况想象为使用 xPath 在 xml 中寻址一个二维数组,每个维度都作为我在其中的两个变量给出(它们是通过 js 变量而不是 xpath 变量进行的标准文本搜索)。

我正在努力解决的是生成的构造并不能区分第一维元素之间的差异,因此只要给定的变量值是其中一个维度,它将很好地处理第二维中的每个元素.我不能假设它们是独一无二的,或者它们是按任何顺序排列的。我正在使用它进行测试,所以这是不可接受的。

我怎样才能形成一个不会犯同样错误的表达式? 我已经尝试过“和”表达式,但 selenium 和 xpath 工具都说“找到”的值为“1”,但它没有给我一个可以使用的节点定位器。

例如,我的结构看起来很相似,因此例如通过 x1/y1 正确处理它看起来很好。

//x1//y1
//x1//y2 
//x2//y3 
//x2//y4 
//x3//y5 
//x3//y6

应该工作,工作正常。

//x1x//y1
//x1x//y2
//x2x//y3
//x2x//y4
//x3x//y5
//x3x//y6

(将不存在的输入作为第一个维度。)我的输入不是容错的,我会寻找确切的值,因此测试在这里应该失败。

//x2//y1
//x2//y2
//x3//y3
//x3//y4
//x1//y5
//x1//y6

DING,定位器在它不应该在这里找到 y 值(y 值在节点树的不同叶子上)。我需要这方面的帮助。

这是有问题的定位器:

return element(by.xpath(".//div[@name='typeList']//div[.//text()='" + moduleName + "']//div[./text()='" + typeName + "']")).getText();

TypeList 是所有者元素的名称,如果我删除它没有任何区别,但请在举例时记住它。

【问题讨论】:

  • 你的结构让我很困惑。我首先想到的是 x 和 y where 标记,但是在您的 XPath 中您正在寻找文本。你知道它找到的是哪一个吗?
  • 让我换一种说法。我正在测试以验证“文件”是否在正确的“目录”中。示例中的 x 值是目录,y 是文件。我通过变量的文本值找到正确的元素。 x 和 y 本身只是示例。它们不是标签,它们代表我的文本搜索变量的可能值。
  • 是的,我知道找到了哪个元素。
  • 是否可以给网页链接或提供html
  • 不可能,这是一个正在开发的公司内部页面。几个小时后,我将使用一个简单的示例 html 重新编写并再次提出问题,因为它看起来比实际更令人困惑。这都是关于表达式的第一个文本搜索部分没有将过滤器应用于它应该的后续节点。

标签: javascript xml selenium xpath


【解决方案1】:

最后确实是句法问题,在文本关键字之前。

我正在尝试这个

//div[./text()='Zero']//div[./text()='Number']

相反,我需要这样的东西。

//div[.//text()='Zero']/div[.//text()='Number']

显然,只要在我的文件中定义了每个约束条件,第一个约束条件的值都会查找“数字”(不必位于其向上的 xnode 路径中。)

最后一点,我建议不要使用 chrome xpath helper,因为它的行为几乎是随机的,在删除和替换相同的表达式后会给出不同的结果。啊。 chrome 唯一的另一个是广告软件……我通过firefox xpath 检查器工具反复试验得出了我的结果。

1,我最终需要为 angular select ui 工具的元素额外添加一个节点(我们使用 selectize.js,一个可搜索的选择框),否则它会混淆返回什么,但这与原来的问题,因为我之前用原来的表达方式尝试过。

2,我还必须在第一个和第二个文本搜索之间添加一个节点,否则它也会在第一个文本搜索中查找第二个表达式,例如。寻找零中的数字,如果找到,则将其视为有效值。反过来,问题仍然存在,这也可以通过在第一个中应用额外的类型/名称约束来解决(不是在最后一个示例中以节省空间)。

这就是我最终的结果:

.//div[@name='typeList']//div/div[.//text()='Zero']/div/div/div[.//text()='Number']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多