我正试图用Selenium和C#监视一个网站,以查看是否有新项目出现在上面。在这个网站中,我有一个<div class="myClass">
元素的列表,显示得像一个包含许多子div的表。我定期读取所有显示的div,并检查是否存在新的div。但是div的数量是有限的,当一个新元素出现时,最旧的元素就会被删除,这会给我的代码带来问题。
示例:最大项目数为3。
- 我得到3个项目A、B、C
- 出现一个新项目D
- 我读取了显示的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.
这是一个有点棘手的解决方案,但我个人从未找到解决您所描述的问题的方法。我很想知道是否有其他人对此有解释或更好的解决方案。