自动控制Telerik RadDatePicker

时间:2011-10-08 14:10:57

标签: telerik nunit automated-tests watin

我正在使用WatIn为使用Telerik控件的Web应用程序创建自动化测试:我的第一个挑战是驱动Telerik日期控件 - 一个RadDatePicker。

只需在最可能的输入字段中输入文本不起作用:在发布表单时,该值将重置为空白。所以我想我需要一组更复杂的自动交互 - 例如,我发现this thread on the Telerik site讨论了如何从Telerik组合框中自动选择。

任何人都可以提供我需要的神奇组合吗?

(我确信答案可以帮助任何人使用任何自动化测试工具,因此我也用其他几个测试框架标记了这个问题:-))

4 个答案:

答案 0 :(得分:0)

我终于找到了一个有效的解决方案。关键是使用javascript来调用telerik控件的客户端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);
    }
}

答案 1 :(得分:0)

我使用Selenium RC并且几天前遇到了类似的问题。我花了很长时间才找到正确的方法,所以我想我会分享对我有用的解决方案:

(注意:我不能使用$ find)

在RadDatePicker上设置日期的javascript是:

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");

你应该把它包装在一些参数化的助手类中,每当你想通过传递控件和日期的id来设置测试中的日期时,它会为你生成javascript代码。

答案 2 :(得分:0)

我在RaddatePicker上遇到了同样的问题,在输入值后会回空。

我设法通过以下步骤自动在输入字段中输入日期:

  1. 选择与控件关联的dateInput文本框。
  2. 在其上执行dateInput。MouseClick()
  3. 在字段Manager.Desktop.KeyBoard.TypeText("1/1/1990")
  4. 中输入日期
  5. 对页面上的任何其他元素执行.MouseClick(),例如一些div
  6. 我发现需要#4才能触发事件以使控件模糊,从而“节省”其值。

    然后你可以提交,价值应该随之而来。

答案 3 :(得分:0)

解决了SeleniumIDE的问题 - 在使用“sendKeys”或“type”方法设置值后,必须使用“controlE”值为“blur”的“fireEvent”方法。奇怪的是,使用WebDriver进行自动化时不会出现此问题。