Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Appium findElement在一行中使用了两次不起作用_Java_Selenium_Xpath_Selenium Webdriver_Appium - Fatal编程技术网

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

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

我试图通过元素的完整路径(wholeElement)来查找元素,首先查找较高级别的元素,然后在该元素中查找较低级别的元素(moduleElement)。这是我的密码:

    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]
。我可能解释得不好,但我希望你明白我的错误。谢谢