Производительность Selenium 2.0 IE Xpath

Я пытаюсь использовать 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. Хотя это, безусловно, выполнимо, это добавляет определенную сложность. Я сделал это ниже для простоты. Обычно вы знаете, сколько их существует и что они содержат, и разбираетесь с ними отдельно.

Приступая к коду, я обнаружил, что 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