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.