diff --git a/samples/IntegrationTestApp/MainWindow.axaml b/samples/IntegrationTestApp/MainWindow.axaml
index 82348691e9..aa2191c26b 100644
--- a/samples/IntegrationTestApp/MainWindow.axaml
+++ b/samples/IntegrationTestApp/MainWindow.axaml
@@ -110,6 +110,8 @@
CenterOwner
+
+
diff --git a/samples/IntegrationTestApp/MainWindow.axaml.cs b/samples/IntegrationTestApp/MainWindow.axaml.cs
index 580548a433..1aba10ec30 100644
--- a/samples/IntegrationTestApp/MainWindow.axaml.cs
+++ b/samples/IntegrationTestApp/MainWindow.axaml.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
+using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Avalonia.VisualTree;
@@ -82,6 +83,16 @@ namespace IntegrationTestApp
}
}
+ private void SendToBack()
+ {
+ var lifetime = (ClassicDesktopStyleApplicationLifetime)Application.Current!.ApplicationLifetime!;
+
+ foreach (var window in lifetime.Windows)
+ {
+ window.Activate();
+ }
+ }
+
private void MenuClicked(object? sender, RoutedEventArgs e)
{
var clickedMenuItemTextBlock = this.FindControl("ClickedMenuItem");
@@ -102,6 +113,10 @@ namespace IntegrationTestApp
this.FindControl("ClickedMenuItem").Text = "None";
if (source?.Name == "ShowWindow")
ShowWindow();
+ if (source?.Name == "SendToBack")
+ SendToBack();
+ if (source?.Name == "ExitFullscreen")
+ WindowState = WindowState.Normal;
}
}
}
diff --git a/samples/IntegrationTestApp/ShowWindowTest.axaml b/samples/IntegrationTestApp/ShowWindowTest.axaml
index 2525bfc866..a263d8ab46 100644
--- a/samples/IntegrationTestApp/ShowWindowTest.axaml
+++ b/samples/IntegrationTestApp/ShowWindowTest.axaml
@@ -4,8 +4,6 @@
Name="SecondaryWindow"
Title="Show Window Test">
-
-
diff --git a/samples/IntegrationTestApp/ShowWindowTest.axaml.cs b/samples/IntegrationTestApp/ShowWindowTest.axaml.cs
index 3f45f1c5ad..720f7b1c12 100644
--- a/samples/IntegrationTestApp/ShowWindowTest.axaml.cs
+++ b/samples/IntegrationTestApp/ShowWindowTest.axaml.cs
@@ -34,7 +34,5 @@ namespace IntegrationTestApp
ownerRect.Text = $"{owner.Position}, {owner.FrameSize}";
}
}
-
- private void CloseWindow_Click(object sender, RoutedEventArgs e) => Close();
}
}
diff --git a/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs b/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs
index 07fea24a93..16d37e4beb 100644
--- a/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs
+++ b/tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs
@@ -15,6 +15,19 @@ namespace Avalonia.IntegrationTests.Appium
public static IReadOnlyList GetChildren(this AppiumWebElement element) =>
element.FindElementsByXPath("*/*");
+ public static (AppiumWebElement close, AppiumWebElement minimize, AppiumWebElement maximize) GetChromeButtons(this AppiumWebElement window)
+ {
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+ {
+ var closeButton = window.FindElementByXPath("//XCUIElementTypeButton[1]");
+ var fullscreenButton = window.FindElementByXPath("//XCUIElementTypeButton[2]");
+ var minimizeButton = window.FindElementByXPath("//XCUIElementTypeButton[3]");
+ return (closeButton, minimizeButton, fullscreenButton);
+ }
+
+ throw new NotSupportedException("GetChromeButtons not supported on this platform.");
+ }
+
public static string GetComboBoxValue(this AppiumWebElement element)
{
return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ?
@@ -57,14 +70,15 @@ namespace Avalonia.IntegrationTests.Appium
public static IDisposable OpenWindowWithClick(this AppiumWebElement element)
{
var session = element.WrappedDriver;
- var oldHandle = session.CurrentWindowHandle;
- var oldHandles = session.WindowHandles.ToList();
- var oldChildWindows = session.FindElements(By.XPath("//Window"));
-
- element.Click();
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
+ var oldHandle = session.CurrentWindowHandle;
+ var oldHandles = session.WindowHandles.ToList();
+ var oldChildWindows = session.FindElements(By.XPath("//Window"));
+
+ element.Click();
+
var newHandle = session.WindowHandles.Except(oldHandles).SingleOrDefault();
if (newHandle is not null)
@@ -94,14 +108,22 @@ namespace Avalonia.IntegrationTests.Appium
}
else
{
- var newHandle = session.CurrentWindowHandle;
-
- Assert.NotEqual(oldHandle, newHandle);
+ var oldWindows = session.FindElements(By.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"));
+ var oldWindowTitles = oldWindows.ToDictionary(x => x.Text);
+
+ element.Click();
+ var newWindows = session.FindElements(By.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"));
+ var newWindowTitles = newWindows.ToDictionary(x => x.Text);
+ var newWindowTitle = Assert.Single(newWindowTitles.Keys.Except(oldWindowTitles.Keys));
+ var newWindow = (AppiumWebElement)newWindowTitles[newWindowTitle];
+
return Disposable.Create(() =>
{
- session.Close();
- session.SwitchTo().Window(oldHandle);
+ // TODO: We should be able to use Cmd+W here but Avalonia apps don't seem to have this shortcut
+ // set up by default.
+ var (close, _, _) = newWindow.GetChromeButtons();
+ close!.Click();
});
}
}
diff --git a/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs b/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs
index 38d0d5ba1c..e887a2afe8 100644
--- a/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs
+++ b/tests/Avalonia.IntegrationTests.Appium/WindowTests.cs
@@ -57,82 +57,56 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(SkipOnWindows = true)]
public void OSX_WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent()
{
- var mainWindowHandle = GetCurrentWindowHandleHack();
-
- var mainWindow =
- _session.FindElementByAccessibilityId("MainWindow");
+ var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
- try
+ using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
- using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
- {
- mainWindow.Click();
+ mainWindow.Click();
- var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
+ var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
- int mainWindowIndex = windows.GetWindowOrder("MainWindow");
- int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
+ int mainWindowIndex = windows.GetWindowOrder("MainWindow");
+ int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
- Assert.Equal(0, secondaryWindowIndex);
- Assert.Equal(1, mainWindowIndex);
- }
- }
- finally
- {
- SwitchToMainWindowHack(mainWindowHandle);
- _session.ResetApp();
+ Assert.Equal(0, secondaryWindowIndex);
+ Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(SkipOnWindows = true)]
public void OSX_WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_Clicking_Resize_Grip()
{
- var mainWindowHandle = GetCurrentWindowHandleHack();
-
- var mainWindow =
- _session.FindWindowOuter("MainWindow");
+ var mainWindow = _session.FindWindowOuter("MainWindow");
- try
+ using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
- using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
- {
- new Actions(_session)
- .MoveToElement(mainWindow, 100, 1)
- .ClickAndHold()
- .Perform();
+ new Actions(_session)
+ .MoveToElement(mainWindow, 100, 1)
+ .ClickAndHold()
+ .Perform();
- var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
+ var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
- int mainWindowIndex = windows.GetWindowOrder("MainWindow");
- int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
+ int mainWindowIndex = windows.GetWindowOrder("MainWindow");
+ int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
- new Actions(_session)
- .MoveToElement(mainWindow, 100, 1)
- .Release()
- .Perform();
+ new Actions(_session)
+ .MoveToElement(mainWindow, 100, 1)
+ .Release()
+ .Perform();
- Assert.Equal(0, secondaryWindowIndex);
- Assert.Equal(1, mainWindowIndex);
- }
- }
- finally
- {
- SwitchToMainWindowHack(mainWindowHandle);
- _session.ResetApp();
+ Assert.Equal(0, secondaryWindowIndex);
+ Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(SkipOnWindows = true)]
public void OSX_WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_In_Fullscreen()
{
- var mainWindowHandle = GetCurrentWindowHandleHack();
-
- var mainWindow =
- _session.FindWindowOuter("MainWindow");
-
+ var mainWindow = _session.FindWindowOuter("MainWindow");
var buttons = mainWindow.GetChromeButtons();
- buttons.zoomButton.Click();
+ buttons.maximize.Click();
Task.Delay(500).Wait();
@@ -151,70 +125,51 @@ namespace Avalonia.IntegrationTests.Appium
}
finally
{
- SwitchToMainWindowHack(mainWindowHandle);
- _session.ResetApp();
+ _session.FindElementByAccessibilityId("ExitFullscreen").Click();
}
}
[PlatformFact(SkipOnWindows = true)]
public void OSX_WindowOrder_Owned_Dialog_Stays_InFront_Of_Parent()
{
- var mainWindowHandle = GetCurrentWindowHandleHack();
-
- var mainWindow =
- _session.FindElementByAccessibilityId("MainWindow");
+ var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
- try
+ using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.CenterOwner))
{
- using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.CenterOwner))
- {
- mainWindow.Click();
+ mainWindow.Click();
- var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
+ var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
- int mainWindowIndex = windows.GetWindowOrder("MainWindow");
- int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
+ int mainWindowIndex = windows.GetWindowOrder("MainWindow");
+ int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
- Assert.Equal(0, secondaryWindowIndex);
- Assert.Equal(1, mainWindowIndex);
- }
- }
- finally
- {
- SwitchToMainWindowHack(mainWindowHandle);
- _session.ResetApp();
+ Assert.Equal(0, secondaryWindowIndex);
+ Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(SkipOnWindows = true)]
public void OSX_WindowOrder_NonOwned_Window_Does_Not_Stay_InFront_Of_Parent()
{
- var mainWindow =
- _session.FindElementByAccessibilityId("MainWindow");
+ var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
- try
+ using (OpenWindow(new PixelSize(1400, 100), ShowWindowMode.NonOwned, WindowStartupLocation.CenterOwner))
{
- using (OpenWindow(new PixelSize(1400, 100), ShowWindowMode.NonOwned, WindowStartupLocation.CenterOwner))
- {
- mainWindow.Click();
+ mainWindow.Click();
- var secondaryWindow =
- _session.FindElementByAccessibilityId("SecondaryWindow");
+ var secondaryWindow =
+ _session.FindElementByAccessibilityId("SecondaryWindow");
- var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
+ var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
- int mainWindowIndex = windows.GetWindowOrder("MainWindow");
- int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
+ int mainWindowIndex = windows.GetWindowOrder("MainWindow");
+ int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
- Assert.Equal(1, secondaryWindowIndex);
- Assert.Equal(0, mainWindowIndex);
+ Assert.Equal(1, secondaryWindowIndex);
+ Assert.Equal(0, mainWindowIndex);
- secondaryWindow.SendClick();
- }
- }
- finally
- {
- _session.ResetApp();
+ var sendToBack = _session.FindElementByAccessibilityId("SendToBack");
+ sendToBack.Click();
}
}
@@ -222,31 +177,22 @@ namespace Avalonia.IntegrationTests.Appium
public void OSX_Parent_Window_Has_Disabled_ChromeButtons_When_Modal_Dialog_Shown()
{
var mainWindowHandle = GetCurrentWindowHandleHack();
-
- try
- {
- var window = _session.FindWindowOuter("MainWindow");
+ var window = _session.FindWindowOuter("MainWindow");
- var (closeButton, zoomButton, miniturizeButton)
- = window.GetChromeButtons();
+ var (closeButton, zoomButton, miniturizeButton)
+ = window.GetChromeButtons();
- Assert.True(closeButton.Enabled);
- Assert.True(zoomButton.Enabled);
- Assert.True(miniturizeButton.Enabled);
+ Assert.True(closeButton.Enabled);
+ Assert.True(zoomButton.Enabled);
+ Assert.True(miniturizeButton.Enabled);
- using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
- {
- SwitchToNewWindowHack(oldWindowHandle: mainWindowHandle);
-
- Assert.False(closeButton.Enabled);
- Assert.False(zoomButton.Enabled);
- Assert.False(miniturizeButton.Enabled);
- }
- }
- finally
+ using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
- SwitchToMainWindowHack(mainWindowHandle);
- _session.ResetApp();
+ SwitchToNewWindowHack(oldWindowHandle: mainWindowHandle);
+
+ Assert.False(closeButton.Enabled);
+ Assert.False(zoomButton.Enabled);
+ Assert.False(miniturizeButton.Enabled);
}
}
@@ -255,26 +201,18 @@ namespace Avalonia.IntegrationTests.Appium
{
var mainWindowHandle = GetCurrentWindowHandleHack();
- try
+ using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
- using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
- {
- var secondaryWindow = _session.FindWindowOuter("SecondaryWindow");
+ var secondaryWindow = _session.FindWindowOuter("SecondaryWindow");
- var (closeButton, zoomButton, miniturizeButton)
- = secondaryWindow.GetChromeButtons();
-
- Assert.True(closeButton.Enabled);
- Assert.True(zoomButton.Enabled);
- Assert.False(miniturizeButton.Enabled);
+ var (closeButton, zoomButton, miniaturizeButton)
+ = secondaryWindow.GetChromeButtons();
- SwitchToNewWindowHack(oldWindowHandle: mainWindowHandle);
- }
- }
- finally
- {
- SwitchToMainWindowHack(mainWindowHandle);
- _session.ResetApp();
+ Assert.True(closeButton.Enabled);
+ Assert.True(zoomButton.Enabled);
+ Assert.False(miniaturizeButton.Enabled);
+
+ SwitchToNewWindowHack(oldWindowHandle: mainWindowHandle);
}
}
@@ -409,19 +347,5 @@ namespace Avalonia.IntegrationTests.Appium
return window;
}
-
- public static (AppiumWebElement? closeButton, AppiumWebElement? zoomButton, AppiumWebElement? miniturizeButton) GetChromeButtons (this AppiumWebElement outerWindow)
- {
- var closeButton =
- outerWindow.FindElementByXPath("XCUIElementTypeButton[1]");
-
- var zoomButton =
- outerWindow.FindElementByXPath("XCUIElementTypeButton[2]");
-
- var miniturizeButton =
- outerWindow.FindElementByXPath("XCUIElementTypeButton[3]");
-
- return (closeButton, zoomButton, miniturizeButton);
- }
}
}