【问题标题】:Suggestions on improving speed of method that uses Selenium Webdriver to iterate rows of a table关于提高使用 Selenium Webdriver 迭代表行的方法速度的建议
【发布时间】:2013-01-08 11:13:46
【问题描述】:

我正在使用 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 驱动程序。

【问题讨论】:

  • 每一行都需要一个类实例的原因是什么?另外,有多慢?哪个 bit 慢?实际的.FindElements 电话?遍历元素?
  • 我相当确定缓慢是由于FindElements 方法,或者传递给该方法的选择或参数。我已经添加了类 T 的内容,以便清楚。我正在测试的表有 34 行,处理时间为 52 秒。
  • 换一个驱动会有影响吗?
  • 是的,FirefoxDriver 更快。
  • By.Xpath 在 IE 上非常慢。我们进行了讨论here

标签: c# webdriver selenium-webdriver


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的建议。最后我选择了你的最后一个建议:我没有迭代整个表,而是创建了两个新方法来替换 RefreshElements 方法 - GetItemByIndex(int index)GetItemByID(int id),它们只尝试检索一行。
  • 我建议使用 JS 或 html 解析器将表格传递给它。只需比较execute_script('return arguments[0].innerText', cell_webel)cell_webel.text,第一种情况需要 2 秒,第二种情况需要 6 秒。这是显着的区别......
猜你喜欢
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
  • 2022-01-04
  • 2019-09-27
相关资源
最近更新 更多