From 599af59b5bf7eacc1de7ea41dcd3abe5f1b8b9fd Mon Sep 17 00:00:00 2001 From: Shane Neuville Date: Mon, 6 May 2024 21:29:11 -0700 Subject: [PATCH] Fix UITests so it can recover from unresponsive app (#22240) --- .../Issues/Issue19786.xaml.cs | 2 + .../tests/UITests/Tests/Issues/Issue19786.cs | 17 ++++---- .../Actions/AppiumLifecycleActions.cs | 13 +++++- .../src/UITest.Appium/AppiumWindowsApp.cs | 4 ++ src/TestUtils/src/UITest.NUnit/UITestBase.cs | 40 +++++++++++-------- 5 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/Controls/samples/Controls.Sample.UITests/Issues/Issue19786.xaml.cs b/src/Controls/samples/Controls.Sample.UITests/Issues/Issue19786.xaml.cs index a6afed72ebc3..b7a710e9350e 100644 --- a/src/Controls/samples/Controls.Sample.UITests/Issues/Issue19786.xaml.cs +++ b/src/Controls/samples/Controls.Sample.UITests/Issues/Issue19786.xaml.cs @@ -55,7 +55,9 @@ public Issue19786() Position++; }); +#if !WINDOWS BindingContext = this; +#endif } } } \ No newline at end of file diff --git a/src/Controls/tests/UITests/Tests/Issues/Issue19786.cs b/src/Controls/tests/UITests/Tests/Issues/Issue19786.cs index f3e7ab150202..d0c0ec00f853 100644 --- a/src/Controls/tests/UITests/Tests/Issues/Issue19786.cs +++ b/src/Controls/tests/UITests/Tests/Issues/Issue19786.cs @@ -16,15 +16,16 @@ public Issue19786(TestDevice device) : base(device) [Category(UITestCategories.CarouselView)] public void RemovingItemsShouldNotCauseCrash() { + this.IgnoreIfPlatforms(new TestDevice[] { TestDevice.Windows }); _ = App.WaitForElement("addItemButton"); - App.Click("addItemButton"); - App.Click("addItemButton"); - App.Click("addItemButton"); - App.Click("goToNextItemButton"); - App.Click("goToNextItemButton"); - App.Click("removeLastItemButton"); - App.Click("removeLastItemButton"); - App.Click("removeLastItemButton"); + App.Tap("addItemButton"); + App.Tap("addItemButton"); + App.Tap("addItemButton"); + App.Tap("goToNextItemButton"); + App.Tap("goToNextItemButton"); + App.Tap("removeLastItemButton"); + App.Tap("removeLastItemButton"); + App.Tap("removeLastItemButton"); } } diff --git a/src/TestUtils/src/UITest.Appium/Actions/AppiumLifecycleActions.cs b/src/TestUtils/src/UITest.Appium/Actions/AppiumLifecycleActions.cs index 63e9698bac2c..c594dc5bd14f 100644 --- a/src/TestUtils/src/UITest.Appium/Actions/AppiumLifecycleActions.cs +++ b/src/TestUtils/src/UITest.Appium/Actions/AppiumLifecycleActions.cs @@ -120,8 +120,17 @@ CommandResponse CloseApp(IDictionary parameters) if (_app?.Driver is null) return CommandResponse.FailedEmptyResponse; - if (_app.AppState == ApplicationState.NotRunning) - return CommandResponse.SuccessEmptyResponse; + try + { + if (_app.AppState == ApplicationState.NotRunning) + return CommandResponse.SuccessEmptyResponse; + } + catch (Exception) + { + // Occasionally the app seems to get so locked up it can't + // even report back the appstate. In that case, we'll just + // try to trigger a reset. + } if (_app.GetTestDevice() == TestDevice.Mac) { diff --git a/src/TestUtils/src/UITest.Appium/AppiumWindowsApp.cs b/src/TestUtils/src/UITest.Appium/AppiumWindowsApp.cs index 0a7b53a06fc1..b72f4c10b4da 100644 --- a/src/TestUtils/src/UITest.Appium/AppiumWindowsApp.cs +++ b/src/TestUtils/src/UITest.Appium/AppiumWindowsApp.cs @@ -26,6 +26,10 @@ public override ApplicationState AppState { return ApplicationState.NotRunning; } + catch(Exception) + { + return ApplicationState.Unknown; + } } } diff --git a/src/TestUtils/src/UITest.NUnit/UITestBase.cs b/src/TestUtils/src/UITest.NUnit/UITestBase.cs index 02773797d69b..7ce75ae5d6a0 100644 --- a/src/TestUtils/src/UITest.NUnit/UITestBase.cs +++ b/src/TestUtils/src/UITest.NUnit/UITestBase.cs @@ -47,7 +47,7 @@ protected virtual void FixtureSetup() TestContext.Progress.WriteLine($">>>>> {DateTime.Now} {nameof(FixtureSetup)} for {name}"); } - protected virtual void FixtureTeardown() + protected virtual void FixtureOneTimeTearDown() { try { @@ -65,7 +65,7 @@ public void UITestBaseTearDown() { try { - if (App.AppState == ApplicationState.NotRunning) + if (App.AppState != ApplicationState.Running) { SaveDeviceDiagnosticInfo(); @@ -117,37 +117,45 @@ public void OneTimeTearDown() { SaveDeviceDiagnosticInfo(); - if (App.AppState != ApplicationState.NotRunning) + if (App.AppState == ApplicationState.Running) SaveUIDiagnosticInfo(); } - FixtureTeardown(); + FixtureOneTimeTearDown(); } void SaveDeviceDiagnosticInfo([CallerMemberName] string? note = null) { - var types = App.GetLogTypes().ToArray(); - TestContext.Progress.WriteLine($">>>>> {DateTime.Now} Log types: {string.Join(", ", types)}"); - - foreach (var logType in new[] { "logcat" }) + try { - if (!types.Contains(logType, StringComparer.InvariantCultureIgnoreCase)) - continue; + var types = App.GetLogTypes().ToArray(); + TestContext.Progress.WriteLine($">>>>> {DateTime.Now} Log types: {string.Join(", ", types)}"); - var logsPath = GetGeneratedFilePath($"AppLogs-{logType}.log", note); - if (logsPath is not null) + foreach (var logType in new[] { "logcat" }) { - var entries = App.GetLogEntries(logType); - File.WriteAllLines(logsPath, entries); + if (!types.Contains(logType, StringComparer.InvariantCultureIgnoreCase)) + continue; - AddTestAttachment(logsPath, Path.GetFileName(logsPath)); + var logsPath = GetGeneratedFilePath($"AppLogs-{logType}.log", note); + if (logsPath is not null) + { + var entries = App.GetLogEntries(logType); + File.WriteAllLines(logsPath, entries); + + AddTestAttachment(logsPath, Path.GetFileName(logsPath)); + } } } + catch (Exception e) + { + var name = TestContext.CurrentContext.Test.MethodName ?? TestContext.CurrentContext.Test.Name; + TestContext.Error.WriteLine($">>>>> {DateTime.Now} The SaveDeviceDiagnosticInfo threw an exception during {name}.{Environment.NewLine}Exception details: {e}"); + } } protected bool SaveUIDiagnosticInfo([CallerMemberName] string? note = null) { - if (App.AppState == ApplicationState.NotRunning) + if (App.AppState != ApplicationState.Running) return false; var screenshotPath = GetGeneratedFilePath("ScreenShot.png", note);