【发布时间】:2018-09-06 22:32:39
【问题描述】:
这两天我一直在拔头发。
我得到了一个新的、速度更快的测试框,但它每次都在代码中的相同位置以及测试周期中非常相似的位置开始持续失败。
我正在运行 Visual Studio 2017,但这并不真正相关。最新的 TFS 服务器,我想也是 2017 年的。我有两个测试盒,安装了测试电源外壳代理、测试 gui 代理和测试控制器。其中一个确实又旧又慢,除了出现超时问题外,它的效果很好。我尝试迁移到的较新版本正在运行 Windows 10。
Windows 10 测试框以我用于测试的域用户身份登录,该用户是本地管理员,并且是用于安装所有测试代理的用户。我运行 UltraVNC 远程连接到我的测试盒,以避免 RDP 和 TeamViewer 给测试代理带来的问题。
代码在 5 次迭代中运行良好,但在一次特定测试期间,它总是在 3 次迭代中出错。迭代通常在同一时间点进行,但并不总是使用相同的数据。
触发错误的代码是:
Mouse.Click(save_tab);
其中 save_tab 是一个 UITestControl 对象,一个网页上的超链接。
触发的错误是:
消息:自动化引擎无法回放测试,因为它 无法与桌面交互。如果 运行测试的计算机被锁定或其远程会话窗口被锁定 最小化。
堆栈跟踪:在 Microsoft.VisualStudio.TestTools.UITesting.UITestLogGenerator.ExceptionRecorder(异常 异常,布尔重新抛出)在 Microsoft.VisualStudio.TestTools.UITesting.Playback.ThrowIfScreenLockedOrRemoteSessionMinimized() 在 Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(异常 异常,IPlaybackContext 上下文)在 Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(异常 异常,字符串 actionName,UITestControl uiControl)在 Microsoft.VisualStudio.TestTools.UITesting.UITestActionExecutorCore.Click(UITestControl 控件、MouseButtons 按钮、ModifierKeys 修饰键、点 相对坐标)在 Microsoft.VisualStudio.TestTools.UITesting.Mouse.ClickImplementation(UITestControl 控件、MouseButtons 按钮、ModifierKeys 修饰键、点 相对坐标)在 Microsoft.VisualStudio.TestTools.UITesting.Mouse.c__DisplayClass32_0.b__0() 在 Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 函数,UITestControl 控件,布尔型 firePlaybackErrorEvent, 布尔 logAsAction) 在 Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click(UITestControl 控件、MouseButtons 按钮、ModifierKeys 修饰键、点 相对坐标)在 Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click(UITestControl 控制)
我已经使用 VNC 来实际观察测试机器,因为它触发了这些错误。屏幕保护程序永远不会打开(它被禁用),屏幕永远不会进入睡眠状态(也被禁用)。相反,整个测试在触发错误之前会挂起一段时间。
在我的 try-cache 的 catch 部分中,我尝试使用测试浏览器对象截取屏幕截图并得到这个错误:
消息:参数无效。
StackTrace:在 System.Drawing.Graphics.GetHdc() 处 System.Drawing.Graphics.CopyFromScreen(Int32 sourceX,Int32 sourceY, Int32 目的地X,Int32 目的地Y,大小blockRegionSize, 复制像素操作复制像素操作)在 System.Drawing.Graphics.CopyFromScreen(Int32 sourceX,Int32 sourceY, Int32 目的地X,Int32 目的地Y,大小块区域大小)在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.CaptureImagePrivate() 在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.b__173_0() 在 Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 函数,UITestControl 控件,布尔型 firePlaybackErrorEvent, 布尔 logAsAction) 在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.CaptureImage() 在 Testing.Base_CodedUITest.CaptureAndSaveImage(UITestControl 文档, 字符串文件名)
然后我尝试使用以下方法截屏:
UITestControl.Desktop.CaptureImage();
导致此错误:
消息:参数无效。
StackTrace:在 System.Drawing.Bitmap..ctor(Int32 宽度,Int32 高度, PixelFormat 格式)在 System.Drawing.Bitmap..ctor(Int32 宽度,Int32 高度)在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.CaptureImagePrivate() 在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.b__173_0() 在 Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 函数,UITestControl 控件,布尔型 firePlaybackErrorEvent, 布尔 logAsAction) 在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.CaptureImage() 在 Testing.Base_CodedUITest.CaptureAndSaveImage(UITestControl 文档, 字符串文件名)
很明显,测试由于某种原因无法与计算机通信。我不知道为什么。处理此错误后,测试将继续成功地连续多次重复完全相同的测试,然后再次触发相同的错误。
在这个问题上我确实有另一个可能的线索。当连接到这个运行 UltraVNC 的测试盒时,我会定期收到一条消息,表明连接已被服务器(测试盒)终止,但之后总是会重新连接。我的旧测试盒没有这个问题。在其中一个 UltraVNC 连接中断期间,我尝试对这个较新的测试盒进行持续 ping 测试,但没有发现速度降低或数据包丢失。整个局域网的连接时间不到 1ms。
有人知道发生了什么吗?
编辑:根据建议,我开始查看事件日志。 Source = VSTTExecution 的一个事件让我觉得很奇怪。
(vstest.console.exe,PID 5356,线程 9) 无法加载 TestTypes{13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b} 因为由于以下原因无法实例化 TIP: 已添加具有相同密钥的项目。
Source = VSTTController 有这个,但不要认为这是一个问题,因为测试实际上正在运行。我怀疑我安装的控制器和代理软件可能只是旧的,不再需要了。
控制器服务无法连接到测试管理服务器。 无法加载文件或程序集“Microsoft.VisualStudio.Threading, 版本=15.6.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a' 或 它的依赖项之一。定位程序集的清单定义 与程序集引用不匹配。 (HRESULT 的例外情况: 0x80131040)
还有这个,Source = VSTTAgentProcess:
(QTDCAgent32.exe,PID 10416,线程 51)DataCollectionAgentProcess: 父进程退出。父退出代码:-1
编辑 2:
当我尝试收集更多关于此的数据时,我发现此错误与其他错误几乎同时发生。我认为这只是一个更深层次的错误。不幸的是,它也更通用,因此很难在 Google 上找到任何内容。在这一点上,我很确定操作系统、IE 或测试引擎内部存在问题。我的希望是找到解决办法。一个月后,我将能够在另一个硬件上进行测试。
第二个错误是我试图截取屏幕截图的原始错误。我正在尝试单击一个按钮。一个非常明显且可用的按钮,没有可见的错误。由于某种原因,CodedUI 测试引擎似乎无法识别 IE 甚至存在。但是,一旦这个错误过去了,测试引擎就能够选择浏览器备份并继续测试中的下一页。
错误级别 2
消息:播放未能找到给定搜索的控件 特性。其他详细信息: TechnologyName:'Web' ControlType: 'Document' TagName: 'BODY' 未能找到任何与 搜索条件 ControlType='Document'
堆栈跟踪:在 Microsoft.VisualStudio.TestTools.UITesting.Playback.MapControlNotFoundException(COMException 例如,IPlaybackContext 上下文)在 Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowComException(COMException innerException,IPlaybackContext 上下文)在 Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(异常 异常,IPlaybackContext 上下文)在 Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(异常 异常,字符串 queryId) 在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(字符串 queryId, Int32 maxDepth, Int32& timeLeft) 在 Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetUITestControlRecursive(布尔 useCache, Boolean alwaysSearch, ISearchArgument searchArg, IList
1 windowTitles, Int32& timeLeft) at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetElement(Boolean useCache, ISearchArgument searchArg) at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.Search(ISearchArgument searchArg) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindInternal() at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindControlIfNecessary() at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.WaitForControlReadyPrivate(Int32 millisecondsTimeout, Boolean doLogging) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.<>c__DisplayClass186_0.b__0() at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func1 函数,UITestControl 控件,布尔型 firePlaybackErrorEvent, 布尔 logAsAction) 在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.WaitForControlReady(Int32 毫秒超时)在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.WaitForControlReady() 在 Testing.Base_CodedUITest.NavigateToUrl(String url) 中 c:\agent_work\2\s\VerizonOTM\Other\trc_UITesting\Tests\UI\Base_CodedUITest.cs:line 348错误级别 3
消息:对 COM 的调用已返回错误 HRESULT E_FAIL 零件。
堆栈跟踪:在 Microsoft.VisualStudio.TestTools.UITest.Playback.Engine.IScreenElement.FindAllDescendants(字符串 bstrQueryId, Object& pvarResKeys, Int32 cResKeys, Int32 nMaxDepth) 在 Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindAllScreenElement(字符串 queryId, Int32 深度, Boolean singleQueryId, Boolean throwException, 布尔 resetSkipStep) 在 Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindScreenElement(字符串 queryId,Int32 深度,布尔值 resetSkipStep)在 Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(字符串 queryId, Int32 maxDepth, Int32& timeLeft)
【问题讨论】:
-
我对你的问题一无所知,我还没有遇到这个问题。但这里有一些想法可能会帮助你。您的所有测试都在您的 devPC 上成功运行吗?这可以排除测试本身是问题的根源。您是否在进行额外检查以确保 save_tab 可用且可访问?如果测试机器是您的问题的根源,您是否在 windows 事件查看器中找到任何线索?
-
事件查看器似乎有很多与测试相关的错误。测试代理没有连接,但这似乎并不影响测试,这让我怀疑它是否有必要,它可能是一个较旧的工具。 vstest.console.exe 有一个错误,看起来可能会影响某些事情,所以我要调查一下。
-
我尝试更新 VS、测试代理和测试控制器,因为这是我在日志中看到的错误之一的解决方案。但是问题仍然存在,日志中的所有三个错误也是如此。
-
我假设您使用了描述性(从您的代码创建对控件的引用,而不是依赖于测试生成器)。在这种情况下,您可以尝试使用 Playback.PlaybackSettings.MatchExactHierarchy = false 等播放设置进行播放吗?或 Playback.PlaybackSettings.WaitForReadyLevel = WaitForReadyLevel.Disabled 或延长思考时间?
-
我搞砸了这些设置,是的。这些的困难部分是我相信在 CodedUI 实际查找控件之前它们实际上并没有被使用。所以,例如。我有这三行: Playback.PlaybackSettings.AlwaysSearchControls = true; this._BaseBrowser = new BaseBrowser(TestContextInstance); Playback.PlaybackSettings.AlwaysSearchControls = false;但是,我认为,除非某些东西以引擎需要找到它的方式实际使用 _BaseBrowser 变量,否则它实际上不会查找控件,并且这些设置将不适用
标签: c# .net automated-tests coded-ui-tests