找到元素时陈旧元素参考错误 - >导航回上一页时

时间:2017-03-30 22:26:54

标签: selenium selenium-webdriver

我的WebDriver脚本只是在页面1(产品显示页面)上找到元素,然后单击第一个元素以查看其是否正常工作,然后导航回产品显示页面。

它会抛出Stale Element Reference错误,并且不会单击页面上的第二个元素,表示元素未附加到页面上。

代码是:

public class EcommerceSearchResult {

public static WebDriver driver ;

public static void main(String[] args) throws InterruptedException {

    System.setProperty("webdriver.chrome.driver", "C:\\chromedriver_win32\\chromedriver.exe");
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("http://store.demoqa.com/");
    WebElement searchBox = driver.findElement(By.xpath("//input[contains(@class,'search')]"));
    searchBox.sendKeys("iphone"+"\n");
    List<WebElement>  gridrow 
    = driver.findElements
    (By.xpath(".//*[@id='grid_view_products_page_container']/div/div"));        
    int count = gridrow.size();
    System.out.print(count);
        for(int i = 0 ; i<count ; i++)
        { 
            List<WebElement> listingelementinloop = driver.findElements(By.xpath(".//*[@id='grid_view_products_page_container']/div/div")); 
            System.out.println(gridrow.get(i).getText());   
            listingelementinloop.get(i).click();
            driver.navigate().back();
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

        }

    }
}

3 个答案:

答案 0 :(得分:0)

在循环中,您需要替换以下行:

System.out.println(gridrow.get(i).getText());  

使用

System.out.println(listingelementinloop.get(i).getText()); 

因为,点击浏览器的“后退”按钮后, gridrow 列表中的元素将变为陈旧。

或者,以下是执行相同任务的另一种方式:

public static WebDriver driver ;

public static void main(String[] args) throws InterruptedException {

    System.setProperty("webdriver.chrome.driver", "C:\\chromedriver_win32\\chromedriver.exe");
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("http://store.demoqa.com/");
    WebElement searchBox = driver.findElement(By.xpath("//input[contains(@class,'search')]"));
    searchBox.sendKeys("iphone"+"\n");
    List<WebElement>  gridrow  
    = driver.findElements
    (By.xpath(".//*[@id='grid_view_products_page_container']/div/div"));        
    int count = gridrow.size();
    System.out.print(count);
    for(int i = 1 ; i<=count ; i++)
        { 
            WebElement element =
                driver.findElement(By.xpath(".//*[@id='grid_view_products_page_container']/div/div[" + i + "]")); 
            System.out.println(element.getText());   
            element.click();
            driver.navigate().back();
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

        }

}


}

如果您有任何疑问,请与我们联系。

答案 1 :(得分:0)

问题是您正在循环遍历从页面收集的元素集合。离开该页面或重新加载它后,您存储的元素引用变得陈旧,从而导致错误。解决这个问题的一种方法是使用索引到集合中并循环它。我已经重写了你的代码,以利用函数来处理重复的操作。我已经测试了这段代码并且有效。

main

的一部分
driver.get("http://store.demoqa.com/");
Search("iphone");
for (int i = 0; i < GetProductCount(); i++)
{
    ClickProduct(i);
    driver.navigate().back();
}

和支持功能

public void Search(String searchTerm)
{
    driver.findElement(By.cssSelector("input[value='Search Products']")).sendKeys(searchTerm + "\n");
}

public void ClickProduct(int index)
{
    driver.findElements(By.cssSelector("h2 > a")).get(index).click();
}

public int GetProductCount()
{
    return driver.findElements(By.cssSelector("h2 > a")).size();
}

答案 2 :(得分:0)

以下是您的问题的解决方案代码。在我的计算机和附加的控制台屏幕截图中进行了测试。

import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class EcommerceSearchResult {

   public static WebDriver driver ;

   public static void main(String[] args) throws InterruptedException {

    System.setProperty("webdriver.chrome.driver", "C:\\chromedriver_win32\\chromedriver.exe");
    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("http://store.demoqa.com/");
    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement searchBox = driver.findElement(By.xpath("//input[contains(@class,'search')]"));
    searchBox.sendKeys("iphone"+"\n");
    List<WebElement>  gridrow = driver.findElements(By.xpath(".//*[@id='grid_view_products_page_container']/div/div"));        
    int count = gridrow.size();
    System.out.print(count+"\n");
    for(int i = 0 ; i<count ; i++)
    { 
        WebElement listingelementinloop = driver.findElement(By.xpath(".//*[@id='grid_view_products_page_container']/div/div["+(i+1)+"]")); 
        System.out.println(listingelementinloop.getText());
        listingelementinloop.findElement(By.xpath(".//div/a")).click();
        wait.until(ExpectedConditions.urlContains("products-page/product-category"));
        driver.navigate().back();
        wait.until(ExpectedConditions.titleIs("iphone | Search Results | ONLINE STORE"));
    }
    }
    }

enter image description here