Автоматизированное управление Telerik RadDatePicker
Автор вопроса: MrBlueSkyОтветов: 4
Я использую WatIn для создания автоматизированного теста для веб-приложения, использующего элементы управления Telerik: моя первая задача - управлять элементом управления датой Telerik - RadDatePicker.
Простой ввод текста в наиболее вероятное поле ввода не работает: значение сбрасывается на пустое при отправке формы. Поэтому я полагаю, что мне нужен более сложный набор автоматизированных взаимодействий - например, я нашел эта тема на сайте Telerik, в которой обсуждается, как автоматизировать выбор из поля со списком Telerik.
Может ли кто-нибудь предоставить волшебную комбинацию взаимодействий, которая мне нужна?
(Я уверен, что ответ поможет любому, кто использует любой инструмент автоматизированного тестирования, поэтому я также отметил этот вопрос с парой других тестовых фреймворков :-))
После долгих поисков в Google я наткнулся на старую ветку на форумах Telerik [1], в которой может быть есть ответ, который мне нужен. Если это сработает, я обновлю этот ответ актуальным фрагментом кода. [1]: telerik.com/automated-testing-tools/community/forums/ MrBlueSky 08.10.2011
Нет, это не сработало! Я задал тот же вопрос на форуме Telerik. Обновлю здесь, если получу ответ: MrBlueSky 10.10.2011
Я использую 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);
а затем используйте селен GetEval в своем тесте, чтобы вызвать код javascript для установки даты:
selenium.GetEval("javascript here");
Вы обязательно должны обернуть его вокруг некоторого параметризованного вспомогательного класса, который будет генерировать код javascript для вас каждый раз, когда вы хотите установить дату в тесте, передав идентификатор элемента управления и дату.
Ответ 2 · MrBlueSky
Наконец-то у меня есть решение, которое работает. Ключевым моментом является использование javascript для вызова клиентского API для управления телериком. Тот же метод требуется для всех сложных элементов управления Telerik, например. RadInput.
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 · David d C e Freitas
У меня была такая же проблема с RadDatePicker, который отправлял пустые сообщения после ввода значений.
Мне удалось автоматизировать ввод даты в поле ввода с помощью следующих шагов:
Выберите текстовое поле dateInput, связанное с элементом управления.
Сделайте dateInput.MouseClick() на нем
Введите дату в поле Manager.Desktop.KeyBoard.TypeText("1/1/1990")
Сделайте .MouseClick() для любого другого элемента на странице, например. какой-то див
Я обнаружил, что # 4 был необходим для запуска событий, чтобы элемент управления размывался, поэтому "сохранял" его значение.
Затем вы можете отправить, и значение должно идти вместе с ним.
Ответ 4 · V.Kyrychenko
Решил эту проблему для SeleniumIDE - вы должны использовать метод "fireEvent" со значением "blur" для "ControlID" после того, как вы установили значение с помощью методов "sendKeys" или "type". Странно, что эта проблема не возникает при автоматизации с помощью WebDriver.