Кроссбраузерные тесты, их перформанс и БДД подход.

Доброго всем дня, товарищи автоматизаторы! 

Дано: 

Небольшой веб - проект, есть аякс, большая часть функционала покрыта функциональными тестами. 

Тесты пишутся на: C# + WebDriver + Specflow (как фреймоворк). 

Тесты крутятся на Тимсити сервере. 

Кроссбраузерность: Файрфокс, Хром и ИЕ. 

Описание проблемы: 

Тесты написаны в БДД стиле - т.е. в самом сценарии я распарсиваю тексты контролов и выполняю с ними действия. 

Т.к. сценарии написаны в очень human readable стиле - то большая часть локаторов - это икспас, который ищет элемент по тексту.

Пока тесты были на Файрфоксе - все работало прекрасно; также прекрасно все перешло и работает в Хроме; А вот ИЕ поразил просто нереально медленным перфомансом. Икспасы выполняются очень медленно. Набор тестов, выполняющийся обычно за 5 минут, в ИЕ выполняются минут сорок. Обновление с ИЕ 8 до ИЕ 9 не улучшило ситуации.

Изучив данный вопрос,  понял, что намного лучше использовать СиЭсЭс локаторы. 

Вопрос номер раз: можно ли в Вебдрайвере (не Селениуме РСи) использовать библиотеку сиззл - и есть ли там аналог функции текст из икспаса. 

Вопрос номер два: каким образом можно улучшить перформанс тестов на ИЕ в целом? Что посоветуете? 

Если нужна какая-либо уточняющая информация - могу предоставить. 

Заранее всем спасибо за ответы/комментарии.

 

В самой спецификации CSS3 нету поиска нода по тексту. Сиззл в исходниках IEDriverServer упоминается, но я думаю что это для IE<8, т.к. в 8 и выше нативная поддержка css selectors. Скажу сразу, разница между xpath и css в ИЕ8 примерно вдвое (в моих тестах было 40 ms - xpath, 20 ms - css), так ваши 40 минут в лучшем случае превратятся в 20.

Насчет перфоманса, могу сказать одно: не используйте findElements - он на порядок медленее (в некоторых случаях в пять раз). Что бы сказать более предметно, нужны примеры сорса/локаторов.

А вообще, Вы уверены что дело именно в xpath? В IE сам по себе рендеринг и js довольно медленный: страница которая в ФФ заргужается за секунду, в ИЕ вполне может загружаться пять секунд, а то и более.

А, и еще. Время поиска элементов прямо пропорциональна количеству уже найденных элементов на странице. Другими словами - чем больше ищете, чем медленее. Здесь можно попробывать capability "enableElementCacheCleanup" либо периодически перезапускать браузер (memory leaks там тоже не хилые).

 

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

2. Насчет икспаса. Почти повсеместно использую матчинг по тексту элемента или по содержанию аттрибута. 

Например: 

//input[text()="LOGINBUTTON"]

//a[contains(@src, "VerySpecialLink")]

3. Сегодня с утра обновил версию ИЕ с 8ой до 9ой - перфоманс остался практически тем же самым - т.е. медленным. 

4. А есть ли в сиззл использовать что-то вроде text()="LOGINBUTTON"? 

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

Что уже странно:

 

driver.get("http://news.google.ru/nwshp?hl=ru&tab=wn");
int numOfIterations = 10;
Long time = System.currentTimeMillis();
for (int i=0;i<numOfIterations;i++){
driver.findElement(By.id("gbqfq"));
}
System.out.println("By.id: "+(System.currentTimeMillis()-time)/numOfIterations);
time = System.currentTimeMillis();
for (int i=0;i<numOfIterations;i++){
driver.findElement(By.xpath("//input[@type='text' and @name='q']"));
}
System.out.println("By.xpath: "+(System.currentTimeMillis()-time)/numOfIterations);

Output:
By.id: 565
By.xpath: 517

Env: WinXP+IE8

А какая версия IEDriverServer и Selenium?

http://sizzlejs.com/ 

Selector Features:
.......

Contains text :contains(text)

Но опять таки повторюсь, нативный css быстрее только в два раза. А сиззл может быть и вовсе на равне с xpath.

1. Вот и я не пойму почему так долго выполняется икспас. 

2. Селениум 2.28, ИЕдрайвер - 2.29. 

Ну тогда остаеться только инвестигировать. Выводите в консоль какое время было затрачено на поиск элемента (или можно посмотреть в логах IEDriverServer), сравните это с ФФ. Попробуйте запустить локально, минуя ci сервер и т.д.

А что по поводу перезапуска браузера? У вас все тесты идут в одном браузере, или он переодически перезапускается?

Я сравнивал пока исключительно время выполнения одного и того же набора тестов в ФФ и ИЕ. И ИЕ намного медленнее. 

Браузер я перезапускаю только в случае файла теста, в остальном у меня после каждой фичи идет логаут/логин снова. 

 

Попробуй вот это:
  1. On Windows 7 start regedit (Type regedit in the start box)
  2. Navigate to HKEY_CURRENT_USER\Software<wbr>Microsoft\Internet Explorer\Main\FeatureControl\
  3. Click on Edit->New-Key Menu
  4. Name it FEATURE_USE_LEGACY_JSCRIPT
  5. Right Click on the “FEATURE_USE_LEGACY_JSCRIPT” item and pick the following menu New -> DWORD (32-bit) Value
  6. Name it iexplore.exe
  7. For a value enter 1.

 

не помню где нашел, но помогает со всеми IE, хотя тоже далеко не идеал.

 

P.S. Windows обновления должны быть не старее Августа 2012

 

 

Можешь поделится  кодом как ты перезапускаеш браузер после фэйла теста
интересно посмотреть как ты реализовал данный подход

Я использую BDD фреймворк Specflow - по сути кое чем похожий на Thucidydes, но со своими плюсами и минусами. У него есть возможность навешать на методы аннотации Before/AfterFeature, Before/AfterScenario. 

Например данный метод выполняется после каждого тестого сценария. 

[AfterScenario]
public static void AfterScenario()
{
if (ScenarioContext.Current.TestError != null)
{
Driver.Quit();

InitializeDriver();
}
else
{
//do some post-coditions for scenario.
}
}
}

Данный код "ScenarioContext.Current.TestError != null" проверяет, что текущий тест не зафейленый:  - тоже средства Спекфлоу. 

Если будут дополнительные вопросы, пиши - если буду знать - отвечу.