Selenium Java-使用增强的for循环进行迭代的Stale元素异常

时间:2018-07-16 14:58:17

标签: java selenium-webdriver foreach staleelementreferenceexception

用例:

单击页面上的按钮 它将打开一个新的div弹出窗口(具有所有此父菜单->子菜单-子子菜单层次结构,以便选择模板-可以有n个子菜单和子子菜单) 重复选择每个子孩子-但在选择每个子孩子后还有其他步骤可以遵循。必须单击div弹出窗口上的“添加”,在其后显示的小弹出窗口上输入页面的名称,单击“添加”,然后再次导航到上一个页面(带有herirachy)以选择下一个子子对象 现在,它为Stale元素引用提供了例外

为了避免过时的元素异常,尝试使用while循环(以及try和catch)尝试至少两次进行子选择步骤,现在它执行了,但是在每个循环中它始终选择第一个子-注意,它不会输入再次尝试catch循环。

参考代码

public static void selectpage(){
driver.findElement(By.xpath(".//[@id='root']/div[2]/
div/div[1]/span[2]")).click();
driver.findElement(By.xpath(".//* 
[@id='root']/div[2]/div[1]/span/span")).click();
            }

public  void pageLayout() throws InterruptedException {

selectpage();

List<WebElement> outerLIElementList = driver.findElements(By.xpath(".//* 
[@id='root']/div/div[1]/div/div[*]"));

System.out.println(outerLIElementList.size());

// iterate through the rows in the outer element
for (WebElement outerLIElement : outerLIElementList) {

// find the inner table rows using the outer table row
List<WebElement> innerLIElementList = 
outerLIElement.findElements(By.xpath("//div[2]/div[*]/section"));
System.out.println(innerLIElementList.size());


// iterate through the inner table rows and sysout
for (WebElement innerLIElement : innerLIElementList) {
Thread.sleep(5000);
int attempts = 0; 

while (attempts<2){
try {

Actions builder = new Actions(driver);
builder.moveToElement(innerLIElement).build().perform();
System.out.println(innerLIElement.getText());

builder.moveToElement(innerLIElement).click(innerLIElement);
builder.perform();  

break;
} 
catch (StaleElementReferenceException e){   
                     } 
                      attempts++;
                    } 
driver.findElement(By.xpath(".//[@id='root']/div/div[2]/button[2]")).click();
driver.findElement(By.xpath(".//[@id='root']/div/div/
/div[2]/div/input")).sendKeys("Test");
driver.findElement(By.xpath(".//*[@id='root']/div/div/
/div[2]/button[2]")).click();
Thread.sleep(1000);
selectpage();                       

} }

1 个答案:

答案 0 :(得分:0)

如果我正确地跟随您,那将是您的

List<WebElement> outerLIElementList = driver.findElements(By.xpath(".//* 
[@id='root']div/div[*]"));

过时了。您需要每次查找元素。我将迭代此列表的长度,并基于该迭代找到特定的div。

sudo代码:

for(int child = 0; child<len(outerLIElementList); child++)
    driver.findElement(By.xpath(".//*[@id='root']div/div[{0}]", child));