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 不是函数