WATIN中的页面检查程序是否在每个页面加载时执行?

时间:2011-03-23 17:41:57

标签: watin watir

我正在使用WATIR和WATIN编写自动化脚本。 Watir有一个叫做页面检查器的东西,它是在每个页面加载时运行的代码片段。在WATIN有类似的东西吗?我想在每个页面加载时运行一段代码。通常,这用于检查页面错误或页面加载图像。

1 个答案:

答案 0 :(得分:4)

当页面加载时,判断并不是那么容易。我快速搜索了Watir中的那个页面检查器,你提到并发现了an article about page checkers in Watir。请参阅文章的第一条评论。 AFAIK在WatiN中非常相似。

不幸的是,我在WatiN中没有看到任何类似的功能(内部调用WaitForComplete后没有事件被触发。你最容易做的就是子类化。IE类:

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");
    }
}

但是,情况与上述评论中描述的情况类似(比仅仅页面加载更频繁地运行)。

我认为更好的方法是使用WatiN库中的Page类。这是有据可查的。 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(其中T是WatinBaseClass的子类)之后将抛出ie.Page<T>()

在我看来,即使你不需要使用“页面检查程序”,使用Page类仍然非常有用并澄清代码,所以我真的建议使用它。我很遗憾在我开始与WatiN合作时没有发现它。