Telerik RadDatePicker的自动控制

Telerik RadDatePicker的自动控制,telerik,nunit,automated-tests,watin,Telerik,Nunit,Automated Tests,Watin,我正在使用WatIn为使用Telerik控件的Web应用程序创建一个自动测试:我的第一个挑战是驾驶Telerik日期控件—RadDatePicker 简单地在最有可能的输入字段中输入文本是不起作用的:表单发布时,该值被重置为空白。所以我想我需要一组更复杂的自动交互——例如,我发现正在讨论如何从Telerik组合框中自动选择 谁能提供我所需要的互动的神奇组合 (我确信这个答案对任何使用自动化测试工具的人都有帮助,因此我还用其他几个测试框架标记了这个问题:-)我终于找到了一个可行的解决方案。关键是使

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

简单地在最有可能的输入字段中输入文本是不起作用的:表单发布时,该值被重置为空白。所以我想我需要一组更复杂的自动交互——例如,我发现正在讨论如何从Telerik组合框中自动选择

谁能提供我所需要的互动的神奇组合


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

我终于找到了一个可行的解决方案。关键是使用javascript调用telerik控件的客户端API。所有复杂的Telerik控制都需要相同的技术,例如RadInput

我使用WatiN网站上推荐的技术编写自己的控件,得出以下结论:

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);
    }
}
公共类TelerikDatePicker:控件
{
公共日期时间?值
{
得到
{
var jScript=string.Format(@“$find(“{0}”).get_selectedDate();”,Element.Id);
var selectedDateStr=Eval(jScript);
返回TranslateJavascriptDateStringIntoDateTime(selectedDateStr);
}
设置
{
var jScript=string.Format(@“$find”(“{0}”).set_selectedDate(新日期(“{1:MMMM dd,yyyy}”);”,元素.Id,值);
Eval(jScript);
}
}
公共无效设置值(日期时间?值)
{
if(value.HasValue)
值=值。值;
其他的
清除();
}
公共空间清除()
{
var jScript=string.Format(@“$find(“{0}”).clear();”,Element.Id);
Eval(jScript);
}
私有字符串求值(字符串脚本)
{
返回元素.DomContainer.Eval(脚本);
}
公共图书馆已启用()
{
var jScript=string.Format(@“$find(“{0}”).get_enabled();”,Element.Id);
返回Eval(jScript)=“true”;
}
private DateTime?TranslateJavascriptDateStringIntoDateTime(字符串jsDateStr/*例如,UTC周一至三月十二日00:00:00+0100 2012*/)
{
if(String.IsNullOrEmpty(jsDateStr)| | jsDateStr==“null”)返回null;
var缩写月份=jsDateStr.Substring(4,3);
var dayOfMonth=jsDateStr.Substring(8,2).TrimEnd(“”);
var year=jsDateStr.Substring(jsDateStr.Length-4,4);
常量字符串格式=“d MMM yyyy”;
var dateStr=月日+“”+缩写月+“”+年;
返回DateTime.ParseExact(dateStr,format,CultureInfo.InvariantCulture);
}
}

我终于找到了一个可行的解决方案。关键是使用javascript调用telerik控件的客户端API。所有复杂的Telerik控制都需要相同的技术,例如RadInput

我使用WatiN网站上推荐的技术编写自己的控件,得出以下结论:

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);
    }
}
公共类TelerikDatePicker:控件
{
公共日期时间?值
{
得到
{
var jScript=string.Format(@“$find(“{0}”).get_selectedDate();”,Element.Id);
var selectedDateStr=Eval(jScript);
返回TranslateJavascriptDateStringIntoDateTime(selectedDateStr);
}
设置
{
var jScript=string.Format(@“$find”(“{0}”).set_selectedDate(新日期(“{1:MMMM dd,yyyy}”);”,元素.Id,值);
Eval(jScript);
}
}
公共无效设置值(日期时间?值)
{
if(value.HasValue)
值=值。值;
其他的
清除();
}
公共空间清除()
{
var jScript=string.Format(@“$find(“{0}”).clear();”,Element.Id);
Eval(jScript);
}
私有字符串求值(字符串脚本)
{
返回元素.DomContainer.Eval(脚本);
}
公共图书馆已启用()
{
var jScript=string.Format(@“$find(“{0}”).get_enabled();”,Element.Id);
返回Eval(jScript)=“true”;
}
private DateTime?TranslateJavascriptDateStringIntoDateTime(字符串jsDateStr/*例如,UTC周一至三月十二日00:00:00+0100 2012*/)
{
if(String.IsNullOrEmpty(jsDateStr)| | jsDateStr==“null”)返回null;
var缩写月份=jsDateStr.Substring(4,3);
var dayOfMonth=jsDateStr.Substring(8,2).TrimEnd(“”);
var year=jsDateStr.Substring(jsDateStr.Length-4,4);
常量字符串格式=“d MMM yyyy”;
var dateStr=月日+“”+缩写月+“”+年;
返回DateTime.ParseExact(dateStr,format,CultureInfo.InvariantCulture);
}
}

我正在使用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");

您应该明确地将它包装在某个参数化的helper类中,该类将在每次您希望通过传递控件id和日期来设置测试中的日期时为您生成javascript代码

我正在使用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");

您应该明确地将它包装在某个参数化的helper类中,该类将在每次您希望通过传递控件id和日期来设置测试中的日期时为您生成javascript代码

我和一个RadDatePicker有同样的问题,他会发回邮件