Java Appium findElement在一行中使用了两次不起作用
我试图通过元素的完整路径(wholeElement)来查找元素,首先查找较高级别的元素,然后在该元素中查找较低级别的元素(moduleElement)。这是我的密码:Java Appium findElement在一行中使用了两次不起作用,java,selenium,xpath,selenium-webdriver,appium,Java,Selenium,Xpath,Selenium Webdriver,Appium,我试图通过元素的完整路径(wholeElement)来查找元素,首先查找较高级别的元素,然后在该元素中查找较低级别的元素(moduleElement)。这是我的密码: WebElement modularElement = appDriver.findElement(By.xpath("//UIATableCell[2]")).findElement(By.xpath("//UIAStaticText[4]")); WebElement wholeElement = appDri
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]"));
它们不一样
appDriver.findElement(By.xpath("//UIATableCell[2]")).findElement(By.xpath("//UIAStaticText[4]"));
在这里,您可以在任何地方搜索//UIAStaticText[4]
:
使用xpath时,请注意webdriver遵循标准约定:
前缀为“/”的搜索将搜索整个文档,而不仅仅是
当前节点的子节点。使用“//”将搜索限制为
此Web元素的子元素
而
//UIATableCell[2]/UIAStaticText[4]
只会在//UIATableCell[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;
}
您确定第一行代码只能在
UIATableCell[2]
下找到UIAStaticText
,而不能在文档中的任何其他位置找到吗?只需提问,因为以/
开头的XPath通常会从文档根节点的所有后代中进行选择。(我同意你关于/
和/
之间区别的一般说法。)@LarsH这是一个伟大的观点!我错过了。编辑。非常感谢!谢谢你的评论。担心使用./UIAStaticText[4]会导致“无法定位元素”错误。复制并粘贴了上面的2行代码,找到了完整的元素,但找不到ModuleElement。也尝试了//UIAStaticText[4](双正斜杠),但结果与使用//UIAStaticText[4](即双正斜杠前没有句号)@CharlieSeligman感谢您的尝试。现在我明白我的错误了。答案末尾的表达仍然不一样wholeElement
具有匹配项,因为在DOM中找到的所有UIataTableCell[2]
元素中有一个UIAStaticText[4]
元素。但是,在第一个表达式中,它将拾取第一个appDriver.findElement(By.xpath(“//UIATableCell[2]”)
匹配项,并尝试在内部查找/UIAStaticText[4]
。我可能解释得不好,但我希望你明白我的错误。谢谢