元素DOM未更改时的Webdriver过时元素异常

时间:2013-11-18 03:32:35

标签: java selenium webdriver selenium-webdriver

我在Java中使用WebDriver。

我想从下面的金额字段中获取所有金额值,所以我打算通过循环遍历每个表行,并查找是否选中了复选框,将金额设置为定义的数字。 / p>

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循环因故障元素异常而失败。我不理解,因为DOM没有改变。

当它工作时,foreach循环不会打印任何内容,因此看起来它没有找到正确的元素。

我该怎么做才能修复它,为了达到这个功能的目的,我需要做些什么才能填写所有检查项目的金额值?

非常感谢。

1 个答案:

答案 0 :(得分:3)

处理StaleElementException通常是尝试重试,直到您成功完成故事。 DOM可能会因为几个原因而刷新,导致元素过时。

有时使用并且在处理元素列表时经常有效的策略是逐个获取每个项目。发布了一个出色的解决方案here,示例代码如下。

您需要构造xpath / css选择器以相应地引用所需的表格单元格。请注意,该值将从input中的td字段中检索 - 如果您尝试从td获取文本,则它将为空白,就像您现在看到的那样。 / p>

//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"));
}