【问题标题】:Automation engine is unable to playback the test because it is not able to interact with the desktop... but desktop not locked自动化引擎无法播放测试,因为它无法与桌面交互...但桌面未锁定
【发布时间】: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, IList1 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


【解决方案1】:

我终于解决了这个问题。

不断触发这些错误的相关测试是下载文件。如果文件的生成和下载时间过长,那么测试会尝试继续并将其记录为失败。但是,由于它实际上还没有失败(只是花了很长时间),浏览器仍然很忙,无法与 CodedUI 进行交互。

在下载过程中,浏览器没有提示正在下载文件。看起来它可以在屏幕截图中使用,编码的 ui 检测到它是可用的,DOM 说它准备好了。并且没有我可以查找的页面更改,因为该页面实际上并没有更改。

我的测试的结构方式是,我在我网站的一个页面上,我动态构建了下载文件的 URL,并尝试导航到该 URL。这将导致发生以下两种情况之一:文件出错并且站点实际上会导航到该 URL,或者文件将被呈现以供下载。

所以我的解决方案最终是设置一个很长的超时时间(10 分钟),然后继续循环检查 URL 是否仍然相同,以及是否已经提交了文件以供下载。这让我甚至可以等待下载时间更长的文件。一旦浏览器真正完成了下载请求,它就可以再次用于 CodedUI 并且我的测试能够继续进行。

【讨论】:

  • 如果您还没有这样做,请确保将 while 循环与超时结合使用,以便在下载完成后立即继续测试。这样你可能会节省一些时间。
  • 是的,我使用 codedUI 在运行 10 次的循环中等待一分钟。所以它会继续检查,以便我可以在文件可用后立即继续。
  • 一分钟在计算机方面是相当长的时间,特别是如果该测试是大量测试的一部分或运行多次。当 Coded UI 测试正在运行时,计算机应该没有太多其他事情要做,因此最好有更短的超时时间并多次运行循环。请注意单个测试和测试运行的总体超时。请参阅“.testsettings”文件的Test timeouts 部分。
  • 同意,一分钟就是很长的时间。这是 CodedUI 等待下载对象出现的时间上限。如果它出现得更早,那么它将更快地继续下去。我把它放在一个循环中,因为 CodedUI 还没有证明自己非常稳定,所以如果 CodedUI 本身有问题或挂起,那么我会在循环的下一次迭代之前给它一分钟来修复自己,在那里我再给它一个镜头.我的代码中有很多这样的小技巧,因为 CodedUI 似乎几乎可以解决所有问题。我认为把它称为测试产品以外的东西太棒了。
  • 我的一些测试确实需要很长时间才能完成我让他们完成的所有任务,我不得不增加它们的默认值,我的最长设置为 2 小时。我不使用传统的 Microsoft 数据驱动测试功能。我发现在这方面滚动我自己的数据驱动功能更易于维护。他们的系统对于我正在做的事情根本不够灵活。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 2017-11-10
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多