WatiN: текстовые поля не становятся автоматическими при выполнении кода как - PullRequest
2 голосов
/ 23 сентября 2011

WatiN.Core.IE window = new WatiN.Core.IE ();

            // Frames



            // Model

            TextField txt_txtName = window.TextField(Find.ByName("txtName"));

            TextField txt_txtPassword = window.TextField(Find.ByName("txtPassword"));

            Button btn_btnLogin = window.Button(Find.ByName("btnLogin"));



            // Code

            window.GoTo("http://134.554.444.55/asdfgfghh/");

            txt_txtName.TypeText("fghfjghm");

            txt_txtPassword.TypeText("gfhgjfgh");

            btn_btnLogin.Click();

        }

только окно. GoTo (код "http://134.554.444.55/asdfgfghh/"); работает, а остальные ничего не делают,

Когда я использую блок catch, он выдает исключение как

Не удалось найти INPUT (скрытый) или INPUT (пароль) или INPUT (текст) или INPUT (текстовое поле) или критерии соответствия тега элемента TEXTAREA: атрибут 'name' равен 'txtName' в 'http://134.554.444.55/asdfgfghh/ (внутреннее исключение: невозможно для приведения объекта COM типа «System .__ ComObject» к типу интерфейса «mshtml.IHTMLElement». Эта операция завершилась неудачно, поскольку не удалось выполнить вызов QueryInterface для компонента COM для интерфейса с IID «{3050F1FF-98B5-11CF-BB82-00AA00BDCE0B}» из-за следующей ошибки: Ошибка загрузки библиотеки типов / DLL. (Исключение из HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).)

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Мой ответ очень похож на ответ Павла, но я должен посоветовать использовать Page, который является встроенной поддержкой для Model, как описано Павлом.

Создать класс MyPage

public class MyPage : WatiN.Core.Page
{
    public TextField NameField
    {
        get { return Document.TextField(Find.ByName("txtName")); }
    }

    public TextField PasswordField
    {
        get { return Document.TextField(Find.ByName("txtPassword")); }
    }

    public TextField LoginButton
    {
        get { return Document.Button(Find.ByName("btnLogin")); }
    }
}

Тогда вы можете просто вызвать .Page<MyClass> метод.

using(var browser = new IE("http://134.554.444.55/asdfgfghh/"))
{
    var page = browser.Page<MyClass>();
    page.NameField.TypeText("name field");
    page.PasswordField.TypeText("password field");
    page.LoginButton.Click();
}
1 голос
/ 26 сентября 2011

Когда вы вызываете Button, TextField или что-то еще, что не создает отображение, оно фактически ищет элемент управления на странице.И если страница еще не открыта, тогда элемент управления не существует.

Вы можете создать свойства, которые найдут элемент управления, когда вы запросите его.Таким образом, вы определяете конкретную модель как класс с соответствующими свойствами.

public TextField txt_txtName
{
    get
    {
        return window.TextField(Find.ByName("txtName"));
    }
}

Добавлено : Если создание свойств не работает для вас, используйте это:

var model = new
{
    txt_txtName = new Func<TextField>(() => window.TextField(Find.ByName("txtName"))),
    txt_txtPassword = new Func<TextField>(() => window.TextField(Find.ByName("txtPassword"))),
    btn_btnLogin = new Func<Button>(() => window.Button(Find.ByName("btnLogin")))
};

window.GoTo("http://134.554.444.55/asdfgfghh/");

model.txt_txtName().TypeText("fghfjghm");

model.txt_txtPassword().TypeText("gfhgjfgh");

model.btn_btnLogin().Click();
...