Unit testing 使用WatiN和NUnit进行单元测试

Unit testing 使用WatiN和NUnit进行单元测试,unit-testing,nunit,watin,Unit Testing,Nunit,Watin,看来,关于WatiN的所有问题的共同主题都与实际工作有关,我也不例外 我已经下载了WatiN的最新版本(2.0.20.1089),并正在尝试创建NUnit/WatiN的Hello,World: using WatiN.Core; using NUnit.Framework; namespace Foo.Browser.Tests { [TestFixture] public class BrowserTests { [Test] [STA

看来,关于WatiN的所有问题的共同主题都与实际工作有关,我也不例外

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

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.tryFuncuntitimeout.ThrowTimeOutException(异常 lastException,字符串消息)位于 WatiN.Core.UtilityClasses.tryFuncuntitimeout.HandleTimeOut() 在 WatiN.Core.UtilityClasses.tryFuncuntitimeout.Try[T](DoFunc'1) func)at WatiN.Core.WaitForCompleteBase.WaitUntil(DoFunc'1 等等, BuildTimeOutExceptionMessage 例外消息)在 WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitWhileFrameDocumentNotAvailable(IWebBrowser2 帧)在 WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitForFramesToComplete(IHTMLDocument2 主文档)位于 WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitForFramesToComplete(IHTMLDocument2 主文档)位于 WatiN.Core.Native.InternetExplorer.IEWaitForComplete.waitforcomplete或timeout() 在 WatiN.Core.WaitForCompleteBase.DoWait() 在 WatiN.Core.DomContainer.WaitForComplete(IWait 等待(完成)在 WatiN.Core.IE.WaitForComplete(Int32 等待完成时间)在 WatiN.Core.DomContainer.WaitForComplete() 位于WatiN.Core.Browser.GoTo(Uri url) WatiN.Core.IE.FinishInitialization(Uri uri)在 WatiN.Core.IE.CreateNewIEAndGoToUri(Uri 乌里,伊达洛甘德勒 logonDialogHandler,布尔型 createInNewProcess)位于 WatiN.Core.IE..ctor(字符串url)位于 Foo.Browser.Tests.BrowserTests.ExampleTest() 在里面 C:\Development\Foo\Foo.Browser.Tests\BrowserTests.cs:line 十九,

我的bin\debug文件夹(Foo.Browser.Tests.dll.config)中有在上指定的必需配置文件,那么它可能是什么呢?
有人对问题的起因有什么建议吗?

我自己也没有通过xUnit.net遇到大问题

这是一份洗衣单,人们可以随意编辑和/或建议更新:

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

沃特说,有一个让我头疼的大问题是,在WS08上调用了几千次之后,IE会拒绝合作,直到你再次注销(请参阅我的一个悬而未决的问题)。我走的路线(我需要防故障监控)是使用WatiN记录器,然后将它们移植到HtmlAgilityPack,使用LINQ查询,使用WebRequest手动编码GET/POST,这很好,但显然不能处理JavaScript,这显然使它在许多场景中具有学术性。

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

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

Phil

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

嗯 杰伦·范梅宁
负责人dev WatiN看起来Phil可能已经回答了您的问题,但我发现您的示例也抛出了异常。为了解决上述问题,我将链接Find改为look by attribute(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。

我在这段代码中遇到了类似的问题

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

哇。这听起来像是在虚张声势。NUnit是进程管理员。