public static void InvokeAndWait(this Button button, TimeSpan?timeout = null) { if (button == null) { Log.Error("Attempted to invoke a null button! Dumping context..."); DumpHelper.DumpFullContext(); throw new ArgumentNullException("button"); } using (var waiter = button.GetInvokedWaiter()) { button.Invoke(); if (timeout == null) { waiter.Wait(); } else { waiter.Wait(timeout.Value); } } Wait.ForIdle(); }
public static void ForIdle(bool findElementsIfNull = true) { TestEnvironment.LogVerbose("Wait.ForIdle: Begin"); try { // If any of these are null, then we haven't initialized our idle helpers yet. // We should just return - we'll do that soon after this. if (waitForIdleInvokerButton == null || idleStateEnteredCheckBox == null || errorReportingTextBox == null || logReportingTextBox == null) { return; } using (UIEventWaiter idleStateEnteredWaiter = idleStateEnteredCheckBox.GetToggledWaiter()) { TestEnvironment.LogSuperVerbose("Wait.ForIdle: After GetToggledWaiter"); using (var errorReportedWaiter = new ValueChangedEventWaiter(errorReportingTextBox)) { TestEnvironment.LogSuperVerbose("Wait.ForIdle: Before WaitForIdleInvoker.Invoke"); idleStateEnteredWaiter.AddFilter((WaiterEventArgs) => idleStateEnteredCheckBox.ToggleState == ToggleState.On); waitForIdleInvokerButton.Invoke(); TestEnvironment.LogSuperVerbose("Wait.ForIdle: After WaitForIdleInvoker.Invoke"); var waiter = CompositableWaiter.WaitAny(TimeSpan.FromSeconds(300), idleStateEnteredWaiter, errorReportedWaiter); if (waiter == errorReportedWaiter) { AutomationPropertyChangedEventArgs args = errorReportedWaiter.Arguments.EventArgs as AutomationPropertyChangedEventArgs; string errorMessage = args.NewValue as string; if (!IsRS2OrHigher() && errorMessage == "Animation complete wait took longer than idle timeout.") { Log.Warning("Timed out waiting for animation complete. Queueing application to close after this test."); TestEnvironment.ShouldRestartApplication = true; } else if (errorMessage.Length > 0) { Log.Error("Error while waiting for idle: {0}", errorMessage); DumpHelper.DumpFullContext(); throw new WaiterException(errorMessage); } } else { var value = logReportingTextBox.Value; if (!String.IsNullOrEmpty(value)) { TestEnvironment.LogSuperVerbose(value); logReportingTextBox.SetValue(""); } } } } } catch (ElementNotAvailableException) { if (!isRetrying && findElementsIfNull) { // If we got an element-not-available exception, we'll re-initialize our wait helper and try again. // If that doesn't work, then we'll just fail. ResetIdleHelper(); InitializeWaitHelper(); isRetrying = true; ForIdle(); } else { if (TestEnvironment.Application.Process == null) { Log.Error("Tried to wait for idle before starting the test app!"); } else if (TestEnvironment.Application.Process.HasExited) { Log.Error("Tried to wait for idle after the test app has closed!"); } throw; } } TestEnvironment.LogVerbose("Wait.ForIdle: End"); }