Appium findElement 在一行中使用了两次不起作用

Posted

技术标签:

【中文标题】Appium findElement 在一行中使用了两次不起作用【英文标题】:Appium findElement used twice in one row not working 【发布时间】:2015-08-20 06:21:00 【问题描述】:

我正在尝试通过其完整路径 (wholeElement) 并首先找到更高级别的元素,然后在该元素中找到较低级别的元素 (modularElement) 来查找元素。这是我的代码:

    WebElement modularElement = appDriver.findElement(By.xpath("//UIATableCell[2]")).findElement(By.xpath("//UIAStaticText[4]"));
    WebElement wholeElement = appDriver.findElement(By.xpath("//UIATableCell[2]/UIAStaticText[4]"));

    Logger.LogMessage("modularElement attribute1: " + modularElement.getLocation(), Priority.High);
    Logger.LogMessage("wholeElement attribute1: " + wholeElement.getLocation(), Priority.High);

我遇到的真正奇怪的问题是这两个元素(模块化和整体)是不同的元素,而不是同一个元素(如上面代码中打印的不同位置所示)。谁能解释一下为什么会这样?

谢谢。

更新:

我也尝试过使用 .// 但这仍然提供相同的问题:

    WebElement modularElement = appDriver.findElement(By.xpath("//UIATableCell[2]")).findElement(By.xpath(".//UIAStaticText[4]"));

【问题讨论】:

【参考方案1】:

它们不一样。

appDriver.findElement(By.xpath("//UIATableCell[2]")).findElement(By.xpath("//UIAStaticText[4]"));

在这里,您正在任何地方搜索//UIAStaticText[4]at any level in the entire DOM tree:

使用 xpath 时,请注意 webdriver 遵循标准约定: 以“//”为前缀的搜索将搜索整个文档,而不仅仅是 当前节点的子节点。使用“.//”将您的搜索限制在 此 WebElement 的子级。

//UIATableCell[2]/UIAStaticText[4] 只会在//UIATableCell[2] 的直接子代中搜索

【讨论】:

您确定第一行代码只能在UIATableCell[2] 下找到UIAStaticText,而不是在文档中的其他任何地方吗?只是问一下,因为以// 开头的 XPath 通常会从 文档的根节点 的所有后代中进行选择。 (不过,我同意你关于/// 之间区别的一般性陈述。) @LarsH 这点很好!我错过了。已编辑。非常感谢! 感谢 cmets。害怕使用 ./UIAStaticText[4] 会导致“无法定位元素”错误。复制并粘贴上面的两行代码,找到了整个元素,但没有找到模块元素。 也尝试过 .//UIAStaticText[4] (双斜杠),但这与使用 //UIAStaticText[4] 的结果相同(即在双斜杠之前没有句号)跨度> @CharlieSeligman 感谢您的试用。现在我看到了我的错误。答案末尾的表达仍然不一样。 wholeElement 有一个匹配项,因为在 DOM 中找到了一个 UIAStaticText[4] 元素其中 UIATableCell[2]。但是,在第一个表达式中,它会选择 第一个 appDriver.findElement(By.xpath("//UIATableCell[2]")) 匹配并尝试在其中找到 ./UIAStaticText[4]。我可能解释得不好,但我希望你明白我的错误是什么。谢谢。【参考方案2】:

我会这样做:

By locator = new ByChained(By.xpath("//UIATableCell[2]"),By.xpath(".//UIAStaticText[4]")); 
WebElement modularElement = appDriver.findElement(locator);

或者这样:

public WebElement getCellTextElement(int cell, String varText) 
  By locator = new ByChained(By.xpath("//UIATableCell[" + cell + "]"),
      By.xpath(".//UIAStaticText[contains(text(),'" + varText + "')]")); 
  WebElement modularElement = appDriver.findElement(locator);
  return modularElement;

【讨论】:

以上是关于Appium findElement 在一行中使用了两次不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当我在 findElement 方法上使用 appium 时,我有元素实例,但元素没有获得焦点

无法使用 Appium 为 IOS 生成的代码运行量角器脚本,它说 findelement 不是函数

Appium基于安卓的各种FindElement的控件定位方法实践和建议

appium元素定位

[Appium] 使用Appium过程中遇到的各种坑

八 Appium常用方法介绍