Browse Source

Move mac-specific tests to a separate file.

And tidy stuff up a bit.
pull/8232/head
Steven Kirk 4 years ago
parent
commit
4f4f291b2d
  1. 226
      tests/Avalonia.IntegrationTests.Appium/WindowTests.cs
  2. 210
      tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs

226
tests/Avalonia.IntegrationTests.Appium/WindowTests.cs

@ -1,13 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using Avalonia.Controls;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Interactions;
using Xunit;
using Xunit.Sdk;
@ -53,168 +47,6 @@ namespace Avalonia.IntegrationTests.Appium
}
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void OSX_WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
mainWindow.Click();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
int mainWindowIndex = windows.GetWindowOrder("MainWindow");
int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void OSX_WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_Clicking_Resize_Grip()
{
var mainWindow = _session.FindWindowOuter("MainWindow");
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
new Actions(_session)
.MoveToElement(mainWindow, 100, 1)
.ClickAndHold()
.Perform();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
int mainWindowIndex = windows.GetWindowOrder("MainWindow");
int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
new Actions(_session)
.MoveToElement(mainWindow, 100, 1)
.Release()
.Perform();
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void OSX_WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_In_Fullscreen()
{
var mainWindow = _session.FindWindowOuter("MainWindow");
var buttons = mainWindow.GetChromeButtons();
buttons.maximize.Click();
Task.Delay(500).Wait();
try
{
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
int mainWindowIndex = windows.GetWindowOrder("MainWindow");
int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
}
}
finally
{
_session.FindElementByAccessibilityId("ExitFullscreen").Click();
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void OSX_WindowOrder_Owned_Dialog_Stays_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.CenterOwner))
{
mainWindow.Click();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
int mainWindowIndex = windows.GetWindowOrder("MainWindow");
int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void OSX_WindowOrder_NonOwned_Window_Does_Not_Stay_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
using (OpenWindow(new PixelSize(1400, 100), ShowWindowMode.NonOwned, WindowStartupLocation.CenterOwner))
{
mainWindow.Click();
var secondaryWindow =
_session.FindElementByAccessibilityId("SecondaryWindow");
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
int mainWindowIndex = windows.GetWindowOrder("MainWindow");
int secondaryWindowIndex = windows.GetWindowOrder("SecondaryWindow");
Assert.Equal(1, secondaryWindowIndex);
Assert.Equal(0, mainWindowIndex);
var sendToBack = _session.FindElementByAccessibilityId("SendToBack");
sendToBack.Click();
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void OSX_Parent_Window_Has_Disabled_ChromeButtons_When_Modal_Dialog_Shown()
{
var mainWindowHandle = GetCurrentWindowHandleHack();
var window = _session.FindWindowOuter("MainWindow");
var (closeButton, zoomButton, miniturizeButton)
= window.GetChromeButtons();
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);
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void OSX_Minimize_Button_Disabled_Modal_Dialog()
{
var mainWindowHandle = GetCurrentWindowHandleHack();
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
var secondaryWindow = _session.FindWindowOuter("SecondaryWindow");
var (closeButton, zoomButton, miniaturizeButton)
= secondaryWindow.GetChromeButtons();
Assert.True(closeButton.Enabled);
Assert.True(zoomButton.Enabled);
Assert.False(miniaturizeButton.Enabled);
SwitchToNewWindowHack(oldWindowHandle: mainWindowHandle);
}
}
public static TheoryData<PixelSize?, ShowWindowMode, WindowStartupLocation> StartupLocationData()
{
@ -238,39 +70,6 @@ namespace Avalonia.IntegrationTests.Appium
return data;
}
private string? GetCurrentWindowHandleHack()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// HACK: WinAppDriver only seems to switch to a newly opened window if the window has an owner,
// otherwise the session remains targeting the previous window. Return the handle for the
// current window so we know which window to switch to when another is opened.
return _session.WindowHandles.Single();
}
return null;
}
private void SwitchToNewWindowHack(string? oldWindowHandle)
{
if (oldWindowHandle is not null)
{
var newWindowHandle = _session.WindowHandles.FirstOrDefault(x => x != oldWindowHandle);
// HACK: Looks like WinAppDriver only adds window handles for non-owned windows, but luckily
// non-owned windows is where we're having the problem, so if we find a window handle that
// isn't the main window handle then switch to it.
if (newWindowHandle is not null)
_session.SwitchTo().Window(newWindowHandle);
}
}
private void SwitchToMainWindowHack(string? mainWindowHandle)
{
if (mainWindowHandle is not null)
_session.SwitchTo().Window(mainWindowHandle);
}
private static void AssertCloseEnough(PixelPoint expected, PixelPoint actual)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@ -299,7 +98,6 @@ namespace Avalonia.IntegrationTests.Appium
private IDisposable OpenWindow(PixelSize? size, ShowWindowMode mode, WindowStartupLocation location)
{
var mainWindow = GetCurrentWindowHandleHack();
var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize");
var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode");
var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation");
@ -324,28 +122,4 @@ namespace Avalonia.IntegrationTests.Appium
Modal
}
}
static class Extensions
{
public static int GetWindowOrder(this IReadOnlyCollection<AppiumWebElement> elements, string identifier)
{
return elements.TakeWhile(x =>
x.FindElementByXPath("XCUIElementTypeWindow")?.GetAttribute("identifier") != identifier).Count();
}
public static AppiumWebElement? FindWindowInner(this AppiumDriver<AppiumWebElement> session, string identifier)
{
return session.FindElementsByXPath("XCUIElementTypeWindow")
.FirstOrDefault(x => x.GetAttribute("identifier") == identifier);
}
public static AppiumWebElement? FindWindowOuter(this AppiumDriver<AppiumWebElement> session, string identifier)
{
var windows = session.FindElementsByXPath("XCUIElementTypeWindow");
var window = windows.FirstOrDefault(x=>x.FindElementsByXPath("XCUIElementTypeWindow").Any(x => x.GetAttribute("identifier") == identifier));
return window;
}
}
}

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

@ -0,0 +1,210 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Avalonia.Controls;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Interactions;
using Xunit;
namespace Avalonia.IntegrationTests.Appium
{
[Collection("Default")]
public class WindowTests_MacOS
{
private readonly AppiumDriver<AppiumWebElement> _session;
public WindowTests_MacOS(TestAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Window");
tab.Click();
}
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
mainWindow.Click();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_Clicking_Resize_Grip()
{
var mainWindow = FindWindow(_session, "MainWindow");
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
new Actions(_session)
.MoveToElement(mainWindow, 100, 1)
.ClickAndHold()
.Perform();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
new Actions(_session)
.MoveToElement(mainWindow, 100, 1)
.Release()
.Perform();
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_In_Fullscreen()
{
var mainWindow = FindWindow(_session, "MainWindow");
var buttons = mainWindow.GetChromeButtons();
buttons.maximize.Click();
Thread.Sleep(500);
try
{
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
}
}
finally
{
_session.FindElementByAccessibilityId("ExitFullscreen").Click();
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Owned_Dialog_Stays_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.CenterOwner))
{
mainWindow.Click();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
Assert.Equal(0, secondaryWindowIndex);
Assert.Equal(1, mainWindowIndex);
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_NonOwned_Window_Does_Not_Stay_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
using (OpenWindow(new PixelSize(1400, 100), ShowWindowMode.NonOwned, WindowStartupLocation.CenterOwner))
{
mainWindow.Click();
var windows = _session.FindElements(By.XPath("XCUIElementTypeWindow"));
var mainWindowIndex = GetWindowOrder(windows, "MainWindow");
var secondaryWindowIndex = GetWindowOrder(windows, "SecondaryWindow");
Assert.Equal(1, secondaryWindowIndex);
Assert.Equal(0, mainWindowIndex);
var sendToBack = _session.FindElementByAccessibilityId("SendToBack");
sendToBack.Click();
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void Parent_Window_Has_Disabled_ChromeButtons_When_Modal_Dialog_Shown()
{
var window = FindWindow(_session, "MainWindow");
var (closeButton, miniaturizeButton, zoomButton) = window.GetChromeButtons();
Assert.True(closeButton.Enabled);
Assert.True(zoomButton.Enabled);
Assert.True(miniaturizeButton.Enabled);
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
Assert.False(closeButton.Enabled);
Assert.False(zoomButton.Enabled);
Assert.False(miniaturizeButton.Enabled);
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void Minimize_Button_Is_Disabled_On_Modal_Dialog()
{
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.CenterOwner))
{
var secondaryWindow = FindWindow(_session, "SecondaryWindow");
var (closeButton, miniaturizeButton, zoomButton) = secondaryWindow.GetChromeButtons();
Assert.True(closeButton.Enabled);
Assert.True(zoomButton.Enabled);
Assert.False(miniaturizeButton.Enabled);
}
}
private IDisposable OpenWindow(PixelSize? size, ShowWindowMode mode, WindowStartupLocation location)
{
var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize");
var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode");
var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation");
var showButton = _session.FindElementByAccessibilityId("ShowWindow");
if (size.HasValue)
sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}");
modeComboBox.Click();
_session.FindElementByName(mode.ToString()).SendClick();
locationComboBox.Click();
_session.FindElementByName(location.ToString()).SendClick();
return showButton.OpenWindowWithClick();
}
private static int GetWindowOrder(IReadOnlyCollection<AppiumWebElement> elements, string identifier)
{
return elements.TakeWhile(x =>
x.FindElementByXPath("XCUIElementTypeWindow")?.GetAttribute("identifier") != identifier).Count();
}
private static AppiumWebElement FindWindow(AppiumDriver<AppiumWebElement> session, string identifier)
{
var windows = session.FindElementsByXPath("XCUIElementTypeWindow");
return windows.First(x =>
x.FindElementsByXPath("XCUIElementTypeWindow")
.Any(y => y.GetAttribute("identifier") == identifier));
}
public enum ShowWindowMode
{
NonOwned,
Owned,
Modal
}
}
}
Loading…
Cancel
Save