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

3

我有一个编写的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的正确值),这让我相信这是环境变量而不是代码问题导致的。
此外,如果我们每次调用对象时都调用get函数来动态设置和更新GlobalVariable.browser对象,会怎样呢?(如下所示:)
private BrowserWindow _browser;
public BrowserWindow browser
{
    get
    {
        BrowserWindow currentWindow = BrowserWindow.FromProcess(_browser.Process);
        return currentWindow;
    }
    set 
    {
        _browser = value;
        return _browser;
    }
}

如果传入一个已经存在的进程 ID (PID),则会基于该系统进程创建对象,并具有正确的属性。因此,本质上,在初始化方法期间创建的 BrowserWindow 对象在其运行过程中不会被更新,我们必须基于该进程创建一个新对象。同样,这只发生在某些远程环境中,而不是在本地设置的开发机器上。我错过了什么?

1个回答

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

总之,底层代码反复重新创建提供Uri getter的IEBrowserService,并以不确定的方式进行,因此通过重复这种模式(按需创建浏览器窗口),您只是重复微软内部使用的模式。


我想我明白你的意思,这就是为什么我认为通过BrowserWindow.GetProcess()获取新进程可以工作,而仅仅再次调用对象却不行,这似乎有些愚蠢。除非你是在暗示前者之所以有效是因为这是微软的做法。 - Ryan Cox
1
是的 - 看起来代码内部期望IE连接“随机”不可用或断开,并根据需要重新创建连接。因此,您可能会看到基于过时对象的缓存URI;如果重新创建有效,则似乎没有必要在需要时重新创建对象。 - PhillipH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接