WPF编码的UI测试随机失败,出现奇怪的ArgumentException

时间:2019-02-27 18:08:38

标签: c# wpf exception coded-ui-tests base-class-library

我已经在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的属性(例如ExistsCheckedSelected的代码都将其抛出。例如:

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在测试结果屏幕截图上的突出显示方式:

How screenshot looks like

绿色窄线和蓝色窄线到拐角处的距离相等,因此对我来说,它看起来像是在单个主显示中使用了应用程序窗口的偏移量,但是随后尝试通过将偏移量应用于所有显示。 可能是引起错误的原因(例如超出显示范围)还是仅仅是另一回事?

1 个答案:

答案 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