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

本文关键字:Uri BrowserWindow 属性 更新 NavigateToUrl Uri-Uri 调用 | 更新日期: 2023-09-27 18:27:09

我有一个编码的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.brower对象,而是每次调用该对象时调用get函数(如下所示:

private BrowserWindow _browser;
public BrowserWindow browser
{
    get
    {
        BrowserWindow currentWindow = BrowserWindow.FromProcess(_browser.Process);
        return currentWindow;
    }
    set 
    {
        _browser = value;
        return _browser;
    }
}

),则该对象将基于系统进程创建并具有正确的属性。因此,从本质上讲,在初始化方法中创建的BrowserWindow对象在进行过程中不会得到更新,我们必须基于该过程创建一个新对象。同样,这种情况只发生在一些远程环境中,而不发生在本地设置的开发机器上。我错过了什么?

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

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

总之,底层代码重复地重新创建IEBrowserService,它提供了你的Uri getter,而且它是以一种不确定的方式来做这件事的,所以通过重复这种模式(根据需要创建浏览器窗口),你只是在重复微软内部使用的模式。