当我处理 Internet Explorer 对象时,我的 WatiN 测试突然变得非常慢。
这是我的设置...
* Windows 7 (Evaluation Build 7100)
* Internet Explorer 8 (Version 8.0.7100.0)
* WatiN (Version 2.0.10.928)
这很奇怪,因为大约一周前测试工作正常。我认为这是最新的 MS 更新之类的。
有任何想法吗?
当我处理 Internet Explorer 对象时,我的 WatiN 测试突然变得非常慢。
这是我的设置...
* Windows 7 (Evaluation Build 7100)
* Internet Explorer 8 (Version 8.0.7100.0)
* WatiN (Version 2.0.10.928)
这很奇怪,因为大约一周前测试工作正常。我认为这是最新的 MS 更新之类的。
有任何想法吗?
My setup:
*IE 9
*Windows 7
*Watin 2.1
*Visual Studio 10 SP1, using Microsoft.VisualStudio.TestTools.UnitTesting
由于我有多个 TestMethods 和 TestClasses,我想将 IE.Close() 放在 AssemblyCleanup() 方法中。由于 MSTest 线程问题,我不得不像这样调用 close() :
[AssemblyCleanup()]
public static void CleanupAllTests()
{
var thread = new Thread(() =>
{
IE.Close();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
*再次,此片段中的 IE 指的是一个属性,它将使用上面链接中的策略检查并附加到我的 IE 实例。如果没有我链接到的其余模式,此代码段可能无法解决您的问题。
在此设置之前,IE 有时需要 30 多秒才能关闭,现在我可以在测试运行时打开和关闭其他所有我想要的 IE 窗口,并且浏览器总是可靠地关闭。
您需要做的是将运行测试的线程设置为 STA 模式,IE 将快速关闭。
[CodedUITest]
public class DoSomeAutomatedTesting
{
public DoSomeAutomatedTesting()
{
// Hey! Hey! Hey! We can't do no MTA!
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
}
[TestMethod]
public void MyTestMethod()
{
using(var ie = new IE())
{
ie.AutoClose = true;
ie.GoTo("http://www.google.com");
}
}
}
对于那些不是做过COM编程的老屁的人来说,这描述了一个STA http://msdn.microsoft.com/en-us/library/windows/desktop/ms680112(v=vs.85).aspx . 简短的故事,STA 是 COM 使用的一种老派技术,用于在可怕的、新奇的抢占式多线程世界中保留现有的、经过测试的、工作的、单线程代码的可行性,这些代码是 Windows 95 天遗留下来的。
现在,CLR 存在于 COM 所称的 MTA 中。对于我们这些不住在 1998 年的人来说,您可以将 MTA 视为现实世界,一切都以应有的方式运行。http://msdn.microsoft.com/en-us/library/windows/desktop/ms693421(v=vs.85).aspx
当超级可怕的 MTA 中的某个线程想要访问 STA 中的某些内容时,如果 STA 当前正在由与 MTA 不同的线程访问,则 MTA 线程被告知坐在工作台上等待轮到它。这基本上意味着有时,当天气不合适时,您可能会遇到这些奇怪的滞后。
我在 IE9 上遇到了同样的间歇性问题。我两边的同事都没有同样的问题。我们刚刚意识到我的默认浏览器是 IE,我倾向于在运行多个选项卡的情况下打开它。
在我的 WatIn 测试运行时,我一直在桌面上没有打开 IE 的情况下工作,自从我采用这种做法以来,我没有遇到过问题。
可能是巧合,也可能是答案?!