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

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

曹原
2023-03-14

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

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

我从一个站点地图页面获取所有锚元素,然后将所有这些元素放入一个列表中。然后,我使用getAttribute(href)从所有这些元素获取URL。在这里之前,代码运行良好。

然而,之后我将这些URL作为参数,并将其传递到方法OpenAllLinks(),以使用驱动程序逐个打开所有这些URL。get()。代码一直工作到第一个链接,但一旦加载了第一个页面,就会出现stale元素异常。

共有1个答案

李睿
2023-03-14

在你离开页面的时候,所有这些链接都出现在allURLs列表中的所有web元素都变成了过时的元素
您可以做的是首先提取所有链接并保存在列表中,而不是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);
}
 类似资料:
  • 我试图创建一个并发的数据结构,它允许一个线程轮询随机元素,而另一个线程正在写入它。 我担心的是:在极端情况下,例如,在线程A调用(在中)之后,线程B删除最后一个元素。不幸的是,随机索引恰好是最后一个元素(已被删除)的索引。因此,调用将抛出未捕获的。这是我所不期望的-调用失败,即使此列表中仍有元素。 所以我想问:我的担心是真的吗?也许我误解了(或任何其他类型的并发列表)实际上是做什么的?如果我的担心

  • 我能够使用以下代码成功加载基于XML的属性文件: 我的财产文件代码 但是,当我运行这个时,我得到以下异常: 引起:org.xml.sax.SAXParseExc0019:元素类型属性的内容必须匹配(注释?,条目*)。在org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseExc0019(未知来源)在org.apache.xerces.ut

  • 示例代码: 我正在类A中的页面上创建WebElement列表,在类B中,我试图单击第一个元素。 在执行时,我得到以下例外: 问题与findElement有关,因为当我在代码中手动使用findElement方法将元素添加到列表中时,代码运行良好。 在下面的示例中,我对findElements行进行了注释,并手动添加了元素,这段代码运行良好。 有人能告诉我出了什么问题吗?

  • 我正在使用以下代码检索我的链接: 接下来,我呼吁: 然后 并且抛出过时的元素异常。 现在,考虑到,我本以为可以避免这个问题,但它仍然存在。 我很想在加载页面源代码后,将其放入lxml中,以完全避免这个问题。 建立和迭代链接之间的时间最多为一秒钟。 有没有其他人遇到过这样的问题,并找到了解决方案? 感谢您的指导。

  • 当已知Python列表总是包含单个项时,除了: 你可能会问,'你为什么要这么做?‘。仅仅是好奇心。在Python中似乎有一种替代的方法来完成所有的事情。

  • 我有这个网站:http://embed.plnkr.co/Bs5iDqtXSSnvye2ORI6k/preview 代码: 和以下规格: 这种配置: 当我运行Protractor时,会出现以下错误: StaleElementReferenceError:过时元素引用:元素未附加到页面文档(会话信息:chrome=43.0.2357.81) (驱动程序信息:chronidriver=2.15.322