public void FixtureDelayedClosingCmdTest() { _fixture.NoAutomaticSwitchToStartedApplication(); UiAutomationFixture.TimeoutSeconds = 2; // Another way of starting via cmd /c should work as well. Also letting it wait a second. Assert.IsTrue(_fixture.StartApplicationWithArguments(@"cmd.exe", "/c \"test.cmd wait 1\""), @"delayed closing Cmd"); var processId = _fixture.ApplicationProcessId; Assert.IsNotNull(processId); Assert.IsTrue(_fixture.ApplicationIsActive); Assert.IsTrue(UiAutomationFixture.WaitUntilProcessEnds("ProcessId:" + processId.Value)); }
public void AppLauncherUwpAppTest() { var fixture = new UiAutomationFixture(); UiAutomationFixture.TimeoutSeconds = 2; Assert.IsTrue( fixture.StartApplicationWithArguments(@"windows.immersivecontrolpanel_cw5n1h2txyewy", null)); Assert.IsTrue(fixture.IsUwpApp(), "Is UWP App"); // Switch to parent as that contains the close button. Elements on child windows are found too. // UWP apps have a container called Application Frame Host. // So they are not direct children of the desktop, unlike "normal" applications. // That means that you need to use "descendants" rather than "children" in findfirst, // which is slow especially if a control is not found // TODO: You need to be very careful here. Sometimes the wrong close button gets pushed. // e.g. once I had an existing Calculator instance running, and the process closed // Edge instead of the new calculator window. Still need to find out how to prevent that. // For now the workaround is ensuring that there are no other instances of your app running. Assert.IsTrue(fixture.SwitchToParentWindow(), "Switch to parent."); Assert.IsTrue(fixture.ClickControl("ControlType:ListItem && name:System")); Assert.IsTrue(fixture.WaitForControl("id:PagesListView")); Assert.IsTrue(fixture.WaitForControlAndClick("Name:About")); // This is needed. If you don't do it, the process gets into a locked state. Assert.IsTrue(fixture.WaitForControl("ControlType:Text && name:About"), "Wait for About text"); // The About title comes earlier than the rest of the page, so wait for the control we want to examine Assert.IsTrue(fixture.WaitForControl("id:SystemSettings_PCSystem_VersionString_ValueTextBlock")); var version = fixture.ValueOfControl("id:SystemSettings_PCSystem_VersionString_ValueTextBlock"); Debug.Print("Version from settings: " + version); Assert.IsTrue(int.TryParse(version, out _), "Version is numerical"); Assert.IsTrue(fixture.ClickControl("name:Close Settings"), "Press Close Settings"); }
public void FixtureIsUwpTest() { var fixture = new UiAutomationFixture(); fixture.StartApplication("notepad"); Assert.IsNotNull(fixture.ApplicationProcessId); var process = Process.GetProcessById(fixture.ApplicationProcessId.Value); Assert.IsFalse(AppLauncher.IsUwpApp(process.Handle), "Notepad is not UWP"); Assert.IsTrue(fixture.CloseApplication(), "Close notepad"); fixture.StartApplicationWithArguments(@"windows.immersivecontrolpanel_cw5n1h2txyewy", null); Assert.IsNotNull(fixture.ApplicationProcessId); var pid = fixture.ApplicationProcessId.Value; process = Process.GetProcessById(pid); Assert.IsTrue(AppLauncher.IsUwpApp(process.Handle), "App is UWP"); Assert.AreEqual(IntPtr.Zero, process.MainWindowHandle, "Main window handle for Uwp window is 0"); Assert.IsTrue(fixture.SwitchToParentWindow(), "Switch to parent"); Assert.AreNotEqual(pid, fixture.ApplicationProcessId, @"Pids are not equal"); Assert.IsTrue(AppLauncher.IsUwpApp(process.Handle), "Parent is UWP"); Assert.IsNotNull(fixture.ApplicationProcessId); process = Process.GetProcessById(fixture.ApplicationProcessId.Value); Assert.AreNotEqual(IntPtr.Zero, process.MainWindowHandle, "Main window handle for Uwp parent window is not 0"); Assert.IsTrue(fixture.SwitchToProcess("ProcessId:" + pid), "Switch to child"); Assert.IsTrue(fixture.CloseApplication(), "Close UWP app"); }
public void FixtureRunWord() { // Word doesn't always start a new process, but will re-use an existing process if that was already running. // That's why we don't use the automatic switch to the process, but switch by its process name separately var fixture = new UiAutomationFixture(); UiAutomationFixture.SearchBy("Name"); fixture.NoAutomaticSwitchToStartedApplication(); UiAutomationFixture.TimeoutSeconds = 10; Assert.IsTrue(fixture.StartApplicationWithArguments(WordPath, "/w /q"), "Started Word"); UiAutomationFixture.WaitSeconds(3); // todo: this fails when Word is already active when the test runs. Make more resilient Assert.IsTrue(fixture.SwitchToProcess(@"name:winword"), "Switched to Word"); fixture.PressKey(@"The Quick Brown Fox Jumps Over the Lazy Dog+{HOME}"); Assert.IsTrue(fixture.ClickControl("ControlType:Button && Name:Bold"), "Click Bold"); Assert.IsTrue(fixture.ControlExists("Name:Heading 1"), "Heading 1 found"); Assert.IsTrue(fixture.ClickControl("Heading 1"), "Click Heading 1"); Assert.IsTrue(fixture.ClickControl("ControlType:Button && Name:Underline"), "Click Underline"); Assert.IsFalse(fixture.CloseApplication(), "Close application doesn't work due to dialog"); // This is a tricky one, as it is a control on a modal dialog. // It works because click has a fallback to simulate a mouseclick in the center of the control's bounding rectangle Assert.IsTrue(fixture.ClickControl("Name:Don't Save"), "click Don't Save"); // Normally exiting Word can take a very long time. 10 seconds is typically not enough UiAutomationFixture.TimeoutSeconds = 30; Assert.IsTrue(UiAutomationFixture.WaitUntilProcessEnds(@"winword"), "WinWord process ends"); UiAutomationFixture.TimeoutSeconds = 3; fixture.SetAutomaticSwitchToStartedApplication(); }