Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

cross-browser
specflow
bdd
performance
Теги: #<Tag:0x00007f7b62054cd8> #<Tag:0x00007f7b62054b98> #<Tag:0x00007f7b62054a58> #<Tag:0x00007f7b62054918>

(Alex.The.Test) #1

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

Дано: 

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

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

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

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

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

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

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

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

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

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

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

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

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

 


(vmaximv) #2

В самой спецификации 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 там тоже не хилые).

 


(Alex.The.Test) #3

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

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

Например: 

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

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

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

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


(vmaximv) #4

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.


(Alex.The.Test) #5

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

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


(vmaximv) #6

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

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


(Alex.The.Test) #7

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

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


(johan) #8

 

Попробуй вот это:
  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

 


(johan) #9

 

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

(Alex.The.Test) #10

Я использую 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" проверяет, что текущий тест не зафейленый:  - тоже средства Спекфлоу. 

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