我正在使用WatIn为使用Telerik控件的Web应用程序创建自动化测试:我的第一个挑战是驱动Telerik日期控件 - 一个RadDatePicker。
只需在最可能的输入字段中输入文本不起作用:在发布表单时,该值将重置为空白。所以我想我需要一组更复杂的自动交互 - 例如,我发现this thread on the Telerik site讨论了如何从Telerik组合框中自动选择。
任何人都可以提供我需要的神奇组合吗?
(我确信答案可以帮助任何人使用任何自动化测试工具,因此我也用其他几个测试框架标记了这个问题:-))
答案 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上遇到了同样的问题,在输入值后会回空。
我设法通过以下步骤自动在输入字段中输入日期:
MouseClick()
Manager.Desktop.KeyBoard.TypeText("1/1/1990")
.MouseClick()
,例如一些div 我发现需要#4才能触发事件以使控件模糊,从而“节省”其值。
然后你可以提交,价值应该随之而来。
答案 3 :(得分:0)
解决了SeleniumIDE的问题 - 在使用“sendKeys”或“type”方法设置值后,必须使用“controlE”值为“blur”的“fireEvent”方法。奇怪的是,使用WebDriver进行自动化时不会出现此问题。