2

我正在使用 Selenium Webdriver 迭代表的行并为每一行创建类 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);
    }
}

这段代码很慢。关于如何加快此代码的任何建议?

为了清楚起见,T 类没有做任何详细说明:

public class T
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

如果有用,我使用的是 Selenium 的 2.29.1 版本,.NET 4.0,并且我正在运行 Internet Explorer 驱动程序。

4

1 回答 1

3

我想到了两件事。首先,您正在调用FindElement()行中的每个单元格。您最好调用row.FindElements(By.TagName("td"))并索引到它返回的集合。

此外,获取元素的文本是 WebDriver 中最昂贵的操作之一,因为由于 CSS 样式,驱动程序必须遍历 DOM(向上和向下)以确定父节点和子节点的可见性。如果您确定表格单元格中没有需要注意的样式,则可以使用 JavaScript 调用来获取元素的内部文本,它不关心样式。

最后,像您在此处所做的那样遍历整个表将比仅按需从页面获取所需信息的效率低得多。我会重新检查我的方法,因此它不依赖于一次遍历整个表。

于 2013-01-24T23:36:34.847 回答