Browse Source

Add failing test for #8878.

And update the tests to use the value of `NSWindow.orderedIndex` exposed in 0cc0443d34 instead of relying on appium to give us a z-ordered list of windows.
pull/8880/head
Steven Kirk 4 years ago
parent
commit
1c4a994e2c
  1. 89
      tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs

89
tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs

@ -30,7 +30,7 @@ namespace Avalonia.IntegrationTests.Appium
tab.Click(); tab.Click();
return; return;
} }
catch (WebDriverException e) when (retry++ < 3) catch (WebDriverException) when (retry++ < 3)
{ {
// MacOS sometimes seems to need a bit of time to get itself back in order after switching out // MacOS sometimes seems to need a bit of time to get itself back in order after switching out
// of fullscreen. // of fullscreen.
@ -49,19 +49,16 @@ namespace Avalonia.IntegrationTests.Appium
{ {
mainWindow.Click(); mainWindow.Click();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); var secondaryWindowIndex = GetWindowOrder("SecondaryWindow");
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex); Assert.Equal(1, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
} }
} }
[PlatformFact(TestPlatforms.MacOS)] [PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_Clicking_Resize_Grip() public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_Clicking_Resize_Grip()
{ {
var mainWindow = FindWindow(_session, "MainWindow"); var mainWindow = GetWindow("MainWindow");
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.Manual)) using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.Manual))
{ {
@ -70,24 +67,21 @@ namespace Avalonia.IntegrationTests.Appium
.ClickAndHold() .ClickAndHold()
.Perform(); .Perform();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); var secondaryWindowIndex = GetWindowOrder("SecondaryWindow");
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
new Actions(_session) new Actions(_session)
.MoveToElement(mainWindow, 100, 1) .MoveToElement(mainWindow, 100, 1)
.Release() .Release()
.Perform(); .Perform();
Assert.Equal(0, secondaryWindowIndex); Assert.Equal(1, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
} }
} }
[PlatformFact(TestPlatforms.MacOS)] [PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_In_Fullscreen() public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_In_Fullscreen()
{ {
var mainWindow = FindWindow(_session, "MainWindow"); var mainWindow = GetWindow("MainWindow");
var buttons = mainWindow.GetChromeButtons(); var buttons = mainWindow.GetChromeButtons();
buttons.maximize.Click(); buttons.maximize.Click();
@ -98,14 +92,8 @@ namespace Avalonia.IntegrationTests.Appium
{ {
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.Manual)) using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.Manual))
{ {
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); var secondaryWindowIndex = GetWindowOrder("SecondaryWindow");
var mainWindowIndex = GetWindowOrder(windows, "MainWindow"); Assert.Equal(1, secondaryWindowIndex);
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
Thread.Sleep(5000);
} }
} }
finally finally
@ -122,13 +110,8 @@ namespace Avalonia.IntegrationTests.Appium
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.Manual)) using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.Manual))
{ {
mainWindow.Click(); mainWindow.Click();
var secondaryWindowIndex = GetWindowOrder("SecondaryWindow");
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); Assert.Equal(1, secondaryWindowIndex);
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
} }
} }
@ -141,22 +124,35 @@ namespace Avalonia.IntegrationTests.Appium
{ {
mainWindow.Click(); mainWindow.Click();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow")); var secondaryWindowIndex = GetWindowOrder("SecondaryWindow");
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
Assert.Equal(1, secondaryWindowIndex); Assert.Equal(2, secondaryWindowIndex);
Assert.Equal(0, mainWindowIndex);
var sendToBack = _session.FindElementByAccessibilityId("SendToBack"); var sendToBack = _session.FindElementByAccessibilityId("SendToBack");
sendToBack.Click(); sendToBack.Click();
} }
} }
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Owned_Is_Correct_After_Closing_Window()
{
using (OpenWindow(new PixelSize(300, 500), ShowWindowMode.Owned, WindowStartupLocation.CenterOwner))
{
// Open a second child window, and close it.
using (OpenWindow(new PixelSize(200, 200), ShowWindowMode.Owned, WindowStartupLocation.CenterOwner))
{
}
var secondaryWindowIndex = GetWindowOrder("SecondaryWindow");
Assert.Equal(1, secondaryWindowIndex);
}
}
[PlatformFact(TestPlatforms.MacOS)] [PlatformFact(TestPlatforms.MacOS)]
public void Parent_Window_Has_Disabled_ChromeButtons_When_Modal_Dialog_Shown() public void Parent_Window_Has_Disabled_ChromeButtons_When_Modal_Dialog_Shown()
{ {
var window = FindWindow(_session, "MainWindow"); var window = GetWindow("MainWindow");
var (closeButton, miniaturizeButton, zoomButton) = window.GetChromeButtons(); var (closeButton, miniaturizeButton, zoomButton) = window.GetChromeButtons();
Assert.True(closeButton.Enabled); Assert.True(closeButton.Enabled);
@ -176,7 +172,7 @@ namespace Avalonia.IntegrationTests.Appium
{ {
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner)) using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{ {
var secondaryWindow = FindWindow(_session, "SecondaryWindow"); var secondaryWindow = GetWindow("SecondaryWindow");
var (closeButton, miniaturizeButton, zoomButton) = secondaryWindow.GetChromeButtons(); var (closeButton, miniaturizeButton, zoomButton) = secondaryWindow.GetChromeButtons();
Assert.True(closeButton.Enabled); Assert.True(closeButton.Enabled);
@ -192,7 +188,7 @@ namespace Avalonia.IntegrationTests.Appium
{ {
using (OpenWindow(new PixelSize(200, 100), mode, WindowStartupLocation.Manual)) using (OpenWindow(new PixelSize(200, 100), mode, WindowStartupLocation.Manual))
{ {
var secondaryWindow = FindWindow(_session, "SecondaryWindow"); var secondaryWindow = GetWindow("SecondaryWindow");
var (_, miniaturizeButton, _) = secondaryWindow.GetChromeButtons(); var (_, miniaturizeButton, _) = secondaryWindow.GetChromeButtons();
miniaturizeButton.Click(); miniaturizeButton.Click();
@ -220,7 +216,7 @@ namespace Avalonia.IntegrationTests.Appium
// causes Appium to think it's a different window. // causes Appium to think it's a different window.
OpenWindow(null, ShowWindowMode.Owned, WindowStartupLocation.Manual); OpenWindow(null, ShowWindowMode.Owned, WindowStartupLocation.Manual);
var secondaryWindow = FindWindow(_session, "SecondaryWindow"); var secondaryWindow = GetWindow("SecondaryWindow");
var hideButton = secondaryWindow.FindElementByAccessibilityId("HideButton"); var hideButton = secondaryWindow.FindElementByAccessibilityId("HideButton");
hideButton.Click(); hideButton.Click();
@ -236,7 +232,7 @@ namespace Avalonia.IntegrationTests.Appium
_session.FindElementByAccessibilityId("RestoreAll").Click(); _session.FindElementByAccessibilityId("RestoreAll").Click();
// Close the window manually. // Close the window manually.
secondaryWindow = FindWindow(_session, "SecondaryWindow"); secondaryWindow = GetWindow("SecondaryWindow");
secondaryWindow.GetChromeButtons().close.Click(); secondaryWindow.GetChromeButtons().close.Click();
} }
@ -259,18 +255,19 @@ namespace Avalonia.IntegrationTests.Appium
return showButton.OpenWindowWithClick(); return showButton.OpenWindowWithClick();
} }
private static int GetWindowOrder(IReadOnlyCollection<AppiumWebElement> elements, string identifier) private AppiumWebElement GetWindow(string identifier)
{ {
return elements.TakeWhile(x => // The Avalonia a11y tree currently exposes two nested Window elements, this is a bug and should be fixed
x.FindElementByXPath("XCUIElementTypeWindow")?.GetAttribute("identifier") != identifier).Count(); // but in the meantime use the `parent::' selector to return the parent "real" window.
return _session.FindElementByXPath(
$"XCUIElementTypeWindow//*[@identifier='{identifier}']/parent::XCUIElementTypeWindow");
} }
private static AppiumWebElement FindWindow(AppiumDriver<AppiumWebElement> session, string identifier) private int GetWindowOrder(string identifier)
{ {
var windows = session.FindElementsByXPath("XCUIElementTypeWindow"); var window = GetWindow(identifier);
return windows.First(x => var order = window.FindElementByXPath("//*[@identifier='Order']");
x.FindElementsByXPath("XCUIElementTypeWindow") return int.Parse(order.Text);
.Any(y => y.GetAttribute("identifier") == identifier));
} }
public enum ShowWindowMode public enum ShowWindowMode

Loading…
Cancel
Save