自动化引擎无法回放测试,因为它无法与桌面交互...但桌面未锁定
Automation engine is unable to playback the test because it is not able to interact with the desktop... but desktop not locked
我已经为这个问题烦恼了两天了。
我得到了一个新的、更快的测试箱,它每次都在代码中的相同位置以及测试周期中非常相似的位置开始不断失败。
我是 运行宁 Visual Studio 2017 年,尽管这并不重要。最新的 TFS 服务器,我想也是 2017 年的。我有两个测试盒,安装了测试电源 shell 代理、测试 gui 代理和测试控制器。其中一个真的很旧而且很慢,除了有超时问题之外它工作得很好。我要迁移到的较新版本是 运行ning windows 10.
windows10测试箱以我用于测试的域用户身份登录,该用户是本地管理员,是用于安装所有测试代理的用户。我 运行 UltraVNC 远程连接到我的测试箱,以避免 RDP 和 TeamViewer 对测试代理造成的问题。
代码将 运行 非常适合 5 次六次迭代,但在一次特定测试中,它总是在三次迭代中出错。迭代通常围绕同一时间点进行,但并不总是使用相同的数据。
触发错误的相关代码是:
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)
很明显,由于某种原因,测试无法与计算机通信。我不确定为什么。处理此错误后,测试将继续连续多次成功重复完全相同的测试,然后再次触发相同的错误。
关于这个问题,我还有其他可能的线索。当连接到此测试盒 运行ning UltraVNC 时,我会定期收到一条消息,表明连接已被服务器(测试盒)终止,但之后总是会重新连接。我的旧测试盒没有这个问题。在其中一个 UltraVNC 连接中断期间,我尝试 运行 对这个较新的测试盒进行持续的 ping 测试,但没有发现速度下降或数据包丢失。我们整个局域网的连接不到 1ms。
有谁知道发生了什么事吗?
编辑:根据建议,我开始查看事件日志。 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 有这个,但不要认为这是一个问题,因为测试实际上是 运行ning。我怀疑我安装的控制器和代理软件可能只是旧的,不再需要了。
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 上找到任何东西。在这一点上,我非常确定 OS、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\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 表示它已准备就绪。而且没有我可以查找的页面更改,因为页面实际上并没有更改。
我的测试结构方式,我在我网站的一个页面上,我动态地 built URL 来下载文件,并试图导航到那个 URL.这将导致发生以下两种情况之一:文件出错并且站点实际导航到该文件 URL,或者文件将显示供下载。
所以我的解决方案最终是设置一个很长的超时时间(10 分钟),然后不断循环检查 URL 是否仍然相同,以及是否已经提供文件供下载.这让我甚至可以等待下载时间更长的文件。一旦浏览器真正完成了下载请求,它就可以再次用于 CodedUI 并且我的测试能够继续进行。
我已经为这个问题烦恼了两天了。
我得到了一个新的、更快的测试箱,它每次都在代码中的相同位置以及测试周期中非常相似的位置开始不断失败。
我是 运行宁 Visual Studio 2017 年,尽管这并不重要。最新的 TFS 服务器,我想也是 2017 年的。我有两个测试盒,安装了测试电源 shell 代理、测试 gui 代理和测试控制器。其中一个真的很旧而且很慢,除了有超时问题之外它工作得很好。我要迁移到的较新版本是 运行ning windows 10.
windows10测试箱以我用于测试的域用户身份登录,该用户是本地管理员,是用于安装所有测试代理的用户。我 运行 UltraVNC 远程连接到我的测试箱,以避免 RDP 和 TeamViewer 对测试代理造成的问题。
代码将 运行 非常适合 5 次六次迭代,但在一次特定测试中,它总是在三次迭代中出错。迭代通常围绕同一时间点进行,但并不总是使用相同的数据。
触发错误的相关代码是:
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)
很明显,由于某种原因,测试无法与计算机通信。我不确定为什么。处理此错误后,测试将继续连续多次成功重复完全相同的测试,然后再次触发相同的错误。
关于这个问题,我还有其他可能的线索。当连接到此测试盒 运行ning UltraVNC 时,我会定期收到一条消息,表明连接已被服务器(测试盒)终止,但之后总是会重新连接。我的旧测试盒没有这个问题。在其中一个 UltraVNC 连接中断期间,我尝试 运行 对这个较新的测试盒进行持续的 ping 测试,但没有发现速度下降或数据包丢失。我们整个局域网的连接不到 1ms。
有谁知道发生了什么事吗?
编辑:根据建议,我开始查看事件日志。 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 有这个,但不要认为这是一个问题,因为测试实际上是 运行ning。我怀疑我安装的控制器和代理软件可能只是旧的,不再需要了。
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 上找到任何东西。在这一点上,我非常确定 OS、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, 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](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\s\VerizonOTM\Other\trc_UITesting\Tests\UI\Base_CodedUITest.cs:line 348error 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 表示它已准备就绪。而且没有我可以查找的页面更改,因为页面实际上并没有更改。
我的测试结构方式,我在我网站的一个页面上,我动态地 built URL 来下载文件,并试图导航到那个 URL.这将导致发生以下两种情况之一:文件出错并且站点实际导航到该文件 URL,或者文件将显示供下载。
所以我的解决方案最终是设置一个很长的超时时间(10 分钟),然后不断循环检查 URL 是否仍然相同,以及是否已经提供文件供下载.这让我甚至可以等待下载时间更长的文件。一旦浏览器真正完成了下载请求,它就可以再次用于 CodedUI 并且我的测试能够继续进行。