我已经从这根头发上拉了两天了。
我有了一个新的且速度更快的测试箱,并且每次在代码中的相同位置以及测试周期中非常相似的位置,它都开始持续出现故障。
我正在运行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)
答案 0 :(得分:0)
我终于解决了这个问题。
有问题的测试一直在触发这些错误,原因是正在下载文件。如果文件花费的时间太长,无法生成并无法下载,则测试会尝试继续并将其记录为失败。但是,由于它实际上尚未发生故障(花费了很长时间),因此浏览器仍然很忙,无法与CodedUI进行交互。
在下载过程中,浏览器未指示文件正在下载。看起来它可以用于屏幕截图,编码的ui正在将其检测为可用,DOM表示已准备就绪。而且我没有寻找页面更改,因为页面实际上没有更改。
测试的结构方式是,我位于网站的一页上,我动态构建了URL以下载文件,并尝试导航到该URL。这将导致以下两种情况之一:文件出错,站点将实际导航到该URL,或者将文件显示出来进行下载。
因此,我的解决方案最终是设置一个非常长的超时时间(10分钟),并不断循环检查该URL是否仍然相同,以及是否已提供要下载的文件。这使我什至可以等待下载时间更长的文件。浏览器完成下载请求后,它再次可用于CodedUI,并且我的测试得以继续。