Getting StaleElementReferenceException while trying print the link names

前端 未结 3 1497
臣服心动
臣服心动 2020-12-02 02:28

I\'m trying to print first 5 pages links displayed in google search.. But getting StateElementReferenceException Not sure which one went wrong..

    public          


        
3条回答
  •  一生所求
    2020-12-02 03:13

    A couple of things:

    1. Your script prints the result from the first 2 pages as expected.
    2. When you call printLinksName() for the first time it works.
    3. Next, you are storing the 10 PageNumbers in a Generic List of type WebElement.
    4. First time within the for() loop you are clicking on the WebElement of Page 2 and then printing all the links by calling printLinksName().
    5. While you are in the second iteration within for() loop, the reference of List fiveLinks is lost as the DOM have changed. Hence, you see StaleElementReferenceException.

    Solution

    A simple solution to avoid StaleElementReferenceException would be to move the line of code List fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a")); with in the for() loop. So your code block will look like:

        import java.util.List;
        import java.util.concurrent.TimeUnit;
    
        import org.openqa.selenium.By;
        import org.openqa.selenium.Keys;
        import org.openqa.selenium.WebDriver;
        import org.openqa.selenium.WebElement;
        import org.openqa.selenium.firefox.FirefoxDriver;
    
        public class Q44970712_stale 
        {
    
            static WebDriver driver = null;
    
            public static void main(String[] args)  throws InterruptedException
            {
            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            driver=new FirefoxDriver();
            driver.manage().window().maximize();
            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            driver.get("https://www.google.co.in/");
            //driver.findElement(By.xpath("//input[class='gsfi']")).sendKeys("Banduchode");;
            WebElement search=driver.findElement(By.cssSelector("input#lst-ib"));
            search.sendKeys("Banduchode");
            search.sendKeys(Keys.ENTER);
            printLinksName();
    
    
    
            for(int i=0;i<5;i++)
            {
                List fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));
                System.out.println(fiveLinks.get(i).getText());
                fiveLinks.get(i).click();
                Thread.sleep(5000);
                printLinksName();
            }
            }
    
            public static void printLinksName() throws InterruptedException
            {
                List allLinks=driver.findElements(By.xpath("//*[@id='rso']/div/div/div/div/div/h3/a"));
                System.out.println(allLinks.size()); 
    
                //print all list        
                for(int i=0;i

    Note: In this simple solution when you finish printing the second page, next when you will create List fiveLinks through xpath with .//*[@id='nav']/tbody/tr/td/a for second time, Page 1 is the first element which gets stored in the fiveLinks List. Hence you may be again redirected to Page 1. To avoid that you may consider to take help of xpath with proper indexing.

提交回复
热议问题