Ако имате достъп за промяна на HTML, опитайте да поставите декларация на клас върху елементите с данни на таблицата. Тогава можете да използвате By.ClassName вместо XPath.
Но преди да продължа, какво точно се опитвате да направите? Изглежда странно, че
След като CssSelectors бъде напълно поддържан в .Net и IE, това ще бъде страхотна опция, но засега не е надеждна. Не забравяйте засега, че вашият документ трябва да бъде изобразен в стандартен режим.
Ще искате да разгледате само td, а не td и th. Въпреки че със сигурност е осъществимо, добавя известна доза сложност. Направих това по-долу за простота. Обикновено ще знаете колко 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);
}
Отидете със зареждане на изходния код на страницата и анализиране, ако всичко, което искате, е да преминете през елементи за проверка на документ. Върнете се обратно към вашия шофьор, когато трябва да навигирате/взаимодействате.
person
pnewhook
schedule
14.09.2010
/html/body/table/tr/*
или/html/body/table/tr/*[self::td or self::th]
- person   schedule 14.09.2010