Browse Source

Refactor OSX window tests a bit.

Try not to rely on `_session.ResetApp();` because restoring the application state in the tests tends to show up more errors (which this change has done: https://github.com/AvaloniaUI/Avalonia/issues/8335#issuecomment-1162804733)
pull/8232/head
Steven Kirk 4 years ago
parent
commit
8c3424baa4
  1. 2
      samples/IntegrationTestApp/MainWindow.axaml
  2. 15
      samples/IntegrationTestApp/MainWindow.axaml.cs
  3. 2
      samples/IntegrationTestApp/ShowWindowTest.axaml
  4. 2
      samples/IntegrationTestApp/ShowWindowTest.axaml.cs
  5. 42
      tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs
  6. 210
      tests/Avalonia.IntegrationTests.Appium/WindowTests.cs

2
samples/IntegrationTestApp/MainWindow.axaml

@ -110,6 +110,8 @@
<ComboBoxItem>CenterOwner</ComboBoxItem>
</ComboBox>
<Button Name="ShowWindow">Show Window</Button>
<Button Name="SendToBack">Send to Back</Button>
<Button Name="ExitFullscreen">Exit Fullscreen</Button>
</StackPanel>
</TabItem>
</TabControl>

15
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<TextBlock>("ClickedMenuItem");
@ -102,6 +113,10 @@ namespace IntegrationTestApp
this.FindControl<TextBlock>("ClickedMenuItem").Text = "None";
if (source?.Name == "ShowWindow")
ShowWindow();
if (source?.Name == "SendToBack")
SendToBack();
if (source?.Name == "ExitFullscreen")
WindowState = WindowState.Normal;
}
}
}

2
samples/IntegrationTestApp/ShowWindowTest.axaml

@ -4,8 +4,6 @@
Name="SecondaryWindow"
Title="Show Window Test">
<Grid ColumnDefinitions="Auto,Auto" RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto">
<Button Name="CloseWindow" Grid.Row="0" Click="CloseWindow_Click">Close</Button>
<Label Grid.Column="0" Grid.Row="1">Client Size</Label>
<TextBox Name="ClientSize" Grid.Column="1" Grid.Row="1" IsReadOnly="True"/>

2
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();
}
}

42
tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs

@ -15,6 +15,19 @@ namespace Avalonia.IntegrationTests.Appium
public static IReadOnlyList<AppiumWebElement> 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();
});
}
}

210
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);
}
}
}

Loading…
Cancel
Save