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

时间:2018-09-06 22:32:39

标签: c# .net automated-tests coded-ui-tests

我已经从这根头发上拉了两天了。

我有了一个新的且速度更快的测试箱,并且每次在代码中的相同位置以及测试周期中非常相似的位置,它都开始持续出现故障。

我正在运行Visual Studio 2017,尽管这并不重要。最新的TFS服务器,我认为也是2017年。我有两个装有测试电源外壳代理,测试GUI代理和测试控制器的测试箱。其中之一确实很老而且很慢,除了遇到超时问题外,它还很不错。我要迁移到的较新版本正在运行Windows 10。

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

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

引发错误的相关代码为:

Mouse.Click(save_tab);

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

触发的错误是:

  

消息:自动化引擎无法回放测试,因为它   无法与桌面互动。如果   运行测试的计算机已锁定,或者其远程会话窗口处于   最小化。

     

StackTrace:位于   Microsoft.VisualStudio.TestTools.UITesting.UITestLogGenerator.ExceptionRecorder(Exception   异常,布尔值重新抛出)   Microsoft.VisualStudio.TestTools.UITesting.Playback.ThrowIfScreenLockedOrRemoteSessionMinimized()   在   Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception   例外,IPlaybackContext上下文)位于   Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception   异常,字符串actionName,UITestControl uiControl)位于   Microsoft.VisualStudio.TestTools.UITesting.UITestActionExecutorCore.Click(UITestControl   控件,鼠标按钮,ModifierKeys,modifierKeys,Point   relativeCoordinate)   Microsoft.VisualStudio.TestTools.UITesting.Mouse.ClickImplementation(UITestControl   控件,鼠标按钮,ModifierKeys,modifierKeys,Point   relativeCoordinate)   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   控件,鼠标按钮,ModifierKeys,modifierKeys,Point   relativeCoordinate)   Microsoft.VisualStudio.TestTools.UITesting.Mouse.Click(UITestControl   控制)

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

在我的尝试缓存的catch部分中,由于该错误,我尝试使用测试浏览器对象拍摄屏幕截图并得到以下错误:

  

消息:参数无效。

     

StackTrace:位于System.Drawing.Graphics.GetHdc()处   System.Drawing.Graphics.CopyFromScreen(Int32 sourceX,Int32 sourceY,   Int32 destinationX,Int32 destinationY,Size blockRegionSize,   CopyPixelOperation(copyPixelOperation)在   System.Drawing.Graphics.CopyFromScreen(Int32 sourceX,Int32 sourceY,   Int32 destinationX,Int32 destinationY,Size blockRegionSize)位于   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 doc,   字符串文件名)

然后我尝试使用以下截图:

UITestControl.Desktop.CaptureImage();

导致此错误:

  

消息:参数无效。

     

StackTrace:位于System.Drawing.Bitmap..ctor(Int32宽度,Int32高度,   PixelFormat格式)位于System.Drawing.Bitmap..ctor(Int32 width,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 doc,   字符串文件名)

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

在这个问题上,我确实还有其他线索。当连接到运行UltraVNC的测试盒时,我会定期收到一条消息,提示服务器已终止连接(测试盒),但此后始终会重新连接。我的旧测试箱没有这个问题。我曾尝试在这些UltraVNC连接故障之一期间对此较新的测试箱运行恒定的ping测试,但没有发现速度降低或数据包丢失。我们整个局域网的连接少于1ms。

有人知道发生了什么吗?

编辑:根据建议,我开始浏览事件日志。源= VSTTExecution出现了一个奇怪的事件。

  

(vstest.console.exe,PID 5356,线程9)   无法加载TestTypes {13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b}   因为由于以下原因而无法实例化TIP:   具有相同键的项目已经添加。

Source = VSTTController拥有此功能,但由于测试正在实际运行,因此不认为这是一个问题。我怀疑我安装的控制器和代理软件可能只是旧的,不再需要。

  

Controller服务无法连接到Test Management Server。   无法加载文件或程序集“ Microsoft.VisualStudio.Threading,   版本= 15.6.0.0,文化=中性,PublicKeyToken = b03f5f7f11d50a3a'或   它的依赖项之一。找到的程序集的清单定义   与程序集引用不匹配。 (来自HRESULT的异常:   0x80131040)

有一个,Source = VSTTAgentProcess:

  

(QTDCAgent32.exe,PID 10416,线程51)DataCollectionAgentProcess:   父进程已退出。家长退出代码:-1

编辑2:

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

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

  

错误级别2

     

消息:回放未能通过给定的搜索找到控件   属性。其他详细信息:TechnologyName:“ Web”控件类型:   'Document'TagName:'BODY'未能找到与   搜索条件ControlType ='Document'

     

StackTrace:位于   Microsoft.VisualStudio.TestTools.UITesting.Playback.MapControlNotFoundException(COMException   例如,IPlaybackContext上下文)   Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowComException(COMException   innerException,IPlaybackContext上下文)位于   Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception   例外,IPlaybackContext上下文)位于   Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(Exception   异常,字符串queryId)在   Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(String   queryId,Int32 maxDepth,Int32&timeLeft)位于   Microsoft.VisualStudio.TestTools.UITesting.SearchHelper.GetUITestControlRecursive(Boolean   useCache,布尔的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   函数,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   零件。

     

StackTrace:位于   Microsoft.VisualStudio.TestTools.UITest.Playback.Engine.IScreenElement.FindAllDescendants(字符串   bstrQueryId,Object&pvarResKeys,Int32 cResKeys,Int32 nMaxDepth)   Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindAllScreenElement(String   queryId,Int32深度,布尔型singleQueryId,布尔型throwException,   布尔值resetSkipStep)   Microsoft.VisualStudio.TestTools.UITest.Playback.ScreenElement.FindScreenElement(String   queryId,Int32深度,布尔值resetSkipStep)   Microsoft.VisualStudio.TestTools.UITesting.UITestControl.FindFirstDescendant(String   queryId,Int32 maxDepth,Int32&timeLeft)

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。

有问题的测试一直在触发这些错误,原因是正在下载文件。如果文件花费的时间太长,无法生成并无法下载,则测试会尝试继续并将其记录为失败。但是,由于它实际上尚未发生故障(花费了很长时间),因此浏览器仍然很忙,无法与CodedUI进行交互。

在下载过程中,浏览器未指示文件正在下载。看起来它可以用于屏幕截图,编码的ui正在将其检测为可用,DOM表示已准备就绪。而且我没有寻找页面更改,因为页面实际上没有更改。

测试的结构方式是,我位于网站的一页上,我动态构建了URL以下载文件,并尝试导航到该URL。这将导致以下两种情况之一:文件出错,站点将实际导航到该URL,或者将文件显示出来进行下载。

因此,我的解决方案最终是设置一个非常长的超时时间(10分钟),并不断循环检查该URL是否仍然相同,以及是否已提供要下载的文件。这使我什至可以等待下载时间更长的文件。浏览器完成下载请求后,它再次可用于CodedUI,并且我的测试得以继续。