gpt4 book ai didi

c# - 调用 .NavigateToUrl(Uri uri) 时 BrowserWindow.Uri 属性未更新

转载 作者:行者123 更新时间:2023-11-30 17:46:12 30 4
gpt4 key购买 nike

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

最佳答案

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

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

关于c# - 调用 .NavigateToUrl(Uri uri) 时 BrowserWindow.Uri 属性未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26473609/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com