Управление повторной инициализацией с использованием WatiN - PullRequest
0 голосов
/ 03 апреля 2012

Я столкнулся с ситуацией, когда мне нужно повторно инициализировать элементы управления каждой страницы, когда страница загружается для каждого теста.Я разделил объявление элементов управления страницы в одном файле кода и операции, которые выполняются над этими элементами управления в другом файле кода.

Я подверг эти операции тестовым сценариям, поэтому из тестовых примеров не передаются элементы управления.Я реализовал 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);
    }
 }

Я предполагаю, что элементы управления инициализируются только тогда, когда браузер загружается с Document.Когда первый тест заканчивается, браузер закрывается и удаляется.Поэтому, когда браузер повторно инициализируется (для второго теста) с документом, поскольку инициализация элементов управления реализована с использованием Singleton, значения элементов управления выдают ошибку.

Эта проблема может быть решена путем не реализации Singleton, ноповторная инициализация элементов управления там, где это требуется, не имеет смысла.

1 Ответ

0 голосов
/ 03 апреля 2012

ОБНОВЛЕНО!Попробуйте использовать атрибут 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!

...