2

selenium-dotnet-2.0a5を使用して多くのテーブルを反復処理しようとしていますが、xpathを使用する必要があります。例えば;

var tableRows = _table.FindElements(By.TagName("tr"));

foreach (var row in tableRows)
{ 
    row.FindElements(By.XPath("td|th"));
    //iterate through tablecells and get text of each
}

約50行、Firefox 0〜2秒、Chrome 6〜8秒、IE 60〜70秒を反復する平均時間。

ほとんどのテストはIEで実行する必要がありますが、xpathのパフォーマンスを向上させるために何ができるかについてのヒントはありますか?

4

2 に答える 2

2

私は常にセレン1で同じ問題を抱えていましたが、サードパーティのxpathライブラリを更新することで改善しましたが、これがセレン2にまだ適用されるかどうかはわかりませんでした...しかし、最終的にはブラウザにネイティブでないと十分な速さではありませんでした。

結局、あなたの例のようなものが必要で、CSSセレクターがそれをカットしない場合は、セレンからDOM全体を返し、別のライブラリを使用してコード内のツリーを解析し、その方法で繰り返します。少し汚いハックですが、遅いIExpathを使用してあなたを回避します。

于 2010-09-14T07:17:24.587 に答える
1

HTMLを変更するためのアクセス権がある場合は、テーブルのデータ要素にクラス宣言を入れてみてください。次に、XPathの代わりにBy.ClassNameを使用できます。

しかし、先に進む前に、あなたは正確に何をしようとしていますか?それは奇妙に思えます

CssSelectorsが.NetとIEで完全にサポートされると、それは素晴らしいオプションになりますが、今のところ信頼性はありません。今のところ、ドキュメントは標準モードでレンダリングする必要があることを忘れないでください。

tdとthではなくtdだけを見ることを検討する必要があります。それは確かに実行可能ですが、ある程度の複雑さを追加します。簡単にするために、以下でそれを行いました。通常、あなたはそれらがいくつあり、それらが何を保持しているかを知っており、それらを別々に扱います。

私が見つけたコードに入ると、By.TagNameに行くのが少しスピードアップしました。これには、43行4列で約20秒かかりました。

        IWebElement table = driver.FindElement(By.TagName("table"));
        ReadOnlyCollection<IWebElement> cells = table.FindElements(By.TagName("td"));
        foreach (IWebElement cell in cells)
        {
            Console.WriteLine(cell.Text);
        }

しかし、次に、ページソースをメモリにロードし、HtmlAgilityPackを使用してページを解析してみました。XMLパーサーを使用してhtmlドキュメントを読むことに注意してください。htmlは完全なXMLではない可能性があります。次のコードは96ミリ秒かかりました

        HtmlDocument html = new HtmlDocument();
        html.LoadHtml(driver.PageSource);
        HtmlNodeCollection nodeCollect =  html.DocumentNode.SelectNodes("//td");
        foreach (HtmlNode node in nodeCollect)
        {
            Console.WriteLine(node.InnerText);
        }

ページソースの読み込みと解析を行います。必要な場合は、ドキュメントチェック要素を繰り返し処理します。ナビゲート/対話する必要がある場合は、ドライバーに戻ります。

于 2010-09-14T22:31:13.947 に答える