当前位置: 首页 > 知识库问答 >
问题:

查找元素->导航回上一页时出现陈旧元素引用错误

欧阳飞章
2023-03-14

我的WebDriver脚本只是在第1页(产品展示页)上找到元素,然后单击第1个元素,看看它是否工作,然后导航回产品展示页。

它抛出过时的元素引用错误,并且没有单击页面上的第二个元素,表示元素没有附加到页面。

代码是:

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个答案

南宫奇思
2023-03-14

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

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"));
    }
    }
    }
谢骏奇
2023-03-14

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

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();
}
戈正初
2023-03-14

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

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

        }

}


}

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

 类似资料:
  • 我有一个下拉列表,我第一次能够按索引选择元素。当我第二次尝试选择元素时,它会抛出陈旧的元素引用错误。我尝试了try catch block,显式等待,但没有任何效果。

  • 我有一个客户想要从网站上抓取一些信息。循环第一次工作,但第二次发生错误。有什么帮助吗?我也不建议去实际的网站,它很粗略。 代码: 错误: selenium.common.exceptions.StaleElementReferenceException:消息:陈旧的元素引用:元素未附加到页面文档 完全终端回溯: 完成回溯(最近的最后一次调用):文件"c:\用户\Heage\Coding\自由职业\

  • 问题内容: 在我的C#应用​​程序中使用Selenium Web驱动程序时,出现以下错误: OpenQA.Selenium.StaleElementReferenceException:陈旧元素引用:元素未附加到页面文档 在此代码中: 错误行在中,但这是在XPath之前指定的相同链接中成功执行但在最后一次尝试中失败的过程!那么这个错误是什么意思以及如何解决呢? 问题答案: 这意味着在页面中更改的元

  • 我试图点击以下按钮使用xpath在selenium, 我试过下面的代码, 我得到以下错误, 组织。openqa。硒。StaleElementReferenceException:stale元素引用:元素未附加到页面文档 我想我之所以面临这个问题,是因为它是作为一个div而不是按钮封闭的。

  • 我正在写一个小的抓取程序,它导航到一个包含链接列表的页面, 它单击第一个链接,打开一个新页面,获取一些详细信息,然后导航回包含链接列表的页面,然后尝试查找下一个链接,但我得到: 组织。openqa。硒。StaleElementReferenceException:stale元素引用:元素未附加到页面文档 你知道我该怎么避免吗?

  • 我试图自动化YouTube搜索,点击搜索结果,然后跟随右侧的推荐视频。我写的代码进入youtube,进行搜索,点击视频,视频就会在浏览器上打开。但是,我不能带它点击其中一个推荐的视频。 问题似乎在于,当我使用从右边获取推荐视频元素的列表时,我得到的是上一页的列表(当我第一次输入单词并获得搜索结果时)。 当我使用直接转到视频链接时,代码确实可以正常工作,而不是先进行搜索。 所以当我点击(最后一行)时