1

テーブルの処理にSelenium2.0、Firefox 11.0、およびJavaを使用しています。tdセルで構成されるテーブル要素があります。一部にはspan要素に含まれるテキストが含まれ、その他には値属性にテキストが含まれる入力要素が含まれます。私の目標は、すべてのセルのテキストを取得して、テーブルの内容を出力し、それらを期待値と比較できるようにすることです。私はちょうどこのようなことをするだろうと思った:

Locate the table WebElement by id
List<WebElement> cells = tableElem.findElements(By.xpath(".//td"));

次に、すべてのセルをループして、xpath ".//input"を指定してfindElementsを実行します。リストが空の場合は、webElementでgetTextを実行し、リストが空でない場合は、input要素でgetAttributeを実行します。 。

しかし、驚いたことに、これはFirefoxで実行するのに数分かかりました(テストされるはずのIEで試してみるのが怖いです)。私がデバッグするとき、ボトルネックが私を殺しているtdからの.//入力検索であることは明らかです。それは10秒以上なので、ほんの数個のセルでさえ、私のテストは永遠にかかります。私はxpathのあらゆる種類のマイナーなバリエーションを試し、cssセレクターに移動してみましたが、同じ結果が得られ続けています。

この問題に別の方法で取り組む方法、または現在の方法を最適化する方法についてアドバイスが必要です。私はこれが数秒しかかからないことを望んでいました。

私が経験している減速を説明するためのサンプルコードをいくつか含めました。これは私がスクリーンスクレイピングしているWebサイトではありませんが、速度は同じです。

    webDriver.navigate().to("https://accounts.google.com/NewAccount");
    List<WebElement> TDxpath = webDriver.findElements(By.xpath("//td"));
    List<WebElement> TDcss = webDriver.findElements(By.cssSelector("td"));
    for (WebElement td : TDcss) {
        List<WebElement> q = td.findElements(By.cssSelector("input"));
    }
    for (WebElement td : TDxpath) {
        List<WebElement> r = td.findElements(By.xpath(".//input"));
    }
4

1 に答える 1

0

本当にブラウザが必要ですか?あなたは試すことができますHtmlUnitDriver、それは非常に速いでしょう!

または、JSとして実行することもできます。これもほんのわずかな時間で済み、スクリプトから取得できListsます。

(JavascriptExecutor)driver.executeScript(
    "var tds = document.getElementsByTagName('td');"
    "for (var i = 0; i < tds.length; i++) {" +
    "   var inputs = tds[i].getElementsByTagName('input');" +
    "}"
    );
于 2012-05-22T22:49:54.840 に答える