获取异常:在缓存中找不到元素 - 也许页面在查找后已更改

时间:2016-03-07 10:13:13

标签: selenium selenium-webdriver selenium-ide selenium-rc

点击链接后我到达了一个页面。我还没有点击该页面上的任何内容。仍然,只要页面加载它就会抛出一个错误: 在缓存中找不到元素 - 自查询以来页面可能已更改

List<WebElement> securityGroup = driver.findElements(By.cssSelector("td[class='button-col']>a:nth-of-type(2)"));
System.out.println(securityGroup.size());

Thread.sleep(5000);

for(WebElement link:securityGroup) {
    String b= link.getAttribute("href");
    boolean a= b.contains(data0);

    if(a){
        System.out.println(b);
        Thread.sleep(5000);
        System.out.println("before clicking link");
        link.click();   

        //After this new page opens and above error comes.**
    }else {
        System.out.println("No match found");
    }
}

Thread.sleep(5000);

Select sel = new Select(driver.findElement(By.xpath("//select[@name='groupId']")));
System.out.println(sel.getOptions().toString());
sel.selectByValue("TEST");

3 个答案:

答案 0 :(得分:1)

这是因为for循环。 您正在查找securityGroup这是一个列表,您正在遍历列表。在此for循环中,您将查找条件,如果是,则继续单击该链接。但这里的问题是列表迭代没有完成,for循环继续。但它不会找到下一次迭代的String b= link.getAttribute("href");,因为你在新页面上。

一旦条件满足,使用break来打破循环。

if(a){
    System.out.println(b);
    Thread.sleep(5000);
    System.out.println("before clicking link");
    link.click();   
    break;
}else {
    System.out.println("No match found");
}

答案 1 :(得分:0)

没有足够的时间加载页面并获取元素:

driver.findElement(By.xpath("//select[@name='groupId']"))

在初始化驱动程序

后尝试执行ImplicitlyWait
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Thread.sleep(5000);使用selenium是个坏主意,等待selenium methods

答案 2 :(得分:0)

当您点击link并重定向到另一个页面时,驱动程序会丢失securityGroup。这就是引起异常的原因。

您需要重新定位每个securityGroup

List<WebElement> securityGroup = driver.findElements(By.cssSelector("td[class='button-col']>a:nth-of-type(2)"));
int size = securityGroup.size(); 

for (int i = 0 ; i < size ; ++i) {
    securityGroup = driver.findElements(By.cssSelector("td[class='button-col']>a:nth-of-type(2)"));
    WebElement link = securityGroup.get(i);

    String b = link.getAttribute("href");
    boolean a = b.contains(data0);

    if(a) {
        System.out.println(b);
        Thread.sleep(5000);
        System.out.println("before clicking link");
        link.click();
    }
    else {
        System.out.println("No match found");
    }
}