2 Stimmen

Selenium 2.0 IE Xpath Leistung

Ich versuche, selenium-dotnet-2.0a5 zu verwenden, um durch viele Tabellen zu iterieren, und muss xpath verwenden. z.B;

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
}

Durchschnittliche Zeit für die Iteration durch etwa 50 Zeilen, Firefox 0-2 Sekunden, Chrome 6-8 Sekunden, IE 60-70 Sekunden.

Die meisten meiner Tests müssen in IE ausgeführt werden, alle Tipps auf was kann ich tun, um bessere xpath Leistung zu erhalten?

2voto

Bill Punkte 429

Ich hatte immer das gleiche Problem mit Selenium 1, ich verbesserte es durch die Aktualisierung der 3rd Party xpath Bibliothek, die es verwendet, nicht sicher, ob dies immer noch gilt für Selenium 2 ... aber letztlich, ohne dass es nativ auf den Browser war es nicht schnell genug.

Am Ende, wenn ich brauchte, um so etwas wie Ihr Beispiel und CSS-Selektoren einfach nicht schneiden würde ich nur zurückgeben, die gesamte DOM von Selenium und parsen den Baum in Code mit einer anderen Bibliothek und iterieren durch es auf diese Weise. Bit von einem schmutzigen Hack, aber bekommt um Sie mit langsamen IE xpath.

1voto

pnewhook Punkte 4029

Wenn Sie die Möglichkeit haben, den HTML-Code zu ändern, versuchen Sie, eine Klassendeklaration für die Datenelemente der Tabelle einzufügen. Dann könnten Sie By.ClassName anstelle von XPath verwenden.

Aber bevor ich weitermache: Was genau wollen Sie eigentlich erreichen? Es scheint merkwürdig, dass

Sobald CssSelectors vollständig in .Net und IE unterstützt wird, wird es eine großartige Option sein, aber im Moment ist es nicht zuverlässig. Denken Sie daran, für jetzt, Ihr Dokument muss im Standardmodus gerendert werden.

Sie sollten in Betracht ziehen, nur td und nicht td und th zu betrachten. Das ist zwar durchaus machbar, bringt aber eine gewisse Komplexität mit sich. Ich habe das unten der Einfachheit halber gemacht. Normalerweise wüssten Sie, wie viele th es gibt und was sie enthalten, und würden sie separat behandeln.

Bei der Analyse des Codes stellte ich fest, dass es eine leichte Beschleunigung gab, wenn ich zu By.TagName ging. Dies dauerte etwa 20 Sekunden über 43 Zeilen und 4 Spalten.

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

Aber dann habe ich versucht, den Seitenquelltext in den Speicher zu laden und die Seite mit dem Befehl HtmlAgilityPack . Seien Sie vorsichtig bei der Verwendung von XML-Parsern zum Lesen von Html-Dokumenten, Sie werden feststellen, dass Html nicht unbedingt perfektes XML ist. Der folgende Code nahm und fast obszön 96 Millisekunden

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

Verwenden Sie das Laden des Seitenquelltextes und das Parsen, wenn Sie lediglich ein Dokument durchlaufen und die Elemente überprüfen wollen. Kehren Sie zu Ihrem Treiber zurück, wenn Sie navigieren/interagieren müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X