#telerik #nunit #automated-tests #watin
#telerik #nunit #автоматизированные тесты #watin
Вопрос:
Я использую WatiN для создания автоматического теста для веб-приложения, которое использует элементы управления Telerik: моя первая задача — управлять элементом управления Telerik date — RadDatePicker.
Простой ввод текста в наиболее вероятное поле ввода не работает: значение сбрасывается на пустое при отправке формы. Итак, я полагаю, мне нужен более сложный набор автоматических взаимодействий — например, я нашел эту тему на сайте Telerik, в которой обсуждается, как автоматизировать выбор из поля со списком Telerik.
Может ли кто-нибудь предоставить волшебную комбинацию взаимодействий, которые мне нужны?
(Я уверен, что ответ поможет любому, кто использует любой инструмент автоматического тестирования, поэтому я также отметил этот вопрос парой других тестовых фреймворков :-))
Комментарии:
1. После изрядного количества поисковых запросов я наткнулся на старую ветку на форумах Telerik [1], в которой может быть нужный мне ответ. Если это сработает, я обновлю этот ответ обновленным фрагментом кода. [1]: telerik.com/automated-testing-tools/community/forums /…
2. Нет, это не сработало! Я задавал тот же вопрос на форуме Telerik. Будет обновляться здесь, если я получу ответ там:
Ответ №1:
Я использую Selenium RC и столкнулся с аналогичной проблемой несколько дней назад. Мне потребовалась целая вечность, чтобы найти правильный способ сделать это, поэтому я подумал, что поделюсь решением, которое сработало для меня:
(ПРИМЕЧАНИЕ: я не смог использовать $find)
Javascript для установки даты в RadDatePicker является:
var appBrowser = this.browserbot.getCurrentWindow();
var datepicker = appBrowser.yourDatePickerId; //note: no quotes
var selectDate=new Date();
selectDate.setFullYear(yourYear,yourMonth,yourDay);
datepicker.SetDate(selectDate);
datepicker.DateInput.SetDate(selectDate);
а затем используйте selenium getEval в своем тесте для вызова кода javascript для установки даты:
selenium.GetEval("javascript here");
Вы обязательно должны обернуть его вокруг некоторого параметризованного вспомогательного класса, который будет генерировать код javascript для вас каждый раз, когда вы хотите установить дату в тесте, передавая идентификатор элемента управления и дату.
Ответ №2:
Наконец-то у меня есть решение, которое работает. Ключ в том, чтобы использовать javascript для вызова клиентского API для элемента управления telerik. Тот же метод требуется для всех сложных элементов управления Telerik, например, RadInput.
Я использовал метод, рекомендованный на веб-сайте WatiN, для написания собственного элемента управления http://watinandmore.blogspot.com/2009/12/wrapping-complex-logic-in-control.html чтобы придумать это:
public class TelerikDatePicker : Control<TextField>
{
public DateTime? Value
{
get
{
var jScript = string.Format(@"$find(""{0}"").get_selectedDate();", Element.Id);
var selectedDateStr = Eval(jScript);
return TranslateJavascriptDateStringIntoDateTime(selectedDateStr);
}
set
{
var jScript = string.Format(@"$find(""{0}"").set_selectedDate(new Date(""{1:MMMM dd,yyyy}""));", Element.Id, value);
Eval(jScript);
}
}
public void SetValue(DateTime? value)
{
if (value.HasValue)
Value = value.Value;
else
Clear();
}
public void Clear()
{
var jScript = string.Format(@"$find(""{0}"").clear();", Element.Id);
Eval(jScript);
}
private string Eval(string script)
{
return Element.DomContainer.Eval(script);
}
public bool IsEnabled()
{
var jScript = string.Format(@"$find(""{0}"").get_enabled();", Element.Id);
return Eval(jScript) == "true";
}
private DateTime? TranslateJavascriptDateStringIntoDateTime(string jsDateStr /*E.g. Mon Mar 12 00:00:00 UTC 0100 2012*/)
{
if (String.IsNullOrEmpty(jsDateStr) || jsDateStr == "null") return null;
var abbreviatedMonth = jsDateStr.Substring(4, 3);
var dayOfTheMonth = jsDateStr.Substring(8, 2).TrimEnd(' ');
var year = jsDateStr.Substring(jsDateStr.Length-4, 4);
const string format = "d MMM yyyy";
var dateStr = dayOfTheMonth " " abbreviatedMonth " " year;
return DateTime.ParseExact(dateStr, format, CultureInfo.InvariantCulture);
}
}
Ответ №3:
У меня была такая же проблема с RadDatePicker, который отправлял обратно пустой после ввода значений.
Мне удалось автоматизировать ввод даты в поле ввода с помощью следующих шагов:
- Выберите текстовое поле dateInput, связанное с элементом управления.
- Выполните ввод даты.
MouseClick()
на нем - Введите дату в поле
Manager.Desktop.KeyBoard.TypeText("1/1/1990")
- Выполните a
.MouseClick()
для любого другого элемента на странице, например, для некоторого div
Я обнаружил, что # 4 был необходим для запуска событий, чтобы размыть элемент управления, поэтому «сохраняя» его значение.
Затем вы можете отправить, и значение должно сопровождаться этим.
Ответ №4:
Решена эта проблема для SeleniumIDE — вы должны использовать метод «fireEvent» со значением «blur» для «ControlID» после того, как вы установили значение с помощью методов «SendKeys» или «type». Странно, что эта проблема не возникает при автоматизации с помощью WebDriver.