我已经在WPF应用程序中对UI测试进行了编码,但有时会因以下异常而失败:
消息:测试方法MyMethodNameGoesHere引发了异常: System.ArgumentException:参数无效。
和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.LoggerUtility.GetDesktopImage()
at Microsoft.VisualStudio.TestTools.UITesting.LoggerUtility.CaptureScreenShotAndDrawBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 borderWidth, Boolean isActualControlBounds)
at Microsoft.VisualStudio.TestTools.UITest.Extension.LoggerUtilities.CaptureScreenShotAndDrawBounds(Rectangle bounds, Int32 borderWidth, Boolean isActualControlBounds)
at Microsoft.VisualStudio.TestTools.UITesting.Playback.CaptureScreenShot(UITestControl control)
at Microsoft.VisualStudio.TestTools.UITesting.Playback.GetUITestControlString(UITestControl control)
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.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.<Find>b__175_0()
at Microsoft.VisualStudio.TestTools.UITesting.CodedUITestMethodInvoker.InvokeMethod[T](Func`1 function, UITestControl control, Boolean firePlaybackErrorEvent, Boolean logAsAction)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.Find()
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyPrivate(String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyOfType[T](String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.get_Exists()
at MyProjectNamespace.UITests.TestButtonExists() in E:\...\UITests.cs:line 177
任何试图访问UITestControl
的属性(例如Exists
,Checked
或Selected
的代码都将其抛出。例如:
WpfButton button = UIControlBuilder<WpfButton>.Builder()
.Parent(MainPane)
.AutomationID(MyButtonId)
.Build();
// ...
Assert.IsTrue(button.Exists);
有趣的是,此问题是随机发生的,但有一定规律。如果我一个接一个地运行测试,那么它们会很好地工作。如果我连续运行许多测试,则一段时间后一个测试将失败,然后所有后续测试也将失败。我以为这可能是与内存相关的问题(内存泄漏或内存不足),但是我确实有很多可用的内存,进程似乎并没有消耗太多内存。
在我的调查UI测试框架中,我们在FindFirstDescendant
中捕获了一个异常,并尝试捕获一个屏幕快照以报告此异常,但也未能做到这一点:
// decompiled UI test framework's UITestControl.cs code
internal UITestControl FindFirstDescendant(string queryId, int maxDepth, ref int timeLeft)
{
// ...
try
{
element = this.ScreenElement.FindScreenElement(queryId, maxDepth);
}
catch (Exception ex) // catches exception here
{
// but this method does also throw exception, because of a bug:
Microsoft.VisualStudio.TestTools.UITesting.Playback.MapAndThrowException(ex, queryId);
throw;
}
}
更有趣的是,这是一个非常通用的错误,它发生在.NET的Bitmap
的构造函数中(无效的width或height参数?)。
由于这个Bitmap
问题,我无法获得原始异常,因此我无法理解会发生什么。 Playback.CaptureScreenShot
标记有编译器警告抑制属性,该属性明确指定此方法不应引发任何异常。
这是UI测试框架中的错误吗?
另一个有趣的发现。它在我的测试目录中创建了屏幕截图,但是该应用程序的窗口在屏幕截图上未正确突出显示。这就是它的样子。红色是我的显示设置,蓝色是主窗口的实际位置,绿色是WPF在测试结果屏幕截图上的突出显示方式:
绿色窄线和蓝色窄线到拐角处的距离相等,因此对我来说,它看起来像是在单个主显示中使用了应用程序窗口的偏移量,但是随后尝试通过将偏移量应用于所有显示。 可能是引起错误的原因(例如超出显示范围)还是仅仅是另一回事?
答案 0 :(得分:0)
由于它看起来像个错误,所以我问the same question on DeveloperCommunity。
似乎不支持多屏幕:
感谢您对此问题进行调查。看起来您正在多屏幕上运行已编码的ui测试。这实际上是不受支持的方案。
已编码的UI测试也在弃用路径中。选中https://docs.microsoft.com/en-us/visualstudio/test/use-ui-automation-to-test-your-code?view=vs-2017
视情况而定,建议使用WinAppDriver迁移到Selenium或Appium