Небольшой веб - проект, есть аякс, большая часть функционала покрыта функциональными тестами.
Тесты пишутся на: 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. У меня часть тестов, в которых элементы находятся по айди, в ИЕ работают шустро. Плюс сами страницы отгружаются тоже за вполне приемлимое время.
Что уже странно:
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.
Ну тогда остаеться только инвестигировать. Выводите в консоль какое время было затрачено на поиск элемента (или можно посмотреть в логах IEDriverServer), сравните это с ФФ. Попробуйте запустить локально, минуя ci сервер и т.д.
А что по поводу перезапуска браузера? У вас все тесты идут в одном браузере, или он переодически перезапускается?
Я использую 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" проверяет, что текущий тест не зафейленый: - тоже средства Спекфлоу.
Если будут дополнительные вопросы, пиши - если буду знать - отвечу.