Unit testing 使用WatiN和NUnit进行单元测试
看来,关于WatiN的所有问题的共同主题都与实际工作有关,我也不例外 我已经下载了WatiN的最新版本(2.0.20.1089),并正在尝试创建NUnit/WatiN的Hello,World: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
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是进程管理员。