C#如何将SeleniumWebElement保存在内存中,以便有时间获取其详细信息



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

示例:最大项目数为3。

  1. 我得到3个项目A、B、C
  2. 出现一个新项目D
  3. 我读取了显示的3个项目:当我读取D的所有子div时,一个新项目E出现,D被移动,我得到一个错误,比如"Element不再附加到DOM">

我得到这个错误是因为所有D子div的读取太长。

我正在使用FindElement(By.Name("elemName")获取Web元素有没有一种方法可以将元素保留在内存中,即使这个元素是从DOM中移动或移除的?

谢谢!

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

要回答您的问题。。。。。我不完全确定这是否可能,在不删除您提到的旧div的情况下存储WebElement本身。

我建议的唯一解决方法是创建自己的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.

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

最新更新