Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于提高使用SeleniumWebDriver迭代表行的方法速度的建议_C#_Webdriver_Selenium Webdriver - Fatal编程技术网

C# 关于提高使用SeleniumWebDriver迭代表行的方法速度的建议

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

我使用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);
    }
}

如果它有用,我正在使用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; }
}