Selenium 2.0 IE Xpath Performance

Опитвам се да използвам selenium-dotnet-2.0a5 за итерация през много таблици и трябва да използвам xpath. например;

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
}

Средно време за итерация през около 50 реда, firefox 0-2 секунди, chrome 6-8 секунди, IE 60-70 секунди.

Повечето от моите тестове трябва да се изпълняват в IE, някакви съвети какво мога да направя, за да постигна по-добра производителност на xpath?


person Thermionix    schedule 14.09.2010    source източник
comment
@Mikey: Защо не навигираш дървото само веднъж? Кажете /html/body/table/tr/* или /html/body/table/tr/*[self::td or self::th]   -  person    schedule 14.09.2010


Отговори (2)


Ако имате достъп за промяна на 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
comment
+1 за препоръката за анализиране на източника за получаване на текст и използване на драйвера за взаимодействия. - person Tom E; 15.09.2010
comment
Благодаря за препоръката относно htmlagility, прекодирах класовете си, за да го използвам и всичко е много по-бързо - person Thermionix; 16.09.2010

Винаги съм имал същия проблем със селен 1, подобрих го, като актуализирах xpath библиотеката на трета страна, която използва, не съм сигурен дали това все още се отнася за селен 2... но в крайна сметка, без да е естествен за браузъра, не беше достатъчно бърз .

В крайна сметка, ако имах нужда от нещо като вашия пример и CSS селекторите просто нямаше да го отрежат, просто щях да върна целия DOM от селен и да анализирам дървото в код, използвайки друга библиотека, и да го повторя по този начин. Малко мръсен хак, но ви заобикаля с помощта на бавен IE xpath.

person Bill    schedule 14.09.2010
comment
В този конкретен пример се опитвате да получите текста както на td, така и на th от таблицата. Опитвали ли сте да използвате два цикъла, един за row.FindElements(By.TagName(th)) и втори за row.FindElements(By.TagName(td))? - person Sergii Pozharov; 14.09.2010