2013-11-18 2 views
2

Я использую WebDriver в Java.Исключение элемента stal элемента Webdriver, когда элемент DOM не изменился

Я хочу получить все значения суммы из поля суммы ниже, так что я планирую сделать это, чтобы зациклиться на каждой строке таблицы и найти, установлен ли этот флажок, установить количество на определенное число.

enter image description here

Пример исходного код можно найти здесь: http://eric-lin.net/upload/index.php

Я использую следующий метод Java, чтобы найти значение суммы поля:

public void fillInAllAmountForSelectedItems() { 

    List<WebElement> allItems = driver 
      .findElements(By 
        .xpath("//table[@id = 'bulkPaymentForm:itemTable']//tbody[@id = 'bulkPaymentForm:itemTable:tbody_element']//tr[contains(@class, 'handCursor row-border tranItemRow')]")); 
    System.out.println(allItems.size()); 
    //return 3, expected 

    waitTimer(2, 1000); 

    for (WebElement item : allItems) { 
     System.out.println(item.findElement(By.xpath("//td[4]")) 
       .getAttribute("Value")); 
    }  
} 

Большой часть времени, foreach loop завершится неудачно из-за исключения элементарного элемента. Который я не понимаю, потому что DOM не изменился.

Когда он работает, цикл foreach не печатает ничего, поэтому похоже, что он не нашел правильный элемент.

Как это сделать, чтобы исправить это, и что мне нужно сделать, чтобы выполнить назначение этой функции, чтобы заполнить значение суммы для всех отмеченных элементов?

Большое спасибо за внимание.

+0

Вы пытались добавить функцию 'wait()'? попробуйте выполнить шаг за шагом (режим отладки), если вы используете eclipse – vkrams

+0

Обратите внимание, что поле 'input' внутри' td' будет содержать сумму, а не 'td'. – Faiz

ответ

3

Обработка StaleElementException обычно является попыткой повторить попытку, пока вы не преуспеете в истории. DOM может обновляться по нескольким причинам, заставляя элемент устаревать.

Стратегия, которая иногда используется и часто эффективна при работе со списком элементов, заключается в получении каждого элемента по одному. Выходит отличное решение here, пример кода приведен ниже.

Вам нужно будет построить селектор xpath/css, чтобы соответствующим образом ссылаться на необходимую ячейку таблицы. Обратите внимание, что значение должно быть получено из суммы input поля из td. Если вы попытаетесь получить текст с td, он будет пустым, как вы видите сейчас.

//get the number of items that are required 
int size = driver.findElements(By.cssSelector("table#mytable>tbody>tr>td[4]/input")).size(); 

//now work with each one individually, rather than with a list 
for(int i = 1; i <= size; i++) { 
    String locator = String.format("table#mytable>tbody>tr[%d]>td[4]/input", i); 
    WebElement inputField = driver.findElement(By.cssSelector(locator)); 
    //get or set the value of the input element 
    System.out.println(inputField.getAttribute("value")); 
} 
+0

Привет, Faiz, ваше решение выглядит великолепно, но я не могу найти элементы поля суммы cssSelector. Я заменил id '# mytable' идентификатором таблицы платежей' #bulkPaymentForm: itemTable' и жалуется на 'org.openqa.selenium.WebDriverException: указана недопустимая или незаконная строка'. – nzsquall

+0

Я использую xpath '// table [@id = 'bulkPaymentForm: itemTable'] // tbody // tr [% d]/td [4]/input" и работает, но я все еще хочу знать, почему cssSelector не работает.Спасибо – nzsquall

+0

':' в вашем идентификаторе таблицы может быть преступником для того, чтобы cssSelector не работал. ':' имеет определенное значение для css и используется для указания псевдо классов. См. раздел 6.6 псевдоклассы [ здесь] (http://www.w3.org/TR/css3-selectors/). – Faiz

Смежные вопросы