Java PhantomJS和HTMLUnitDriver在通过id/xpath查找元素时遇到问题

Java PhantomJS和HTMLUnitDriver在通过id/xpath查找元素时遇到问题,java,angular,selenium,selenium-webdriver,xpath,Java,Angular,Selenium,Selenium Webdriver,Xpath,由于我的云环境没有安装Chrome/Firefox,但这两个驱动程序都有问题,因此尝试使用无浏览器解决方案。甚至连无头Chrome/Firefox解决方案也在寻找浏览器安装。我目前有许多不同的id/xpath组合用于自动测试,但PhantomJS和HTMLUnit似乎都找不到这些元素。我试图定位的这些元素是有角度的,似乎让事情变得有点困难 以下是我试图在页面上查找的示例HTML: <li ng-repeat="invoiceMenuItem in nav.invoiceMenu.menuI

由于我的云环境没有安装Chrome/Firefox,但这两个驱动程序都有问题,因此尝试使用无浏览器解决方案。甚至连无头Chrome/Firefox解决方案也在寻找浏览器安装。我目前有许多不同的id/xpath组合用于自动测试,但PhantomJS和HTMLUnit似乎都找不到这些元素。我试图定位的这些元素是有角度的,似乎让事情变得有点困难

以下是我试图在页面上查找的示例HTML:

<li ng-repeat="invoiceMenuItem in nav.invoiceMenu.menuItems" ng-class="{'active':invoiceMenuItem.selected}" id="invoiceMenuItem_4" style="" class="ng-scope ibm-active" role="presentation">
            <a ng-click="nav.onSelectInvoiceMenuItem(invoiceMenuItem);$event.stopPropagation();" href="" class="ng-binding" role="tab" aria-selected="false" tabindex="-1" aria-label="Attachment Upload">Attachment Upload</a>
        </li>
<a ng-click="nav.onSelectInvoiceMenuItem(invoiceMenuItem);$event.stopPropagation();" href="" class="ng-binding" role="tab" aria-selected="false" tabindex="-1" aria-label="Attachment Upload">Attachment Upload</a>
这里还有这个元素,它适用于HTMLUnit,但不适用于PhantomJS:

<li id="invoiceMenu" ng-show="nav.invoiceMenu.show" ng-class="{'active':nav.invoiceMenu.selected}" class="active" role="presentation">
            <a ng-click="nav.onSelectInvoiceMenu();$event.stopPropagation();" role="tab" aria-selected="false" tabindex="-1" aria-label="Invoice">Invoice</a>
        </li>

文本为附件上载的元素是一个角度元素,因此您必须使用预期条件将WebDriverWait诱导为元素,如下所示:

  • 使用链接文本:

  • 使用xpath:


文本为“发票”的元素也是一个角度元素,因此您必须使用预期条件将WebDriverWait归纳为元素,如下所示:

  • 使用链接文本:

  • 使用xpath:


很抱歉,在OP中我忘了提到我使用过WebDriverWaits。这里是我在其中的一行:wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(“/*[contains(text(),'Attachment Upload')]”));。很遗憾,您的两个建议都超时,找不到元素。线程“main”org.openqa.selenium.TimeoutException中的异常:预期条件失败:等待元素可单击:By.xpath:导致原因:org.openqa.selenium.NoSuchElementException:无法使用By找到元素。xpath:@user3413540 TimeoutException是预期条件失败的结果。通过与
Thread.sleep()连接的
findElement()
调试代码。如果你能找到元素并用观察结果更新问题。是的,它似乎永远找不到元素,只会超时等待它。这里的angular给这些非Chrome/Firefox的驱动程序带来了麻烦,这有什么问题吗?我放了好几根线;代码中的所有行都有帮助,但我仍然找不到这些特定元素。您能否具体说明您在线程“main”中与
Thread.sleep()连接时看到的
findElement()
异常的确切错误org.openqa.selenium.NoSuchElementException:无法找到ID为“invoiceMenuItem_4”或具有我尝试的任何ID/xpath组合的元素。我也尝试了相当长的睡眠时间。
<li id="invoiceMenu" ng-show="nav.invoiceMenu.show" ng-class="{'active':nav.invoiceMenu.selected}" class="active" role="presentation">
            <a ng-click="nav.onSelectInvoiceMenu();$event.stopPropagation();" role="tab" aria-selected="false" tabindex="-1" aria-label="Invoice">Invoice</a>
        </li>
driver.findElement(By.xpath("//ul[@class='tabs']//li[@id='invoiceMenu']")).click();
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Attachment Upload"))).click();
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@class='ng-scope ibm-active']/a[@class='ng-binding' and @aria-label='Attachment Upload']"))).click();
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Invoice"))).click();
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@class='active' and @id='invoiceMenu']/a[@aria-label='Invoice' and contains(.,'Invoice')]"))).click();