【问题标题】:Stale Element reference error on finding the element -> when navigates back to previous page查找元素时出现过时元素引用错误 -> 导航回上一页时
【发布时间】:2017-03-30 22:26:53
【问题描述】:

我的 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);

        }

    }
}

【问题讨论】:

    标签: selenium selenium-webdriver


    【解决方案1】:

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

    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);
    
            }
    
    }
    
    
    }
    

    如果您还有任何疑问,请告诉我。

    【讨论】:

      【解决方案2】:

      问题在于您正在循环浏览从页面收集的元素集合。一旦您离开该页面或重新加载它,您存储的元素引用就会过时,因此会出现错误。解决这个问题的一种方法是在集合中使用一个索引并循环它。我已经重写了您的代码以利用函数来处理重复的操作。我已经测试了这段代码,它可以工作。

      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();
      }
      

      【讨论】:

      • 如果您发现这个(或任何)答案有帮助,请点赞。如果这回答了您的问题,请将其标记为已接受的答案。谢谢!
      【解决方案3】:

      以下是您问题的解决方案代码。在我的机器上测试过,并附上控制台截图。

      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"));
          }
          }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-20
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多