带有WebElements的Selenium Webdriver列表

时间:2014-12-10 20:17:36

标签: java selenium

您好我必须从页面中的同一页<a>保存,并且已经class=my_img我将这些元素保存在列表中,然后我尝试进入列表的第一个元素并且之后去了返回获取第二个元素,但selenium给我这个错误

  

线程“main”中的异常   org.openqa.selenium.StaleElementReferenceException:找不到元素   在缓存中 - 也许页面自查找以来已经发生了变化

这是我的代码

    List <WebElement> Element = drivers.findElements(By.cssSelector(".my_img"));
    System.out.println("Megethos"+Element.size());
    System.out.println("Pame stous epomenous \n");
    for (i = 1; i < Element.size(); i++) {
        drivers.manage().timeouts().implicitlyWait(35, TimeUnit.SECONDS);
        System.out.println(i+" "+Element.size());
        System.out.println(i+" "+Element.get(i));
        action.click(Element.get(i)).perform();
        Thread.sleep(2000);
        System.out.println("go back");
        drivers.navigate().back();
        Thread.sleep(6000);
        drivers.navigate().refresh();
        Thread.sleep(6000);

    }

2 个答案:

答案 0 :(得分:2)

您的action.click()和/或navigate()调用导致页面重新加载,导致列表中的WebElement不再有效。将findElements()调用放在循环中:

List <WebElement> Element = drivers.findElements(By.cssSelector(".my_img"));
for (i = 1; i < Element.size(); i++) {
    Element = drivers.findElements(By.cssSelector(".my_img"));
    drivers.manage().timeouts().implicitlyWait(35, TimeUnit.SECONDS);
    System.out.println(i+" "+Element.size());
    System.out.println(i+" "+Element.get(i));
    action.click(Element.get(i)).perform();
    Thread.sleep(2000);
    System.out.println("go back");
    drivers.navigate().back();
    Thread.sleep(6000);
    drivers.navigate().refresh();
    Thread.sleep(6000);

}

答案 1 :(得分:1)

如果主要目的是点击链接并返回上一页,则最好获取&#34; href&#34;所有&#34; a&#34;的属性页面中的元素并导航到每个元素。您跟踪的方式将始终导致 StaleElementReferenceExeception ,就像您导航回原始DOM更改一样。

以下是我建议的方式:

List<WebElement> linkElements = driver.findElements(By.xpath("//a[@class='my_img']"));
System.out.println("The number of links under URL is: "+linkElements.size());

//Getting all the 'href' attributes from the 'a' tag and putting into the String array linkhrefs
String[] linkhrefs = new String[linkElements.size()];
int j = 0;
for (WebElement e : linkElements) {
    linkhrefs[j] = e.getAttribute("href");
    j++;
}

// test each link
int k=0;
for (String t : linkhrefs) {
    try{
        if (t != null && !t.isEmpty()) {
            System.out.println("Navigating to link number "+(++k)+": '"+t+"'");
            driver.navigate().to(t);
            String title;
            title = driver.getTitle();
            System.out.println("title is: "+title);

            //Some known errors, if and when, found in the navigated to page.
            if((title.contains("You are not authorized to view this page"))||(title.contains("Page not found"))
                            ||(title.contains("503 Service Unavailable"))
                            ||(title.contains("Problem loading page")))
            {
            System.err.println(t + " the link is not working because title is: "+title);
            } else {
                System.out.println("\"" + t + "\"" + " is working.");
            }
        }else{
            System.err.println("Link's href is null.");
        }
    }catch(Throwable e){

        System.err.println("Error came while navigating to link: "+t+". Error message: "+e.getMessage());
    }

    System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}