PhantomJS и HTMLUnitDriver не могут найти элементы через id / xpath - PullRequest
0 голосов
/ 09 мая 2018

Попытка сделать решение без браузера, поскольку в моей облачной среде не установлен 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>

Я пробовал все это, которые работают для Chrome / Firefox, но не PhantomJS / HTMLUnit:

driver.findElement(By.xpath("//li[@id='invoiceMenuItem_4']")).click();
driver.findElement(By.id("invoiceMenuItem_4")).click(); 
driver.findElement(By.xpath("/html[1]/body[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[2]/ul[1]/li[9]")).click();
driver.findElement(By.xpath("//*[contains(text(), 'Attachment Upload')]")).click();
driver.findElement(By.xpath("//li[@ng-class='active':invoiceMenuItem.selected']")).click();

Здесь также есть этот элемент, который работает для 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>

Вот одно из работавших решений, я пробовал другие комбинации, аналогичные тем, которые я использовал выше, и обычно у меня нет проблем с драйверами Chrome / Firefox.

driver.findElement(By.xpath("//ul[@class='tabs']//li[@id='invoiceMenu']")).click();

1 Ответ

0 голосов
/ 09 мая 2018

Элемент с текстом Загрузка вложений является Угловым элементом, поэтому вам нужно вызвать WebDriverWait с Ожидаемые условия как elementToBeClickable следующим образом:

  • Использование linkText :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Attachment Upload"))).click();
    
  • Использование xpath :

    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();
    

Элемент с текстом Invoice снова является Angular элементом, поэтому вы должны вызвать WebDriverWait с ExpectedConditions как elementToBeClickable следующим образом:

  • Использование linkText :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.linkText("Invoice"))).click();
    
  • Использование xpath :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li[@class='active' and @id='invoiceMenu']/a[@aria-label='Invoice' and contains(.,'Invoice')]"))).click();
    
...