Если у вас есть доступ к изменению HTML, попробуйте вставить объявление класса в элементы данных таблицы. Затем вы можете использовать By.ClassName вместо XPath.
Но прежде чем идти дальше, что именно вы пытаетесь сделать? Кажется странным, что
Как только CssSelectors полностью погрузится в .Net и IE, это будет отличный вариант, но пока это ненадежно. Помните, что теперь ваш документ должен отображаться в стандартном режиме.
Вы хотите рассмотреть возможность просмотра только td, а не td и th. Хотя это, безусловно, выполнимо, оно добавляет некоторую сложность. Я сделал это ниже ради простоты. Как правило, вы знаете, сколько их есть и что они держат, и разобраться с ними отдельно.
Получив код, я обнаружил, что было небольшое ускорение, отправляющееся в By.TagName. Это заняло около 20 секунд над 43 строками на 4 столбца.
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);
}
Перейти с источником страницы загрузки и синтаксического анализа, если все, что вы хотите сделать, это перебирать документ проверки элементов. Вернитесь к своему драйверу, когда вам нужно перемещаться/взаимодействовать.
@Mikey: Почему бы вам не нагнать дерево только один раз? Скажем '/ html/body/table/tr/*' или '/ html/body/table/tr/* [self :: td или self :: th]' – 2010-09-14 15:44:31