Автоматизированное управление Telerik RadDatePicker

Я использую WatIn для создания автоматизированного теста для веб-приложения, использующего элементы управления Telerik: моя первая задача — управлять элементом управления датой Telerik — RadDatePicker.

Простой ввод текста в наиболее вероятное поле ввода не работает: значение сбрасывается на пустое при отправке формы. Поэтому я полагаю, что мне нужен более сложный набор автоматизированных взаимодействий — например, я нашел эта тема на сайте Telerik, в которой обсуждается, как автоматизировать выбор из поля со списком Telerik.

Может ли кто-нибудь предоставить волшебную комбинацию взаимодействий, которая мне нужна?

(Я уверен, что ответ поможет любому, кто использует любой инструмент автоматизированного тестирования, поэтому я также отметил этот вопрос с парой других тестовых фреймворков :-))


person MrBlueSky    schedule 08.10.2011    source источник
comment
После долгих поисков в Google я наткнулся на старую ветку на форумах Telerik [1], в которой может быть есть ответ, который мне нужен. Если это сработает, я обновлю этот ответ актуальным фрагментом кода. [1]: telerik.com/automated-testing-tools/community/forums/   -  person MrBlueSky    schedule 08.10.2011
comment
Нет, это не сработало! Я задал тот же вопрос на форуме Telerik. Обновлю здесь, если получу ответ:   -  person MrBlueSky    schedule 10.10.2011


Ответы (4)


Я использую 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 для вас каждый раз, когда вы хотите установить дату в тесте, передав идентификатор элемента управления и дату.

person Greg Reczek    schedule 04.03.2013

Наконец-то у меня есть решение, которое работает. Ключевым моментом является использование javascript для вызова клиентского API для управления телериком. Тот же метод требуется для всех сложных элементов управления 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);
    }
}
person MrBlueSky    schedule 15.03.2012

У меня была такая же проблема с RadDatePicker, который отправлял пустые сообщения после ввода значений.

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

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

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

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

person David d C e Freitas    schedule 29.10.2013

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

person V.Kyrychenko    schedule 04.09.2014