从列表访问元素时获取过时元素引用异常

x7yiwoj4  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(284)

下面是我正在努力工作的代码。

//Method to fetch all links from the sitemap container

public void GetAllLinks() {

        WebElement pointer = LinksContainer;
        String url = "";
        List <WebElement> allURLs = pointer.findElements(By.tagName("a"));
        System.out.println("Total links on the page: "+ allURLs.size());

        for (int i=0; i<allURLs.size(); i++) {

            WebElement link = allURLs.get(i);
            url = link.getAttribute("href");

            OpenAllLinks(url);
        }
    }

    //Method to hit all the fetched URLs

    public void OpenAllLinks(String linkURL) {

        driver.get(linkURL);
}

我从一个站点Map页面获取所有锚元素,然后将所有这些元素放入一个列表中。然后,我使用 getAttribute(href) . 在这里之前,代码运行良好。
但是,在这之后,我将这些URL作为参数传递到方法中 OpenAllLinks() 要逐个打开所有这些URL,请使用 driver.get() . 代码一直工作到第一个链接,但一旦加载了第一个页面,就会出现stale元素异常。

t1qtbnec

t1qtbnec1#

此时,您将离开显示所有这些链接的页面,所有web元素都将显示在该页面中 allURLs 列出过时的元素。
您可以做的是首先提取所有链接并保存在列表中,而不是web元素,然后循环打开所有这些链接。
这样地:

public void GetAllLinks() {

    WebElement pointer = LinksContainer;
    String url = "";
    List <WebElement> allURLs = pointer.findElements(By.tagName("a"));
    System.out.println("Total links on the page: "+ allURLs.size());
    List<String>links = new ArrayList<>();

    for (int i=0; i<allURLs.size(); i++) {

        WebElement link = allURLs.get(i);
        url = link.getAttribute("href");
        links.add(url);    
    }

    for (int i=0; i<links.size(); i++) {

        OpenLink(links.get(i));
    }
}

//Method to open the fetched URLs

public void OpenLink(String linkURL) {        
    driver.get(linkURL);
}

相关问题