2010-09-14 2 views
2

Я пытаюсь использовать selenium-dotnet-2.0a5 для итерации по многим таблицам и должен использовать xpath. например;Selenium 2.0 IE Xpath Performance

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 строк, светлячок 0-2 сек, хром 6-8 сек, И.Е. 60-70 сек.

Большинство моих тестов нужно запускать в IE, любые советы о том, что я могу сделать, чтобы улучшить производительность xpath?

+1

@Mikey: Почему бы вам не нагнать дерево только один раз? Скажем '/ html/body/table/tr/*' или '/ html/body/table/tr/* [self :: td или self :: th]' – 2010-09-14 15:44:31

ответ

1

Если у вас есть доступ к изменению 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); 
     } 

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

+0

+1 для рекомендации проанализировать источник для получения текста и использования драйвера для взаимодействия. –

+0

Спасибо за рекомендацию по htmlagility, я перекодировал свои классы, чтобы использовать его, и все намного быстрее – Thermionix

2

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

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

+0

В этом конкретном примере вы пытаетесь получить текст как td, так и th таблицы. Пробовали ли вы использовать два цикла, один для row.FindElements (By.TagName ("th")) и второй для row.FindElements (By.TagName ("td"))? –