gpt4 book ai didi

c# - 自动化引擎无法播放测试,因为它无法与桌面交互...但桌面未锁定

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:05 24 4
gpt4 key购买 nike

我已经把头发拉了两天了。

我得到了一个新的、速度更快的测试盒,它每次都在代码中的同一位置以及测试周期中非常相似的位置开始持续失败。

我正在运行 Visual Studio 2017,尽管这并不相关。最新的 TFS 服务器,我想也是 2017 年的。我有两个测试盒,安装了测试电源外壳代理、测试 gui 代理和测试 Controller 。其中一个确实又旧又慢,除了出现超时问题外,它的效果很好。我尝试迁移到的较新版本正在运行 Windows 10。

windows 10 测试框以我用于测试的域用户身份登录,该用户是本地管理员,并且是用于安装所有测试代理的用户。我运行 UltraVNC 远程连接到我的测试盒,以避免 RDP 和 TeamViewer 给测试代理带来的问题。

该代码在 5 次迭代中运行良好,但在一次特定测试中,它总是在 3 次迭代中出错。迭代通常在同一时间点左右,但并不总是使用相同的数据。

触发错误的代码是:

Mouse.Click(save_tab);

其中 save_tab 是一个 UITestControl 对象,一个网页上的超链接。

触发的错误是:

Message: Automation engine is unable to playback the test because it is not able to interact with the desktop. This could happen if the computer running the test is locked or it’s remote session window is minimized.

StackTrace: at Microsoft.VisualStudio.TestTools.UITesting.UITestLogGenerator.ExceptionRecorder(Exception exception, Boolean rethrow) at Microsoft.VisualStudio.TestTools.UITesting.Playback.ThrowIfScreenLockedOrRemoteSessionMinimized() at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception exception, IPlaybackContext context) at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception exception, String actionName, UITestControl uiControl) at Microsoft.VisualStudio.TestTools.UITesting.UITestActionExecutorCore.Click(UITestControl control, MouseButtons button, ModifierKeys modifierKeys, Point relativeCoordinate) at Microsoft.VisualStudio.TestTools.UITesting.Mouse.ClickImplementation(UITestControl control, MouseButtons button, ModifierKeys modifierKeys, Point relativeCoordinate) at Microsoft.VisualStudio.TestTools.UITesting.Mouse.<>c__DisplayClass32_0.b__0() at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction) at Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click(UITestControl control, MouseButtons button, ModifierKeys modifierKeys, Point relativeCoordinate) at Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click(UITestControl control)



我已经使用 VNC 来实际观察测试机器,因为它触发了这些错误。屏幕保护程序永远不会打开(它被禁用),屏幕永远不会进入休眠状态(也被禁用)。相反,整个测试在触发错误之前会挂起一段时间。

在我的 try-cache 的 catch 部分中,我尝试使用测试浏览器对象截取屏幕截图并得到此错误:

Message: Parameter is not valid.

StackTrace: at System.Drawing.Graphics.GetHdc() at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize, CopyPixelOperation copyPixelOperation) at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.CaptureImagePrivate() at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.b__173_0() at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.CaptureImage() at Testing.Base_CodedUITest.CaptureAndSaveImage(UITestControl doc, String FileName)



然后我尝试使用以下方法截取屏幕截图:
UITestControl.Desktop.CaptureImage();

导致此错误:

Message: Parameter is not valid.

StackTrace: at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format) at System.Drawing.Bitmap..ctor(Int32 width, Int32 height) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.CaptureImagePrivate() at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.b__173_0() at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.CaptureImage() at Testing.Base_CodedUITest.CaptureAndSaveImage(UITestControl doc, String FileName)



很明显,由于某种原因,测试无法与计算机通信。我不知道为什么。处理此错误后,测试将继续成功地连续多次重复完全相同的测试,然后再次触发相同的错误。

关于这个问题,我确实有另一个可能的线索。当连接到这个运行 UltraVNC 的测试盒时,我会定期收到一条消息,表明连接已被服务器(测试盒)终止,但之后总是会重新连接。我的旧测试盒没有这个问题。在其中一个 UltraVNC 连接中断期间,我尝试对这个较新的测试盒进行持续 ping 测试,但没有发现速度降低或数据包丢失。我们整个局域网的连接时间不到 1 毫秒。

有谁知道发生了什么?

编辑:根据建议,我开始查看事件日志。 Source = VSTTExecution 的一个事件让我觉得很奇怪。

(vstest.console.exe, PID 5356, Thread 9) TestTypes{13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b} could not be loaded because the TIP could not be instantiated for the following reason(s): An item with the same key has already been added.



Source = VSTTController 有这个,但不要认为这是一个问题,因为测试实际上正在运行。我怀疑我安装的 Controller 和代理软件可能只是旧的并且不再需要。

The Controller service could not connect to Test Management Server. Could not load file or assembly 'Microsoft.VisualStudio.Threading, Version=15.6.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)



还有这个,Source = VSTTAgentProcess:

(QTDCAgent32.exe, PID 10416, Thread 51) DataCollectionAgentProcess: Parent process exited. Parent Exit Code: -1



编辑2:

当我尝试收集更多这方面的数据时,我发现这个错误与其他错误几乎同时发生。我认为这只是一个更深层次的错误。不幸的是,它也更通用,因此很难在 Google 上找到任何内容。在这一点上,我很确定操作系统、IE 或测试引擎内部存在问题。我的希望是找到解决办法。一个月后,我也将能够在另一个硬件上进行测试。

第二个错误是我试图截取屏幕截图的原始错误。我正在尝试单击一个按钮。一个非常明显且可用的按钮,没有可见的错误。由于某种原因,CodedUI 测试引擎似乎无法识别 IE 甚至存在。但是,一旦这个错误过去了,测试引擎就能够选择浏览器备份并继续测试中的下一页。

error level 2

Message: The playback failed to find the control with the given search properties. Additional Details: TechnologyName: 'Web' ControlType: 'Document' TagName: 'BODY' Failed to find any control that matched the search condition ControlType='Document'

StackTrace: at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapControlNotFoundException(COMException ex, IPlaybackContext context) at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowComException(COMException innerException, IPlaybackContext context) at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception exception, IPlaybackContext context) at Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception exception, String queryId) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(String queryId, Int32 maxDepth, Int32& timeLeft) at Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetUITestControlRecursive(Boolean 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](Func
1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.WaitForControlReady(Int32 millisecondsTimeout) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.WaitForControlReady() at Testing.Base_CodedUITest.NavigateToUrl(String url) in c:\agent_work\2\s\VerizonOTM\Other\trc_UITesting\Tests\UI\Base_CodedUITest.cs:line 348

error level 3

Message: Error HRESULT E_FAIL has been returned from a call to a COM component.

StackTrace: at Microsoft.VisualStudio.TestTools.UITest.Playback.Engine.IScreenElement.FindAllDescendants(String bstrQueryId, Object& pvarResKeys, Int32 cResKeys, Int32 nMaxDepth) at Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindAllScreenElement(String queryId, Int32 depth, Boolean singleQueryId, Boolean throwException, Boolean resetSkipStep) at Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindScreenElement(String queryId, Int32 depth, Boolean resetSkipStep) at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(String queryId, Int32 maxDepth, Int32& timeLeft)

最佳答案

我终于解决了这个问题。

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

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

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

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

关于c# - 自动化引擎无法播放测试,因为它无法与桌面交互...但桌面未锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52212914/

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