Selenium 2.0 IE Xpath Performance - PullRequest
       9

Selenium 2.0 IE Xpath Performance

2 голосов
/ 14 сентября 2010

Я пытаюсь использовать 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?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2010

У меня всегда была одна и та же проблема с селеном 1, я улучшил ее, обновив стороннюю библиотеку xpath, которую она использовала, не уверенную, применимо ли это к селену 2 ... но, в конечном счете, она не была родной для браузера. достаточно быстро.

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

1 голос
/ 15 сентября 2010

Если у вас есть доступ к изменению HTML, попробуйте добавить объявление класса в элементы данных таблицы. Тогда вы можете использовать By.ClassName вместо XPath.

Но прежде чем я продолжу, что именно вы пытаетесь сделать? Кажется странным, что

Как только CssSelectors будет полностью добавлен в .Net и IE, это будет отличный вариант, но пока он ненадежен. Помните, что сейчас ваш документ должен отображаться в режиме стандартов.

Возможно, вы захотите рассмотреть только тд, а не тд и й. Хотя это, конечно, выполнимо, это добавляет определенную сложность. Я сделал это ниже для простоты. Обычно вы знаете, сколько их и что они держат, и разбираетесь с ними по отдельности.

Попадая в код, который я обнаружил, было небольшое ускорение при переходе на 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);
        }

Перейдите к загрузке исходного кода страницы и синтаксическому анализу, если все, что вы хотите сделать, это перебирать элементы проверки документа. Вернитесь к своему драйверу, когда вам нужно перемещаться / взаимодействовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...