C# 关于提高使用SeleniumWebDriver迭代表行的方法速度的建议
我使用Selenium Webdriver迭代表中的行,并为每行创建一个T类实例,根据行中的数据设置对象的属性:C# 关于提高使用SeleniumWebDriver迭代表行的方法速度的建议,c#,webdriver,selenium-webdriver,C#,Webdriver,Selenium Webdriver,我使用Selenium Webdriver迭代表中的行,并为每行创建一个T类实例,根据行中的数据设置对象的属性: public override void RefreshElements() { base.RefreshElements(); var browseTableRows = Driver.FindElements(By.CssSelector("table.browse>tbody>tr")); ItemsList = new List<T
public override void RefreshElements()
{
base.RefreshElements();
var browseTableRows = Driver.FindElements(By.CssSelector("table.browse>tbody>tr"));
ItemsList = new List<T>(browseTableRows.Count);
ItemsById = new Dictionary<int, T>(browseTableRows.Count);
foreach (var tr in browseTableRows) {
T item = new T() {
ID = int.Parse(tr.FindElement(By.XPath("td[2]")).Text),
Name = tr.FindElement(By.XPath("td[3]")).Text,
Description = tr.FindElement(By.XPath("td[4]")).Text
};
ItemsList.Add(item);
ItemsById.Add(item.ID, item);
}
}
如果它有用,我正在使用Selenium、.NET 4.0的2.29.1版,并且正在运行Internet Explorer驱动程序。我想到了两件事。首先,为行中的每个单元格调用
FindElement()
。您最好调用row.findelelements(By.TagName(“td”))
并将其索引到它返回的集合中
此外,获取元素的文本是WebDriver中最昂贵的操作之一,因为由于CSS样式,驱动程序必须遍历DOM(上下)以确定父节点和子节点的可见性。如果确定表单元格中没有需要注意的样式,则可以使用JavaScript调用来获取元素的内部文本,而不需要考虑样式
最后,与只从页面按需获取所需信息相比,在这里迭代整个表的效率要低得多。我会重新检查我的方法,这样它就不会依赖于一次迭代整个表。为什么需要为每一行提供一个类实例?还有,有多慢?哪一位慢?实际的
.FindElements
调用?元素的迭代?我相当确定缓慢是由于findelelements
方法,或者是传递给该方法的选择或参数。我已经添加了T类的内容,这样就清楚了。我正在测试的表有34行,处理时间为52秒。如果您切换到其他驱动程序,会有不同吗?是的,FirefoxDriver要快得多。By.Xpath
在IE上非常慢。我们进行了讨论,感谢您的宝贵建议。最后,我选择了您最后的建议:我没有迭代整个表,而是创建了两个新方法来替换RefreshElements
方法-GetItemByIndex(int-index)
和GetItemByID(int-id)
,它们只尝试检索一行。
public class T
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}