Как вы тестируете приложение Ajax с Selenium и поддерживаете его стабильность? - PullRequest
4 голосов
/ 18 августа 2010

Наша команда тестировала наше приложение с помощью Selenium, так как оно сильно зависит от JavaScript, у нас всегда были проблемы с тестами, которые иногда терпели неудачу.Поскольку число тестов увеличилось, вероятность того, что по крайней мере один из двух тестов завершится неудачно в полном цикле, стала определенностью.

Мы недавно выяснили, что, вероятно, у нас есть состояние гонки, при котором селен будет переходить по ссылкам до того, какJavaScript инициализации имел возможность присоединить обработчики событий к элементу, по которому щелкают.Конечно, в этот момент ожидаемые нами эффекты не случаются, и мы получаем провальный тест.

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

Лучшая идея, которую мы придумалидо сих пор нужно внедрить скрытый элемент в DOM, которого Selenium может ждать, прежде чем запустить событие click, чтобы узнать, что оно готово.Это потребует дополнительных затрат времени разработчика, когда мы работаем с нашими асинхронными событиями, удаляя и добавляя элемент.Также он добавляет на наши страницы дополнительные материалы, которые действительно не нужны для приложения.

У кого-нибудь есть какие-нибудь лучшие стратегии?Что вы сделали, чтобы эффективно решить эту проблему?

Ответы [ 5 ]

3 голосов
/ 19 августа 2010

Мы переехали в Selenium 2 (WebDriver) и используем шаблон объектов страницы с PageFactory / AjaxElementLocatorFactory - пример этого здесь

2 голосов
/ 19 августа 2010

Я сделал так же, как вы: добавьте немного задержки и подождите, пока некоторые элементы появятся на странице.И я в полном порядке.Возможно, переход на Webdriver / selenium 2.0 поможет, хотя.Выполнение теста можно сократить, если вы работаете с базой данных в памяти или совместно используете один и тот же сервер селена / селена между тестами или даже с распараллеливанием (например, легко с TestNG).

1 голос
/ 20 августа 2010

ИМХО задержки не являются хорошим решением (только обходной путь).

Мы используем функцию распознавания изображений iMacros для тестирования сложного AJAX (и Flash).Для селена, может быть, вы можете объединить его с AutoHotKey (который включает в себя базовый поиск изображений и популярен как инструмент тестирования настольных приложений)?http://www.autohotkey.com/docs/commands/ImageSearch.htm

1 голос
/ 19 августа 2010

Чтобы устранить условия гонки, используйте Selenium runScript(String initCondition) в сочетании с waitForCondition(String jsConditional, String timeout) методами.

Например, если функциональность AJAX, которую вы хотите протестировать, приводит к добавлению нового элемента в dom, вы можете использовать что-то вроде следующего.

String jsPoll = "";
jsPoll += "selenium.browserbot.getCurrentWindow()";
jsPoll += ".document.getElementById('DOMID')";
selenium.waitForCondition(jsPoll, "30000");

Условие оценивается как истинное, когда элемент добавлен и метод будет продолжен. Если ваша AJAX-функция меняет местами элементы (то есть: один div для другого идентично идентифицированного div), вы можете инициализировать свое условие с помощью следующего:

String jsInit = "";
jsInit += "!selenium.browserbot.getCurrentWindow()";
jsInit += ".document.getElementById('DOMID').setAttribute('SELENIUMTEST','1')";
String jsPoll = "";
selenium.runScript(jsInit);
jsPoll += "selenium.browserbot.getCurrentWindow()";
jsPoll += ".document.getElementById('DOMID').getAttribute('SELENIUMTEST') != 1";
selenium.waitForCondition(jsPoll, "30000");

Условие оценивается как истинное, когда элемент заменяется функцией AJAX.

1 голос
/ 19 августа 2010

Вы пробовали команду waitForElementPresent, а затем нажимали ее?

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