调用.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对象在进行过程中不会得到更新,我们必须基于该过程创建一个新对象。同样,这种情况只发生在一些远程环境中,而不发生在本地设置的开发机器上。我错过了什么?
下面的所有Microsoft.VisualStudio.TestTools.UITesting.IEBrowserService都提供NavigateToUrl和Uri-get方法,它们将调用委托给名为InternetExplorerWrapper的内部类,该类是Window Handle的COM包装器。代码在内部重复检查方法UpdateWebBrowserReferenceIfInvalid(),并在需要时重新创建IEBrowserService实例。由于这种反复检查,我认为即使是测试框架也不能保证它正在处理的IE实例不会"消失",需要重新连接。我想这取决于它创建的窗口句柄的使用寿命。
总之,底层代码重复地重新创建IEBrowserService,它提供了你的Uri getter,而且它是以一种不确定的方式来做这件事的,所以通过重复这种模式(根据需要创建浏览器窗口),你只是在重复微软内部使用的模式。