Java 在站点中使用xpath时未找到元素

Java 在站点中使用xpath时未找到元素,java,selenium,xpath,Java,Selenium,Xpath,我有一个angular网站,我正在尝试使用Selenium/Java将其自动化。我知道量角器更容易用于有角度的部位,但我希望使用硒 我一直在xpath中使用“contains”关键字来查找元素,因为没有唯一的id可用 我所面临的问题元素在所附的红色圆圈图像中。当我使用如图所示的xpath搜索控制台时,元素会高亮显示。但是当我在代码中使用它时,我得到了元素notfound错误 有没有更好的方法来处理这个问题,以及为什么我会出错。我已经有等待条件了 HTML代码: <div class="s

我有一个angular网站,我正在尝试使用Selenium/Java将其自动化。我知道量角器更容易用于有角度的部位,但我希望使用硒

我一直在xpath中使用“contains”关键字来查找元素,因为没有唯一的id可用

我所面临的问题元素在所附的红色圆圈图像中。当我使用如图所示的xpath搜索控制台时,元素会高亮显示。但是当我在代码中使用它时,我得到了元素notfound错误

有没有更好的方法来处理这个问题,以及为什么我会出错。我已经有等待条件了

HTML代码:

<div class="status-selector ng-isolate-scope" fm-select="" 
     fm-select-options="::IssueDetailsCtrl.issue.allowedIssueStatuses" 
     fm-disabled="!IssueDetailsCtrl.issue.permissions.editStatus" 
     fm-model="IssueDetailsCtrl.issue.status" 
     fm-change="IssueDetailsCtrl.updateStatus()">
  <div class="fm-select undefined selected" ng-class="getStyle()" tabindex="" 
       ng-keyup="handleKeys($event)" ng-keydown="handleKeyDown($event)" style="">
    <div class="fm-select-title" ng-click="toggleVisibility()" 
         ng-class="{&quot;fm-select-title-highlighted&quot;: 
                   isOpen, &quot;fm-select-disabled&quot;: fmDisabled }">
      <div class="selected-item-icon" ng-class="selectedOption.imageClass"></div>
      <span class="ng-binding">Open</span>
    </div>
    <!-- ngIf: isOpen -->
  </div>
</div>
<div class="fm-select undefined selected" ng-class="getStyle()" tabindex="" 
     ng-keyup="handleKeys($event)" ng-keydown="handleKeyDown($event)" style="">
  <div class="fm-select-title" ng-click="toggleVisibility()" 
       ng-class="{&quot;fm-select-title-highlighted&quot;: 
                 isOpen, &quot;fm-select-disabled&quot;: fmDisabled }">
    <div class="selected-item-icon" ng-class="selectedOption.imageClass"></div>
    <span class="ng-binding">Open</span>
  </div>
  <!-- ngIf: isOpen -->
</div>
<div class="fm-select-title" ng-click="toggleVisibility()" 
     ng-class="{&quot;fm-select-title-highlighted&quot;: 
               isOpen, &quot;fm-select-disabled&quot;: fmDisabled }">
  <div class="selected-item-icon" ng-class="selectedOption.imageClass"></div>
  <span class="ng-binding">Open</span>
</div>
<div class="selected-item-icon" ng-class="selectedOption.imageClass"></div>
<span class="ng-binding">Open</span>

打开
打开
打开
打开
等待条件:

 public void waitAndClickElement(WebElement element) throws InterruptedException {
        boolean clicked = false;
        int attempts = 0;
        while (!clicked && attempts < 20) {
            try {
                this.wait.until(ExpectedConditions.elementToBeClickable(element)).click();
                System.out.println("Successfully clicked on the WebElement: " + "<" + element.toString() + ">");
                clicked = true;
            } catch (Exception e) {
                System.out.println("Unable to wait and click on WebElement, Exception: " + e.getMessage());
                Assert.fail("Unable to wait and click on the WebElement, using locator: " + "<" + element.toString() + ">");
            }
            attempts++;
        }
    }
public void waitAndClickElement(WebElement元素)抛出中断异常{
布尔值=假;
int=0;
当(!单击并尝试<20次时){
试一试{
this.wait.until(ExpectedConditions.elementToBeClickable(element))。单击();
System.out.println(“成功单击Web元素:+”);
单击=真;
}捕获(例外e){
System.out.println(“无法等待并单击WebElement,异常:+e.getMessage());
Assert.fail(“无法等待并使用定位器“+”)单击WebElement);
}
尝试++;
}
}

我建议您在这种情况下使用显式等待:

new WebDriver(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='ng-binding' and text()='Open']"))).click();  

您还可以使用此Xpath:

//div[@class='selected-item-icon']/following-sibling::span[text()='Open' and @class='ng-binding']

您的应用程序是Angular应用程序,只有Angular
ng if
满足某些条件时,按钮才会动态附加到DOM树,因此需要等待Angular编译按钮的HTML,然后再附加到DOM树

WebDriverWait wait = new WebDriverWait(driver, 20);

WebElement ele = wait.until(ExpectedConditions.presenceOfElementLocated(
    By.xpath("//div/span[text()='Open']"))
);

ele.click();

请以文本格式而不是图像共享代码。因此,我们可以很容易地为您提供解决方案。尝试@Mohan,在您给定的HTML中有几个
打开的
,请通过DevTool缩小到确切的一个,然后删除有问题的冗余HTML。第二个xpath有效!!谢谢你能告诉我你是怎么得出这个结果的吗?@Mohan:预期的跨度基本上是div的兄弟,带有类选择项图标。基本上,它是一个以下兄弟,请在以下位置查找有关xpath的更多信息: