C#如何将Selenium WebElement保存在内存中,以便有时间了解其详细信息
我正试图用Selenium和C#监视一个网站,看看是否有新的项目出现在它上面。 在这个网站中,我有一个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” 我
元素列表,它像一个包含许多子div的表一样显示。
我定期读取所有显示的div,并检查是否存在新的div。
但是div的数量是有限的,当一个新元素出现时,最旧的元素会被删除,这会对我的代码造成问题
示例:项目的最大数量为3
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结构。