我有一个Coded UI测试方法:
public void MyTestMethod()
{
string baseUrl = "www.google.com";
GlobalVariable.browser = BrowserWindow.Launch(new System.Uri(baseUrl));
GlobalVariable.browser.NavigateToUrl(new System.Uri(baseUrl + "/images"));
string expected = baseUrl + "/images";
Assert.AreEqual(expected, GlobalVariable.browser.Uri);
}
但是,断言时GlobalVariable.browser.Uri
的值仍然指向www.google.com,即使浏览器已成功导航到预期。我尝试设置Playback.Wait()
以确保我没有过早断言。奇怪的是,这只发生在一个或两个开发环境中(其他环境显示GlobalVariable.browser.Uri
的正确值),这让我相信有一些环境变量而不是代码问题。
此外,如果我们不是静态设置和更新GlobalVariable.browser对象,而是每次调用对象时调用get
函数(如下所示:
private BrowserWindow _browser;
public BrowserWindow browser
{
get
{
BrowserWindow currentWindow = BrowserWindow.FromProcess(_browser.Process);
return currentWindow;
}
set
{
_browser = value;
return _browser;
}
}
),然后根据系统进程创建对象并具有正确的属性。基本上,在我们的初始化方法中创建的BrowserWindow对象在进行过程中不会得到更新,我们必须根据进程创建一个新对象。同样,这只发生在某些远程环境中,而不是在本地设置的开发机器上。我错过了什么?
答案 0 :(得分:1)
在它下面,所有提供NavigateToUrl和Uri get方法的Microsoft.VisualStudio.TestTools.UITesting.IEBrowserService都将它们的调用委托给一个名为InternetExplorerWrapper的内部类,这是一个窗口句柄的COM包装器。代码在内部对UpdateWebBrowserReferenceIfInvalid()方法进行内部检查,并在needeed时重新创建IEBrowserService实例。由于这种反复检查,我认为即使是测试框架也不能保证它所处理的IE实例不会“消失”而需要重新连接。这取决于我猜测它创建的窗口句柄的生命周期。
总之,底层代码重复重新创建提供Uri getter的IEBrowserService,并且它以非确定性的方式执行此操作,因此通过重复此模式(按需创建浏览器窗口),您只需重复一个模式微软的人自己也在内部使用过。