C#如何将Selenium WebElement保存在内存中,以便有时间了解其详细信息

C#如何将Selenium WebElement保存在内存中,以便有时间了解其详细信息,c#,html,selenium,dom,C#,Html,Selenium,Dom,我正试图用Selenium和C#监视一个网站,看看是否有新的项目出现在它上面。 在这个网站中,我有一个元素列表,它像一个包含许多子div的表一样显示。 我定期读取所有显示的div,并检查是否存在新的div。 但是div的数量是有限的,当一个新元素出现时,最旧的元素会被删除,这会对我的代码造成问题 示例:项目的最大数量为3 我得到3个项目A、B、C 此时会出现一个新项目D 我读取了3个显示的项:当我读取D的所有子div时,一个新项E出现,并且D被移动,我得到一个错误,如“元素不再连接到DOM” 我

我正试图用Selenium和C#监视一个网站,看看是否有新的项目出现在它上面。 在这个网站中,我有一个
元素列表,它像一个包含许多子div的表一样显示。 我定期读取所有显示的div,并检查是否存在新的div。 但是div的数量是有限的,当一个新元素出现时,最旧的元素会被删除,这会对我的代码造成问题

示例:项目的最大数量为3

  • 我得到3个项目A、B、C
  • 此时会出现一个新项目D
  • 我读取了3个显示的项:当我读取D的所有子div时,一个新项E出现,并且D被移动,我得到一个错误,如“元素不再连接到DOM”
  • 我得到这个错误是因为所有D子div的读取太长

    我使用
    FindElement(By.Name(“elemName”)
    是否有一种方法可以将元素保留在内存中,即使该元素已从DOM中移动或移除


    谢谢!

    这是我在过去遇到的一个有趣的问题。通过一些令人沮丧的调试会话,我发现我的
    WebElement
    对象根据页面上可见的内容动态变化。我将检索
    列表
    ,更改页面上的某些内容,并注意到我的
    列表
    将实际上,页面上的内容会发生变化

    为了回答您的问题……我不完全确定是否可以存储
    WebElement
    本身,而不删除您提到的旧
    div

    我建议的唯一解决方法是创建您自己的
    元素
    类,并将
    WebElements
    分配给该类,这样您基本上可以创建您自己的元素“缓存”

    这里有一个小例子:

    
    public class Element
    {
        public string TagName { get; set; }
        public string Text { get; set; }
        public bool Displayed { get; set; }
        // any other attributes you want to store here
    }
    
    public List<Element> StoreWebElements(List<IWebElement> seleniumElements)
    {
        var result = new List<Element>();
        foreach (var elem in seleniumElements)
        {
           result.Add(new Element { TagName = elem.TagName,
                                    Text = elem.Text, 
                                    Displayed = elem.Displayed
                                   };
        }
    }
    
    
    // your code
    var divList = Driver.FindElements(By.Name("elemName"));
    
    // "store" the elements
    var cachedElements = StoreWebElements(divList);
    
    // do something on the page to change it 
    // divList will change, but cachedElements will stay the same.
    
    
    
    公共类元素
    {
    公共字符串标记名{get;set;}
    公共字符串文本{get;set;}
    公共bool显示{get;set;}
    //要存储在此处的任何其他属性
    }
    公共列表存储WebElements(列表元素)
    {
    var result=新列表();
    foreach(硒元素中的可变元素)
    {
    结果.Add(新元素{TagName=elem.TagName,
    Text=元素Text,
    显示=元素显示
    };
    }
    }
    //你的代码
    var divList=Driver.FindElements(By.Name(“elemName”);
    //“存储”元素
    var cachedElements=StoreWebElements(divList);
    //在页面上做一些更改
    //divList将更改,但cachedElements将保持不变。
    
    这是一个有点粗糙的解决方案,但我个人从未找到解决您所描述问题的方法。我很想知道是否有其他人对此有解释或更好的解决方案。

    请发布您正在使用的C代码,以及HTML结构。