C#如何将Selenium WebElement保留在内存中以有时间获取其详细信息

我正在尝试使用Selenium和C#监视网站,以查看是否有新项目出现。 在此网站内,我有一个<div class="myClass">元素列表,就像一个带有许多子div的表一样显示。 我会定期阅读所有显示的div,并检查是否有新的div。 但是div的数量是有限的,当出现一个新元素时,最旧的元素将被删除,这在我的代码中造成了问题。

示例:最大项目数为3。

  1. 我得到3个项目, A,B,C
  2. 出现新项目 D
  3. 我阅读了显示的3个项目:当我阅读 D 的所有子分区时,会出现一个新项目 E ,而 D 是移动,出现类似“元素不再连接到DOM”的错误

我收到此错误,是因为所有 D 子div的读数都太长了。

我正在使用FindElement(By.Name("elemName")获取网络元素 有一种方法可以将元素保留在内存中,即使该元素已从DOM中移动或从DOM中删除?

谢谢!

lotusdy 回答:C#如何将Selenium WebElement保留在内存中以有时间获取其详细信息

这是我过去遇到的一个有趣的问题。通过一些令人沮丧的调试会话,我发现WebElement对象是根据页面上可见的内容动态变化的。我将检索一个List<WebElement>,在页面上进行一些更改,然后注意到我的List<>实际上会随着页面上的内容而变化。

要回答您的问题.....我不确定是否可以存储WebElement本身,而不删除您提到的旧div

对此,我建议的唯一解决方法是创建您自己的Element类并将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.

这有点棘手,但我个人从未找到解决您所描述问题的解决方法。我很想知道是否有人对此有解释或更好的解决方案。

本文链接:https://www.f2er.com/3151354.html

大家都在问