Есть ли в WATIN средства проверки страниц, которые выполняются при каждой загрузке страницы? - PullRequest
3 голосов
/ 23 марта 2011

Я пишу сценарии автоматизации с использованием WATIR и WATIN.В Watir есть так называемые средства проверки страниц, которые представляют собой фрагменты кода, которые запускаются при каждой загрузке страницы.Есть ли что-то похожее в WATIN?Я хочу, чтобы кусок кода запускался при каждой загрузке страницы.Обычно это используется для проверки ошибок страниц или изображений при загрузке страниц.

1 Ответ

4 голосов
/ 24 марта 2011

Не очень легко определить, когда страница загружается. Я быстро погуглил о тех контролерах страниц в Watir, о которых ты упомянул, и нашел статью о контролерах страниц в Watir . Смотрите первый комментарий ниже статьи. AFAIK это действительно похоже на WatiN.

К сожалению, я не вижу подобных функций в WatiN (после внутреннего вызова WaitForComplete событие не запускается. Самое простое, что вы можете сделать, это создать подкласс, например. IE class:

class MyIE : IE
{
    public MyIE(string url) : base(url) { } //TODO: add constructors

    public override void WaitForComplete(int waitForCompleteTimeOut)
    {
        base.WaitForComplete(waitForCompleteTimeOut);
        Console.WriteLine("Page has been loaded");
    }
}

Однако ситуация будет аналогична описанной в упомянутом комментарии ( выполняется намного чаще, чем просто загрузка страницы ).

Я думаю, что лучшим подходом было бы использование Page класса из библиотеки WatiN. Это хорошо задокументировано. Пример веб-страницы watin.org:

var ie = new MyIE("http://watin.org/");

var homePage = ie.Page<HomePage>();
Console.WriteLine(homePage.FirstFeature);
homePage.DocumentationLink.Click();

var documentationPage = ie.Page<DocumentationPage>();
Console.WriteLine(documentationPage.FAQLink.Url);

Для запуска этого кода вам нужны следующие классы:

abstract class WatiNBasePage : Page
{
    [FindBy(Id = "header")]
    public Div HeaderDiv { get; set; }

    public Link HomeLink { get { return HeaderDiv.Link(Find.ByText("Home")); } }

    public Link DocumentationLink { get { return HeaderDiv.Link(Find.ByText("Documentation")); } }

    protected override void InitializeContents()
    {
        base.InitializeContents();
        VerifyDocumentProperties(UnverifiedDocument, errorMessage => { throw new Exception(errorMessage); }); //TODO: modify if needed
    }

    protected override void VerifyDocumentProperties(Document document, Page.ErrorReporter errorReporter)
    {
        base.VerifyDocumentProperties(document, errorReporter);
        if (!HomeLink.Exists)
            errorReporter("HomeLink not exists");
        //TODO: more checks here
    }
}

class HomePage : WatiNBasePage
{
    [FindBy(Id = "features")]
    public Table FeatureTable { get; set; }

    public string FirstFeature { get { return FeatureTable.Span(Find.First()).Text; } }
}

class DocumentationPage : WatiNBasePage
{
    [FindBy(Text = "Frequently Asked Questions")]
    public Link FAQLink { get; set; }
}

В основном вам нужно реализовать VerifyDocumentProperties. Приведенный выше код проверит, существует ли HomeLink, но, возможно, вы захотите проверить, существует ли DocumentationLink и т. Д. Во-вторых, нужно изменить вызов на VerifyDocumentProperties. Теперь, если проверка не удалась, Exception будет сгенерировано после вызова ie.Page<T>() (где T является подклассом WatinBaseClass).

По моему мнению, даже если вам не нужно использовать "средства проверки страниц", использование класса Page все еще действительно полезно и разъясняет код, поэтому я действительно рекомендую его использовать. Сожалею, что не обнаружил его, когда начинал работать с WatiN.

...