public static void ForAppDebugger() { Button waitForDebuggerInvokerButton = new Button(FindElement.ById("__WaitForDebuggerInvoker")); CheckBox debuggerAttachedCheckBox = new CheckBox(FindElement.ById("__DebuggerAttachedCheckBox")); using (UIEventWaiter debuggerAttachedWaiter = debuggerAttachedCheckBox.GetToggledWaiter()) { using (var processWaiter = new ProcessClosedWaiter(TestEnvironment.Application.Process)) { Log.Comment(string.Format("Waiting for a debugger to attach (processId = {0})...", TestEnvironment.Application.Process.Id)); waitForDebuggerInvokerButton.Invoke(); var waiter = CompositableWaiter.WaitAny(TimeSpan.FromSeconds(300), debuggerAttachedWaiter, processWaiter); if (waiter == processWaiter) { throw new WaiterException("Process exited while waiting for app debugger."); } } } }
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"); }