使用WatiN和NUnit进行单元测试

时间:2010-01-19 23:06:02

标签: unit-testing nunit watin

似乎关于WatiN的SO问题的共同主题与实际使事情有效有关,我也不例外。

我已经下载了WatiN的最新版本(2.0.20.1089),我正在尝试创建与Hello,World相同的NUnit / WatiN:

using WatiN.Core;
using NUnit.Framework;

namespace Foo.Browser.Tests
{
    [TestFixture]
    public class BrowserTests
    {
        [Test]
        [STAThread]
        public void ExampleTest()
        {

            IE ie = new IE("http://www.google.com");

            ie.TextField(Find.ByName("q")).TypeText("WatiN");
            ie.Button(Find.ByValue("Google Search")).Click();
            Link link = ie.Link(Find.ByUrl("http://watin.sourceforge.net/"));

            Assert.That(link.Text == "WatiN Home");
        }

        [Test]
        public void FirefoxTest()
        {
            FireFox ff = new FireFox("http://www.google.com");

            ff.TextField(Find.ByName("q")).TypeText("WatiN");

            ff.Button(Find.ByValue("Google Search")).Click();
            Link link = ff.Link(Find.ByUrl("http://watin.sourceforge.net/"));

            Assert.That(link.Text == "WatiN Home");
        }
    }

这会在最终超时后使用以下堆栈跟踪提示IE(8):

  

在   WatiN.Core.UtilityClasses.TryFuncUntilTimeOut.ThrowTimeOutException(例外   lastException,String message)at   WatiN.Core.UtilityClasses.TryFuncUntilTimeOut.HandleTimeOut()   在   WatiN.Core.UtilityClasses.TryFuncUntilTimeOut.Try [T](DoFunc'1   func)at   WatiN.Core.WaitForCompleteBase.WaitUntil(DoFunc'1   waitWhile,   BuildTimeOutExceptionMessage   exceptionMessage)at   WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitWhileFrameDocumentNotAvailable(IWebBrowser2的   框架)   WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitForFramesToComplete(的IHTMLDocument2   maindocument)at   WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitForFramesToComplete(的IHTMLDocument2   maindocument)at   WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitForCompleteOrTimeout()   在   WatiN.Core.WaitForCompleteBase.DoWait()   在   WatiN.Core.DomContainer.WaitForComplete(IWAIT   waitForComplete)at   WatiN.Core.IE.WaitForComplete(的Int32   waitForCompleteTimeOut)at   WatiN.Core.DomContainer.WaitForComplete()   在WatiN.Core.Browser.GoTo(Uri url)at   WatiN.Core.IE.FinishInitialization(URI   uri)at   WatiN.Core.IE.CreateNewIEAndGoToUri(URI   uri,IDialogHandler   logonDialogHandler,布尔值   createInNewProcess)at   WatiN.Core.IE..ctor(String url)at   Foo.Browser.Tests.BrowserTests.ExampleTest()   在   C:\开发\富\ Foo.Browser.Tests \ BrowserTests.cs:行   19

我在WatiN documentation page中指定的bin \ debug文件夹(Foo.Browser.Tests.dll.config)中有必要的配置文件,那么还有什么可能呢? 有没有人对可能导致问题的原因有任何建议?

6 个答案:

答案 0 :(得分:5)

菲尔,

查看抛出的TimeoutExcepetion的InnerException。这很可能包含更多信息来解决您的问题。

HTH Jeroen van Menen 领导开发WatiN

答案 1 :(得分:5)

看起来Phil可能已经回答了您的问题,但我发现您的示例也会抛出异常。为了解决上述问题,我将链接查找更改为按属性(href)查找,如下所示。

[Test]
public void ExampleTest()
{
    IE ie = new IE("http://www.google.com"); 

    ie.TextField(Find.ByName("q")).TypeText("WatiN"); 
    ie.Button(Find.ByValue("Google Search")).Click(); 
    Link link = ie.Link(Find.By("href", "http://watin.sourceforge.net/"));

    Assert.That(link.Text == "WatiN Home"); 
}

请注意,我只测试了IE,因为此框没有安装FireFox。

答案 2 :(得分:2)

我对此代码有类似的问题

var link1 = WebBrowser.Current.Link(Find.ByText("Log Off"));
var exists = link1.Exists;

因此得到了解决......

var link1 = WebBrowser.Current.Link(Find.ByText("Log Off"));
link1.WaitUntilExists();
var exists = link1.Exists;

答案 3 :(得分:1)

我自己通过xUnit.net遇到了大问题。

这是一个清单,人们可以随时编辑和/或建议更新:

  • NUnit进程是管理员吗? IE是它的产卵管理员吗?看看任务管理器。 (并不是以管理员身份运行是灵丹妙药 - 你理想地想要避免这种情况,但作为一种消除不工作原因的方法)
  • 通过TestDriven.net,CodeRush或ReSharper运行是否有帮助?
  • 您[引用相关的dll作为获取方式]依赖的DLL,例如shdocvvw.dll与您的测试程序集并列吗?
  • 你是否试过看Fiddler是否显示出任何超时?
  • 您是否尝试过手动浏览以确保在上下文中已确定任何安全对话框?例如,有时您的测试上下文可能是管理员,而您的正常浏览配置文件可能不是(取决于浏览器) - 例如,如果您在一个上下文中忽略了证书警告而在另一个上下文中没有,这可能会导致问题。

WatiN的一个重要问题是,在WS08 IE上几千次调用之后,拒绝合作,直到你再次注销(参见我的一个未解决的问题)。我关闭的路线(我需要防故障监控)是使用WatiN记录器,然后使用WebRequest使用手工编码的GET / POST查询将其移植到HtmlAgilityPack,使用手工编码的GET / POST内容很好但显然无法处理显然呈现的JavaScript它适用于许多场景。

答案 4 :(得分:0)

我遇到了与Ruben关于注销/登录情况类似的问题。到目前为止我能找到的最好的推理与WatiN使用COM服务器运行IE的事实有关。可能存在关于处置的问题,但这是另一个奥普拉......

就超时情况而言,它偶尔会发生,但它通常会在NUnit控制台中弹出一条消息,然后继续。我在实现和我的实现之间可以看到的一个很大的区别是我将IE实例作为单例对象运行。这样,我就不必在测试之间关闭并重新打开IE,因此我没有遇到过注销/登录问题。因此,即使IE可见并且未在后台运行,我的测试周期也会缩短。

答案 5 :(得分:0)

public void ExampleTest() 
    { 

        IE ie = new IE("http://www.google.com"); 

        ie.TextField(Find.ByName("q")).TypeText("WatiN"); 
        var btnSearch = ie.Button(Find.ByValue("Google Search"));
        btnSearch.ClickNoWait();
        ie.WaitforComplete(); 
        Link link = ie.Link(Find.ByUrl("http://watin.sourceforge.net/")); 

        Assert.That(link.Text == "WatiN Home"); 
    }