如果您有权更改 HTML,请尝试在表数据元素上放置类声明。然后您可以使用 By.ClassName 而不是 XPath。
但在我继续之前,你到底想做什么?这似乎很奇怪
一旦 CssSelectors 在 .Net 和 IE 中得到完全支持,这将是一个不错的选择,但目前它并不可靠。现在请记住,您的文档需要以标准模式呈现。
您需要考虑只查看 td 而不是 td 和 th。虽然它肯定是可行的,但它增加了一定程度的复杂性。为了简单起见,我在下面做了。通常,您会知道有多少 th 以及它们持有什么,并分别处理它们。
进入代码,我发现 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);
}
继续加载页面源代码和解析,如果你想做的只是遍历文档检查元素。当您需要导航/交互时,恢复到您的驱动程序。