调用.NavigateToUrl(Uri uri)时,BrowserWindow.Uri属性未更新

时间:2014-10-20 19:40:06

标签: c# windows-7 automated-tests coded-ui-tests

我有一个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对象在进行过程中不会得到更新,我们必须根据进程创建一个新对象。同样,这只发生在某些远程环境中,而不是在本地设置的开发机器上。我错过了什么?

1 个答案:

答案 0 :(得分:1)

在它下面,所有提供NavigateToUrl和Uri get方法的Microsoft.VisualStudio.TestTools.UITesting.IEBrowserService都将它们的调用委托给一个名为InternetExplorerWrapper的内部类,这是一个窗口句柄的COM包装器。代码在内部对UpdateWebBrowserReferenceIfInvalid()方法进行内部检查,并在needeed时重新创建IEBrowserService实例。由于这种反复检查,我认为即使是测试框架也不能保证它所处理的IE实例不会“消失”而需要重新连接。这取决于我猜测它创建的窗口句柄的生命周期。

总之,底层代码重复重新创建提供Uri getter的IEBrowserService,并且它以非确定性的方式执行此操作,因此通过重复此模式(按需创建浏览器窗口),您只需重复一个模式微软的人自己也在内部使用过。