2

我正在尝试打印谷歌搜索中显示的前 5 页链接。但是得到 StateElementReferenceException 不确定哪个出错了。

    public class GoogleCoInTest {

    static WebDriver driver = null;
    public static void main(String[] args) throws InterruptedException {
        System.setProperty("webdriver.gecko.driver", "D:\\bala back up\\personel\\selenium\\Jars\\Drivers\\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();
        List<WebElement> fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));


        for(int i=0;i<5;i++){
            System.out.println(fiveLinks.get(i).getText());
            fiveLinks.get(i).click();
            Thread.sleep(5000);
            printLinksName();


        }
    }   


    public static void printLinksName() throws InterruptedException{

        List<WebElement> 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<allLinks.size();i++){
            System.out.println("Sno"+(i+1)+":"+allLinks.get(i).getText());

        }   
    }
}

它可以打印到第二页,但是在我得到之后

Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: The element reference of <a class="fl"> stale: either the element is no longer attached to the DOM or the page has been refreshed
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
4

3 回答 3

0

您的脚本正在尝试单击第一页中的每个链接,这会将您带到一个新页面。一旦完成该页面上的工作,它似乎不会返回到第一页,因此脚本无法在您的列表中找到下一个链接。

即使它确实返回到第一页,您仍然会有一个陈旧的元素,因为该页面已被重新加载。您需要通过其他方式(比如 href 可能?)跟踪第一页中的链接,并在单击之前通过该标识符再次找到该链接。

于 2017-07-07T12:42:58.320 回答
0

这是由于在移动到另一个页面后引用了对象。请尝试在最后的 for 循环中添加以下行。它可以解决陈旧的参考问题。

    driver.navigate().back();
    fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));
于 2017-07-07T12:47:58.173 回答
0

有几件事:

  1. 您的脚本按预期打印前 2 页的结果。
  2. 当您printLinksName()第一次调用时,它会起作用。
  3. 接下来,您将 10 个 PageNumbers 存储在Generic ListtypeWebElement中。
  4. 第一次在for()循环中单击WebElementofPage 2然后通过调用打印所有链接printLinksName()
  5. 当您在循环内进行第二次迭代时,由于 DOM 发生了变化for(),对的引用List<WebElement> fiveLinks丢失了。因此,你看StaleElementReferenceException

解决方案

要避免的一个简单解决方案是在循环StaleElementReferenceException中移动代码行。所以你的代码块看起来像:List<WebElement> fiveLinks=driver.findElements(By.xpath(".//*[@id='nav']/tbody/tr/td/a"));for()

    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<WebElement> 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<WebElement> 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<allLinks.size();i++)
            {
            System.out.println("Sno"+(i+1)+":"+allLinks.get(i).getText());

            }   
        }

    }

注意:在这个简单的解决方案中,当您完成打印第二页时,接下来您将List<WebElement> fiveLinks通过xpathwith.//*[@id='nav']/tbody/tr/td/a第二次创建,Page 1 是存储在fiveLinks列表中的第一个元素。因此,您可能会再次被重定向到Page 1. 为避免这种情况,您可以考虑xpath使用正确的索引来帮助。

于 2017-07-07T13:43:56.707 回答