我遇到了一种情况,当每次测试加载页面时,我需要重新初始化每个页面的控件。我已经在一个代码文件中分离了页面的控件声明,并在另一个代码文件中对这些控件执行了操作。
我已将这些操作暴露给测试用例,因此不会从测试用例传递任何控件。 我已经实现了Singleton用于控件初始化。因此,第一个测试用例可以解决任何问题。当第二次测试开始时,它会说“对象引用未设置为对象的实例”。尝试访问已初始化的控件时。
public partial class Login : Page
{
protected TextField txtUserName;
protected TextField txtPassword;
protected TextField txtConPassword;
public Login()
{
this.txtUserName = Util.Browser.TextField(Find.ById("username"));
this.txtPassword = Util.Browser.TextField(Find.ById("password"));
this.txtConPassword = Util.Browser.TextField(Find.ByValue("password"));
}
}
public partial class Login
{
/// <summary>
/// Set user name.
/// </summary>
/// <param name="userName">User name.</param>
public void SetUserName(string userName)
{
this.txtUserName.TypeText(userName);
//Util.SetTextHelper(this.txtUserName, userName);
}
}
我想只有在Browser加载Document时才会初始化控件。当第一个测试结束时,浏览器将关闭并处理掉。因此,当使用Singleton实现控件初始化时,随着文档重新初始化浏览器(对于第二次测试),控件值会引发错误。
这个问题可以通过不实现Singleton来解决,但是在需要时重新初始化控件是没有意义的。
答案 0 :(得分:0)
已更新!尝试使用WatiN FindBy属性...
public partial class LoginPage : Page
{
[FindBy(Id = "username")]
public TextField txtUserName;
[FindBy(Id = "password")]
public TextField txtPassword;
[FindBy(Value = "password")]
public TextField txtConPassword;
}
public partial class LoginPage
{
public void SetUserName(string userName)
{
this.txtUserName.TypeText(userName);
}
}
public void LoginTest()
{
using (IE browser = new IE())
{
browser.GoTo("http://yourLoginPage.html");
LoginPage loginPage = browser.Page<LoginPage>();
loginPage.SetUserName("some_username");
//Do your other stuff
//If you haven't navigated away from the page this should still work
//If not just grab the login page again: -
//loginPage = browser.Page<LoginPage>();
loginPage.SetUserName("some_other_username");
}
}
HTH!