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を使用しており、InternetExplorerドライバーを実行しています。

4

1 に答える 1

3

2つのことが思い浮かびます。FindElement()まず、行の各セルを呼び出しています。row.FindElements(By.TagName("td"))それによって返されたコレクションを呼び出してインデックスを作成する方がよいでしょう。

また、要素のテキストを取得することは、WebDriver で最もコストのかかる操作の 1 つです。これは、ドライバーが DOM を (上下に) 移動して、CSS のスタイリングにより親ノードと子ノードの可視性を判断する必要があるためです。表のセルに注意が必要なスタイリングがないことが確実な場合は、代わりに JavaScript 呼び出しを使用して、スタイリングを気にしない要素の内部テキストを取得できます。

最後に、ここで行っているようにテーブル全体を反復処理すると、ページから必要な情報をオンデマンドで取得するよりも効率が大幅に低下します。テーブル全体を一度に反復処理することに依存しないように、アプローチを再検討します。

于 2013-01-24T23:36:34.847 に答える