Автоматическое управление Telerik RadDatePicker

#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, который отправлял обратно пустой после ввода значений.

Мне удалось автоматизировать ввод даты в поле ввода с помощью следующих шагов:

  1. Выберите текстовое поле dateInput, связанное с элементом управления.
  2. Выполните ввод даты. MouseClick() на нем
  3. Введите дату в поле Manager.Desktop.KeyBoard.TypeText("1/1/1990")
  4. Выполните a .MouseClick() для любого другого элемента на странице, например, для некоторого div

Я обнаружил, что # 4 был необходим для запуска событий, чтобы размыть элемент управления, поэтому «сохраняя» его значение.

Затем вы можете отправить, и значение должно сопровождаться этим.

Ответ №4:

Решена эта проблема для SeleniumIDE — вы должны использовать метод «fireEvent» со значением «blur» для «ControlID» после того, как вы установили значение с помощью методов «SendKeys» или «type». Странно, что эта проблема не возникает при автоматизации с помощью WebDriver.