Browse Source

Make it work on macOS

pull/15570/head
Max Katz 2 years ago
parent
commit
3526c6f601
  1. 4
      samples/IntegrationTestApp/IntegrationTestApp.csproj
  2. 17
      tests/Avalonia.IntegrationTests.Appium/AutomationTests.cs
  3. 2
      tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj
  4. 17
      tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs
  5. 15
      tests/Avalonia.IntegrationTests.Appium/CheckBoxTests.cs
  6. 48
      tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs
  7. 20
      tests/Avalonia.IntegrationTests.Appium/DefaultAppFixture.cs
  8. 54
      tests/Avalonia.IntegrationTests.Appium/ElementExtensions.cs
  9. 49
      tests/Avalonia.IntegrationTests.Appium/GestureTests.cs
  10. 26
      tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs
  11. 52
      tests/Avalonia.IntegrationTests.Appium/MenuTests.cs
  12. 45
      tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs
  13. 4
      tests/Avalonia.IntegrationTests.Appium/OverlayPopupsAppFixture.cs
  14. 15
      tests/Avalonia.IntegrationTests.Appium/RadioButtonTests.cs
  15. 11
      tests/Avalonia.IntegrationTests.Appium/ScrollBarTests.cs
  16. 37
      tests/Avalonia.IntegrationTests.Appium/SliderTests.cs
  17. 96
      tests/Avalonia.IntegrationTests.Appium/WindowTests.cs
  18. 112
      tests/Avalonia.IntegrationTests.Appium/WindowTests_MacOS.cs

4
samples/IntegrationTestApp/IntegrationTestApp.csproj

@ -4,6 +4,8 @@
<TargetFramework>$(AvsCurrentTargetFramework)</TargetFramework>
<Nullable>enable</Nullable>
<NoWarn>$(NoWarn);AVP1012</NoWarn>
<IncludeAvaloniaGenerators>true</IncludeAvaloniaGenerators>
<!-- <RuntimeIdentifier>osx-arm64</RuntimeIdentifier>-->
</PropertyGroup>
<PropertyGroup>
@ -22,6 +24,8 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="SkiaSharp.NativeAssets.macOS" Version="2.88.8" />
<ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
<ProjectReference Include="..\..\src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj" />
<ProjectReference Include="..\..\src\Avalonia.Fonts.Inter\Avalonia.Fonts.Inter.csproj" />

17
tests/Avalonia.IntegrationTests.Appium/AutomationTests.cs

@ -1,4 +1,5 @@
using OpenQA.Selenium.Appium;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using Xunit;
namespace Avalonia.IntegrationTests.Appium
@ -6,14 +7,14 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class AutomationTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public AutomationTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Automation");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Automation"));
tab.Click();
}
@ -22,15 +23,15 @@ namespace Avalonia.IntegrationTests.Appium
{
// AutomationID can be specified by the Name or AutomationProperties.AutomationId
// properties, with the latter taking precedence.
var byName = _session.FindElementByAccessibilityId("TextBlockWithName");
var byAutomationId = _session.FindElementByAccessibilityId("TextBlockWithNameAndAutomationId");
var byName = _session.FindElement(MobileBy.AccessibilityId("TextBlockWithName"));
var byAutomationId = _session.FindElement(MobileBy.AccessibilityId("TextBlockWithNameAndAutomationId"));
}
[Fact]
public void LabeledBy()
{
var label = _session.FindElementByAccessibilityId("TextBlockAsLabel");
var labeledTextBox = _session.FindElementByAccessibilityId("LabeledByTextBox");
var label = _session.FindElement(MobileBy.AccessibilityId("TextBlockAsLabel"));
var labeledTextBox = _session.FindElement(MobileBy.AccessibilityId("LabeledByTextBox"));
Assert.Equal("Label for TextBox", label.Text);
Assert.Equal("Label for TextBox", labeledTextBox.GetName());

2
tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj

@ -10,7 +10,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Appium.WebDriver" Version="4.4.0" />
<PackageReference Include="Appium.WebDriver" Version="5.0.0-rc.8" />
<PackageReference Include="Xunit.Extensions.Ordering" Version="1.4.5" />
</ItemGroup>

17
tests/Avalonia.IntegrationTests.Appium/ButtonTests.cs

@ -1,4 +1,5 @@
using System.Runtime.InteropServices;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using Xunit;
@ -7,21 +8,21 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class ButtonTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public ButtonTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Button");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Button"));
tab.Click();
}
[Fact]
public void DisabledButton()
{
var button = _session.FindElementByAccessibilityId("DisabledButton");
var button = _session.FindElement(MobileBy.AccessibilityId("DisabledButton"));
Assert.Equal("Disabled Button", button.Text);
Assert.False(button.Enabled);
@ -30,7 +31,7 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void EffectivelyDisabledButton()
{
var button = _session.FindElementByAccessibilityId("EffectivelyDisabledButton");
var button = _session.FindElement(MobileBy.AccessibilityId("EffectivelyDisabledButton"));
Assert.Equal("Effectively Disabled Button", button.Text);
Assert.False(button.Enabled);
@ -39,7 +40,7 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void BasicButton()
{
var button = _session.FindElementByAccessibilityId("BasicButton");
var button = _session.FindElement(MobileBy.AccessibilityId("BasicButton"));
Assert.Equal("Basic Button", button.Text);
Assert.True(button.Enabled);
@ -48,7 +49,7 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void ButtonWithTextBlock()
{
var button = _session.FindElementByAccessibilityId("ButtonWithTextBlock");
var button = _session.FindElement(MobileBy.AccessibilityId("ButtonWithTextBlock"));
Assert.Equal("Button with TextBlock", button.Text);
}
@ -56,7 +57,7 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.Windows)]
public void ButtonWithAcceleratorKey()
{
var button = _session.FindElementByAccessibilityId("ButtonWithAcceleratorKey");
var button = _session.FindElement(MobileBy.AccessibilityId("ButtonWithAcceleratorKey"));
Assert.Equal("Ctrl+B", button.GetAttribute("AcceleratorKey"));
}

15
tests/Avalonia.IntegrationTests.Appium/CheckBoxTests.cs

@ -1,4 +1,5 @@
using OpenQA.Selenium.Appium;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using Xunit;
namespace Avalonia.IntegrationTests.Appium
@ -6,21 +7,21 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class CheckBoxTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public CheckBoxTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("CheckBox");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("CheckBox"));
tab.Click();
}
[Fact]
public void UncheckedCheckBox()
{
var checkBox = _session.FindElementByAccessibilityId("UncheckedCheckBox");
var checkBox = _session.FindElement(MobileBy.AccessibilityId("UncheckedCheckBox"));
Assert.Equal("Unchecked", checkBox.GetName());
Assert.Equal(false, checkBox.GetIsChecked());
@ -32,7 +33,7 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void CheckedCheckBox()
{
var checkBox = _session.FindElementByAccessibilityId("CheckedCheckBox");
var checkBox = _session.FindElement(MobileBy.AccessibilityId("CheckedCheckBox"));
Assert.Equal("Checked", checkBox.GetName());
Assert.Equal(true, checkBox.GetIsChecked());
@ -44,7 +45,7 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void ThreeStateCheckBox()
{
var checkBox = _session.FindElementByAccessibilityId("ThreeStateCheckBox");
var checkBox = _session.FindElement(MobileBy.AccessibilityId("ThreeStateCheckBox"));
Assert.Equal("ThreeState", checkBox.GetName());
Assert.Null(checkBox.GetIsChecked());

48
tests/Avalonia.IntegrationTests.Appium/ComboBoxTests.cs

@ -6,27 +6,27 @@ namespace Avalonia.IntegrationTests.Appium
{
public abstract class ComboBoxTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public ComboBoxTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("ComboBox");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("ComboBox"));
tab.Click();
}
[Fact]
public void Can_Change_Selection_Using_Mouse()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var comboBox = _session.FindElement(MobileBy.AccessibilityId("BasicComboBox"));
_session.FindElementByAccessibilityId("ComboBoxSelectFirst").Click();
_session.FindElement(MobileBy.AccessibilityId("ComboBoxSelectFirst")).Click();
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
comboBox.Click();
_session.FindElementByName("Item 1").SendClick();
_session.FindElement(MobileBy.Name("Item 1")).SendClick();
Assert.Equal("Item 1", comboBox.GetComboBoxValue());
}
@ -34,13 +34,13 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void Can_Change_Selection_From_Unselected_Using_Mouse()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var comboBox = _session.FindElement(MobileBy.AccessibilityId("BasicComboBox"));
_session.FindElementByAccessibilityId("ComboBoxSelectionClear").Click();
_session.FindElement(MobileBy.AccessibilityId("ComboBoxSelectionClear")).Click();
Assert.Equal(string.Empty, comboBox.GetComboBoxValue());
comboBox.Click();
_session.FindElementByName("Item 0").SendClick();
_session.FindElement(MobileBy.Name("Item 0")).SendClick();
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
}
@ -48,13 +48,13 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.Windows)]
public void Can_Change_Selection_With_Keyboard_When_Closed()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var wrap = _session.FindElementByAccessibilityId("ComboBoxWrapSelection");
var comboBox = _session.FindElement(MobileBy.AccessibilityId("BasicComboBox"));
var wrap = _session.FindElement(MobileBy.AccessibilityId("ComboBoxWrapSelection"));
if (wrap.GetIsChecked() != false)
wrap.Click();
_session.FindElementByAccessibilityId("ComboBoxSelectionClear").Click();
_session.FindElement(MobileBy.AccessibilityId("ComboBoxSelectionClear")).Click();
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
@ -75,13 +75,13 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.Windows)]
public void Can_Change_Wrapping_Selection_With_Keyboard_When_Closed()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var wrap = _session.FindElementByAccessibilityId("ComboBoxWrapSelection");
var comboBox = _session.FindElement(MobileBy.AccessibilityId("BasicComboBox"));
var wrap = _session.FindElement(MobileBy.AccessibilityId("ComboBoxWrapSelection"));
if (wrap.GetIsChecked() != true)
wrap.Click();
_session.FindElementByAccessibilityId("ComboBoxSelectionClear").Click();
_session.FindElement(MobileBy.AccessibilityId("ComboBoxSelectionClear")).Click();
comboBox.SendKeys(Keys.ArrowDown);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
@ -105,15 +105,15 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.Windows)]
public void Can_Change_Selection_When_Open_With_Keyboard()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var comboBox = _session.FindElement(MobileBy.AccessibilityId("BasicComboBox"));
_session.FindElementByAccessibilityId("ComboBoxSelectFirst").Click();
_session.FindElement(MobileBy.AccessibilityId("ComboBoxSelectFirst")).Click();
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.LeftAlt + Keys.ArrowDown);
comboBox.SendKeys(Keys.ArrowDown);
var item = _session.FindElementByName("Item 1");
var item = _session.FindElement(MobileBy.Name("Item 1"));
item.SendKeys(Keys.Enter);
Assert.Equal("Item 1", comboBox.GetComboBoxValue());
@ -122,15 +122,15 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.Windows)]
public void Can_Change_Selection_When_Open_With_Keyboard_From_Unselected()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var comboBox = _session.FindElement(MobileBy.AccessibilityId("BasicComboBox"));
_session.FindElementByAccessibilityId("ComboBoxSelectionClear").Click();
_session.FindElement(MobileBy.AccessibilityId("ComboBoxSelectionClear")).Click();
Assert.Equal(string.Empty, comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.LeftAlt + Keys.ArrowDown);
comboBox.SendKeys(Keys.ArrowDown);
var item = _session.FindElementByName("Item 0");
var item = _session.FindElement(MobileBy.Name("Item 0"));
item.SendKeys(Keys.Enter);
Assert.Equal("Item 0", comboBox.GetComboBoxValue());
@ -139,15 +139,15 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.Windows)]
public void Can_Cancel_Keyboard_Selection_With_Escape()
{
var comboBox = _session.FindElementByAccessibilityId("BasicComboBox");
var comboBox = _session.FindElement(MobileBy.AccessibilityId("BasicComboBox"));
_session.FindElementByAccessibilityId("ComboBoxSelectionClear").Click();
_session.FindElement(MobileBy.AccessibilityId("ComboBoxSelectionClear")).Click();
Assert.Equal(string.Empty, comboBox.GetComboBoxValue());
comboBox.SendKeys(Keys.LeftAlt + Keys.ArrowDown);
comboBox.SendKeys(Keys.ArrowDown);
var item = _session.FindElementByName("Item 0");
var item = _session.FindElement(MobileBy.Name("Item 0"));
item.SendKeys(Keys.Escape);
Assert.Equal(string.Empty, comboBox.GetComboBoxValue());

20
tests/Avalonia.IntegrationTests.Appium/DefaultAppFixture.cs

@ -21,7 +21,7 @@ namespace Avalonia.IntegrationTests.Appium
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
ConfigureWin32Options(options);
Session = new WindowsDriver<AppiumWebElement>(
Session = new WindowsDriver(
new Uri("http://127.0.0.1:4723"),
options);
@ -33,7 +33,7 @@ namespace Avalonia.IntegrationTests.Appium
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
ConfigureMacOptions(options);
Session = new MacDriver<AppiumWebElement>(
Session = new MacDriver(
new Uri("http://127.0.0.1:4723/wd/hub"),
options);
}
@ -46,20 +46,20 @@ namespace Avalonia.IntegrationTests.Appium
protected virtual void ConfigureWin32Options(AppiumOptions options)
{
var path = Path.GetFullPath(TestAppPath);
options.AddAdditionalCapability(MobileCapabilityType.App, path);
options.AddAdditionalCapability(MobileCapabilityType.PlatformName, MobilePlatform.Windows);
options.AddAdditionalCapability(MobileCapabilityType.DeviceName, "WindowsPC");
options.AddAdditionalAppiumOption(MobileCapabilityType.App, path);
options.AddAdditionalAppiumOption(MobileCapabilityType.PlatformName, MobilePlatform.Windows);
options.AddAdditionalAppiumOption(MobileCapabilityType.DeviceName, "WindowsPC");
}
protected virtual void ConfigureMacOptions(AppiumOptions options)
{
options.AddAdditionalCapability("appium:bundleId", TestAppBundleId);
options.AddAdditionalCapability(MobileCapabilityType.PlatformName, MobilePlatform.MacOS);
options.AddAdditionalCapability(MobileCapabilityType.AutomationName, "mac2");
options.AddAdditionalCapability("appium:showServerLogs", true);
options.AddAdditionalAppiumOption("appium:bundleId", TestAppBundleId);
options.AddAdditionalAppiumOption("appium:showServerLogs", true);
options.AutomationName = "mac2";
options.PlatformName = MobilePlatform.MacOS;
}
public AppiumDriver<AppiumWebElement> Session { get; }
public AppiumDriver Session { get; }
public void Dispose()
{

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

@ -12,40 +12,40 @@ using Xunit;
namespace Avalonia.IntegrationTests.Appium
{
public record class WindowChrome(
AppiumWebElement? Close,
AppiumWebElement? Minimize,
AppiumWebElement? Maximize,
AppiumWebElement? FullScreen);
AppiumElement? Close,
AppiumElement? Minimize,
AppiumElement? Maximize,
AppiumElement? FullScreen);
internal static class ElementExtensions
{
public static IReadOnlyList<AppiumWebElement> GetChildren(this AppiumWebElement element) =>
element.FindElementsByXPath("*/*");
public static IReadOnlyList<AppiumElement> GetChildren(this AppiumElement element) =>
element.FindElements(MobileBy.XPath("*/*"));
public static WindowChrome GetChromeButtons(this AppiumWebElement window)
public static WindowChrome GetChromeButtons(this AppiumElement window)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
var closeButton = window.FindElementsByAccessibilityId("_XCUI:CloseWindow").FirstOrDefault();
var fullscreenButton = window.FindElementsByAccessibilityId("_XCUI:FullScreenWindow").FirstOrDefault();
var minimizeButton = window.FindElementsByAccessibilityId("_XCUI:MinimizeWindow").FirstOrDefault();
var zoomButton = window.FindElementsByAccessibilityId("_XCUI:ZoomWindow").FirstOrDefault();
var closeButton = window.FindElements(MobileBy.AccessibilityId("_XCUI:CloseWindow")).FirstOrDefault();
var fullscreenButton = window.FindElements(MobileBy.AccessibilityId("_XCUI:FullScreenWindow")).FirstOrDefault();
var minimizeButton = window.FindElements(MobileBy.AccessibilityId("_XCUI:MinimizeWindow")).FirstOrDefault();
var zoomButton = window.FindElements(MobileBy.AccessibilityId("_XCUI:ZoomWindow")).FirstOrDefault();
return new(closeButton, minimizeButton, zoomButton, fullscreenButton);
}
throw new NotSupportedException("GetChromeButtons not supported on this platform.");
}
public static string GetComboBoxValue(this AppiumWebElement element)
public static string GetComboBoxValue(this AppiumElement element)
{
return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ?
element.Text :
element.GetAttribute("value");
}
public static string GetName(this AppiumWebElement element) => GetAttribute(element, "Name", "title");
public static string GetName(this AppiumElement element) => GetAttribute(element, "Name", "title");
public static bool? GetIsChecked(this AppiumWebElement element) =>
public static bool? GetIsChecked(this AppiumElement element) =>
GetAttribute(element, "Toggle.ToggleState", "value") switch
{
"0" => false,
@ -54,11 +54,11 @@ namespace Avalonia.IntegrationTests.Appium
_ => throw new ArgumentOutOfRangeException($"Unexpected IsChecked value.")
};
public static bool GetIsFocused(this AppiumWebElement element)
public static bool GetIsFocused(this AppiumElement element)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
var active = element.WrappedDriver.SwitchTo().ActiveElement() as AppiumWebElement;
var active = element.WrappedDriver.SwitchTo().ActiveElement() as AppiumElement;
return element.Id == active?.Id;
}
else
@ -75,7 +75,7 @@ namespace Avalonia.IntegrationTests.Appium
/// <returns>
/// An object which when disposed will cause the newly opened window to close.
/// </returns>
public static IDisposable OpenWindowWithClick(this AppiumWebElement element)
public static IDisposable OpenWindowWithClick(this AppiumElement element)
{
var session = element.WrappedDriver;
@ -83,7 +83,7 @@ namespace Avalonia.IntegrationTests.Appium
{
var oldHandle = session.CurrentWindowHandle;
var oldHandles = session.WindowHandles.ToList();
var oldChildWindows = session.FindElements(By.XPath("//Window"));
var oldChildWindows = session.FindElements(MobileBy.XPath("//Window"));
element.Click();
@ -105,7 +105,7 @@ namespace Avalonia.IntegrationTests.Appium
// If a new window handle hasn't been added to the session then it's likely
// that a child window was opened. These don't appear in session.WindowHandles
// so we have to use an XPath query to get hold of it.
var newChildWindows = session.FindElements(By.XPath("//Window"));
var newChildWindows = session.FindElements(MobileBy.XPath("//Window"));
var childWindow = Assert.Single(newChildWindows.Except(oldChildWindows));
return Disposable.Create(() =>
@ -116,7 +116,7 @@ namespace Avalonia.IntegrationTests.Appium
}
else
{
var oldWindows = session.FindElements(By.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"));
var oldWindows = session.FindElements(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"));
var oldWindowTitles = oldWindows.ToDictionary(x => x.Text);
element.Click();
@ -124,7 +124,7 @@ namespace Avalonia.IntegrationTests.Appium
// Wait for animations to run.
Thread.Sleep(1000);
var newWindows = session.FindElements(By.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"));
var newWindows = session.FindElements(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"));
// Try to find the new window by looking for a window with a title that didn't exist before the button
// was clicked. Sometimes it seems that when a window becomes fullscreen, all other windows in the
@ -141,18 +141,18 @@ namespace Avalonia.IntegrationTests.Appium
{
// 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 windows = session.FindElements(By.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"));
var windows = session.FindElements(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"));
var text = windows.Select(x => x.Text).ToList();
var newWindow = session.FindElements(By.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"))
var newWindow = session.FindElements(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"))
.First(x => x.Text == newWindowTitle);
var close = ((AppiumWebElement)newWindow).FindElementByAccessibilityId("_XCUI:CloseWindow");
var close = ((AppiumElement)newWindow).FindElement(MobileBy.AccessibilityId("_XCUI:CloseWindow"));
close!.Click();
Thread.Sleep(1000);
});
}
}
public static void SendClick(this AppiumWebElement element)
public static void SendClick(this AppiumElement element)
{
// The Click() method seems to correspond to accessibilityPerformPress on macOS but certain controls
// such as list items don't support this action, so instead simulate a physical click as VoiceOver
@ -160,12 +160,12 @@ namespace Avalonia.IntegrationTests.Appium
new Actions(element.WrappedDriver).MoveToElement(element).Click().Perform();
}
public static void MovePointerOver(this AppiumWebElement element)
public static void MovePointerOver(this AppiumElement element)
{
new Actions(element.WrappedDriver).MoveToElement(element).Perform();
}
public static string GetAttribute(AppiumWebElement element, string windows, string macOS)
public static string GetAttribute(AppiumElement element, string windows, string macOS)
{
return element.GetAttribute(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? windows : macOS);
}

49
tests/Avalonia.IntegrationTests.Appium/GestureTests.cs

@ -1,5 +1,6 @@
using System;
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Interactions;
using Xunit;
@ -9,24 +10,24 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class GestureTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public GestureTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Gestures");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Gestures"));
tab.Click();
var clear = _session.FindElementByAccessibilityId("ResetGestures");
var clear = _session.FindElement(MobileBy.AccessibilityId("ResetGestures"));
clear.Click();
}
[Fact]
public void Tapped_Is_Raised()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
new Actions(_session).Click(border).Perform();
@ -36,8 +37,8 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void Tapped_Is_Raised_Slow()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
new Actions(_session).ClickAndHold(border).Perform();
@ -51,8 +52,8 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void Tapped_Is_Not_Raised_For_Drag()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
new Actions(_session)
.ClickAndHold(border)
@ -66,8 +67,8 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void DoubleTapped_Is_Raised()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
new Actions(_session).DoubleClick(border).Perform();
@ -77,8 +78,8 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.Windows | TestPlatforms.Linux)]
public void DoubleTapped_Is_Raised_2()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
new Actions(_session).ClickAndHold(border).Release().Perform();
@ -101,8 +102,8 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void DoubleTapped_Is_Raised_Not_Raised_If_Too_Slow()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
new Actions(_session).ClickAndHold(border).Release().Perform();
@ -117,8 +118,8 @@ namespace Avalonia.IntegrationTests.Appium
public void DoubleTapped_Is_Raised_After_Control_Changes()
{
// #8733
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
new Actions(_session)
.MoveToElement(border)
@ -135,8 +136,8 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void RightTapped_Is_Raised()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
new Actions(_session).ContextClick(border).Perform();
@ -146,8 +147,8 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.MacOS)]
public void RightTapped_Is_Raised_2()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
var device = new PointerInputDevice(PointerKind.Mouse);
var b = new ActionBuilder();
@ -163,8 +164,8 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.MacOS)]
public void RightTapped_Is_Not_Raised_For_Drag()
{
var border = _session.FindElementByAccessibilityId("GestureBorder");
var lastGesture = _session.FindElementByAccessibilityId("LastGesture");
var border = _session.FindElement(MobileBy.AccessibilityId("GestureBorder"));
var lastGesture = _session.FindElement(MobileBy.AccessibilityId("LastGesture"));
var device = new PointerInputDevice(PointerKind.Mouse);
var b = new ActionBuilder();

26
tests/Avalonia.IntegrationTests.Appium/ListBoxTests.cs

@ -9,14 +9,14 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class ListBoxTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public ListBoxTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("ListBox");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("ListBox"));
tab.Click();
}
@ -24,8 +24,8 @@ namespace Avalonia.IntegrationTests.Appium
public void Can_Select_Item_By_Clicking()
{
var listBox = GetTarget();
var item2 = listBox.FindElementByName("Item 2");
var item4 = listBox.FindElementByName("Item 4");
var item2 = listBox.FindElement(MobileBy.Name("Item 2"));
var item4 = listBox.FindElement(MobileBy.Name("Item 4"));
Assert.False(item2.Selected);
Assert.False(item4.Selected);
@ -43,8 +43,8 @@ namespace Avalonia.IntegrationTests.Appium
public void Can_Select_Items_By_Ctrl_Clicking()
{
var listBox = GetTarget();
var item2 = listBox.FindElementByName("Item 2");
var item4 = listBox.FindElementByName("Item 4");
var item2 = listBox.FindElement(MobileBy.Name("Item 2"));
var item4 = listBox.FindElement(MobileBy.Name("Item 4"));
Assert.False(item2.Selected);
Assert.False(item4.Selected);
@ -65,9 +65,9 @@ namespace Avalonia.IntegrationTests.Appium
public void Can_Select_Range_By_Shift_Clicking()
{
var listBox = GetTarget();
var item2 = listBox.FindElementByName("Item 2");
var item3 = listBox.FindElementByName("Item 3");
var item4 = listBox.FindElementByName("Item 4");
var item2 = listBox.FindElement(MobileBy.Name("Item 2"));
var item3 = listBox.FindElement(MobileBy.Name("Item 3"));
var item4 = listBox.FindElement(MobileBy.Name("Item 4"));
Assert.False(item2.Selected);
Assert.False(item3.Selected);
@ -94,10 +94,10 @@ namespace Avalonia.IntegrationTests.Appium
Assert.True(children.Count < 100);
}
private AppiumWebElement GetTarget()
private AppiumElement GetTarget()
{
_session.FindElementByAccessibilityId("ListBoxSelectionClear").Click();
return _session.FindElementByAccessibilityId("BasicListBox");
_session.FindElement(MobileBy.AccessibilityId("ListBoxSelectionClear")).Click();
return _session.FindElement(MobileBy.AccessibilityId("BasicListBox"));
}
}
}

52
tests/Avalonia.IntegrationTests.Appium/MenuTests.cs

@ -9,51 +9,51 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public abstract class MenuTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public MenuTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Menu");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Menu"));
tab.Click();
var reset = _session.FindElementByAccessibilityId("MenuClickedMenuItemReset");
var reset = _session.FindElement(MobileBy.AccessibilityId("MenuClickedMenuItemReset"));
reset.Click();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("None", clickedMenuItem.Text);
}
[Fact]
public void Click_Child()
{
var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem");
var rootMenuItem = _session.FindElement(MobileBy.AccessibilityId("RootMenuItem"));
rootMenuItem.SendClick();
var childMenuItem = _session.FindElementByAccessibilityId("Child1MenuItem");
var childMenuItem = _session.FindElement(MobileBy.AccessibilityId("Child1MenuItem"));
childMenuItem.SendClick();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("_Child 1", clickedMenuItem.Text);
}
[Fact]
public void Click_Grandchild()
{
var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem");
var rootMenuItem = _session.FindElement(MobileBy.AccessibilityId("RootMenuItem"));
rootMenuItem.SendClick();
var childMenuItem = _session.FindElementByAccessibilityId("Child2MenuItem");
var childMenuItem = _session.FindElement(MobileBy.AccessibilityId("Child2MenuItem"));
childMenuItem.SendClick();
var grandchildMenuItem = _session.FindElementByAccessibilityId("GrandchildMenuItem");
var grandchildMenuItem = _session.FindElement(MobileBy.AccessibilityId("GrandchildMenuItem"));
grandchildMenuItem.SendClick();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("_Grandchild", clickedMenuItem.Text);
}
@ -67,7 +67,7 @@ namespace Avalonia.IntegrationTests.Appium
.SendKeys(Keys.Down + Keys.Enter)
.Perform();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("_Child 1", clickedMenuItem.Text);
}
@ -81,7 +81,7 @@ namespace Avalonia.IntegrationTests.Appium
.SendKeys(Keys.Down + Keys.Down + Keys.Right + Keys.Enter)
.Perform();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("_Grandchild", clickedMenuItem.Text);
}
@ -95,7 +95,7 @@ namespace Avalonia.IntegrationTests.Appium
.SendKeys("rc")
.Perform();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("_Child 1", clickedMenuItem.Text);
}
@ -109,14 +109,14 @@ namespace Avalonia.IntegrationTests.Appium
.SendKeys("rhg")
.Perform();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("_Grandchild", clickedMenuItem.Text);
}
[PlatformFact(TestPlatforms.Windows)]
public void Select_Child_With_Click_Arrow_Keys()
{
var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem");
var rootMenuItem = _session.FindElement(MobileBy.AccessibilityId("RootMenuItem"));
rootMenuItem.SendClick();
MovePointerOutOfTheWay();
@ -125,14 +125,14 @@ namespace Avalonia.IntegrationTests.Appium
.SendKeys(Keys.Down + Keys.Enter)
.Perform();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("_Child 1", clickedMenuItem.Text);
}
[PlatformFact(TestPlatforms.Windows)]
public void Select_Grandchild_With_Click_Arrow_Keys()
{
var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem");
var rootMenuItem = _session.FindElement(MobileBy.AccessibilityId("RootMenuItem"));
rootMenuItem.SendClick();
MovePointerOutOfTheWay();
@ -141,18 +141,18 @@ namespace Avalonia.IntegrationTests.Appium
.SendKeys(Keys.Down + Keys.Down + Keys.Right + Keys.Enter)
.Perform();
var clickedMenuItem = _session.FindElementByAccessibilityId("ClickedMenuItem");
var clickedMenuItem = _session.FindElement(MobileBy.AccessibilityId("ClickedMenuItem"));
Assert.Equal("_Grandchild", clickedMenuItem.Text);
}
[PlatformFact(TestPlatforms.Windows)]
public void Child_AcceleratorKey()
{
var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem");
var rootMenuItem = _session.FindElement(MobileBy.AccessibilityId("RootMenuItem"));
rootMenuItem.SendClick();
var childMenuItem = _session.FindElementByAccessibilityId("Child1MenuItem");
var childMenuItem = _session.FindElement(MobileBy.AccessibilityId("Child1MenuItem"));
Assert.Equal("Ctrl+O", childMenuItem.GetAttribute("AcceleratorKey"));
}
@ -161,12 +161,12 @@ namespace Avalonia.IntegrationTests.Appium
public void PointerOver_Does_Not_Steal_Focus()
{
// Issue #7906
var textBox = _session.FindElementByAccessibilityId("MenuFocusTest");
var textBox = _session.FindElement(MobileBy.AccessibilityId("MenuFocusTest"));
textBox.Click();
Assert.True(textBox.GetIsFocused());
var rootMenuItem = _session.FindElementByAccessibilityId("RootMenuItem");
var rootMenuItem = _session.FindElement(MobileBy.AccessibilityId("RootMenuItem"));
rootMenuItem.MovePointerOver();
Assert.True(textBox.GetIsFocused());
@ -177,8 +177,8 @@ namespace Avalonia.IntegrationTests.Appium
// Move the pointer to the menu tab item so that it's not over the menu in preparation
// for key press tests. This prevents the mouse accidentially selecting the wrong item
// by hovering.
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Menu");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Menu"));
tab.MovePointerOver();
}

45
tests/Avalonia.IntegrationTests.Appium/NativeMenuTests.cs

@ -1,4 +1,5 @@
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using Xunit;
@ -7,29 +8,29 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class NativeMenuTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public NativeMenuTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Automation");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Automation"));
tab.Click();
}
[PlatformFact(TestPlatforms.MacOS)]
public void MacOS_View_Menu_Select_Button_Tab()
{
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var buttonTab = tabs.FindElementByName("Button");
var menuBar = _session.FindElementByXPath("/XCUIElementTypeApplication/XCUIElementTypeMenuBar");
var viewMenu = menuBar.FindElementByName("View");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var buttonTab = tabs.FindElement(MobileBy.Name("Button"));
var menuBar = _session.FindElement(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeMenuBar"));
var viewMenu = menuBar.FindElement(MobileBy.Name("View"));
Assert.False(buttonTab.Selected);
viewMenu.Click();
var buttonMenu = viewMenu.FindElementByName("Button");
var buttonMenu = viewMenu.FindElement(MobileBy.Name("Button"));
buttonMenu.Click();
Assert.True(buttonTab.Selected);
@ -38,14 +39,14 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.Windows)]
public void Win32_View_Menu_Select_Button_Tab()
{
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var buttonTab = tabs.FindElementByName("Button");
var viewMenu = _session.FindElementByXPath("//MenuItem[@Name='View']");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var buttonTab = tabs.FindElement(MobileBy.Name("Button"));
var viewMenu = _session.FindElement(MobileBy.XPath("//MenuItem[@Name='View']"));
Assert.False(buttonTab.Selected);
viewMenu.Click();
var buttonMenu = viewMenu.FindElementByName("Button");
var buttonMenu = viewMenu.FindElement(MobileBy.Name("Button"));
buttonMenu.Click();
Assert.True(buttonTab.Selected);
@ -54,42 +55,42 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.MacOS)]
public void MacOS_Sanitizes_Access_Key_Markers_When_Included_In_Menu_Title()
{
var menuBar = _session.FindElementByXPath("/XCUIElementTypeApplication/XCUIElementTypeMenuBar");
var menuBar = _session.FindElement(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeMenuBar"));
Assert.True(menuBar.FindElementsByName("_Options").Count == 0);
Assert.True(menuBar.FindElementsByName("Options").Count == 1);
Assert.True(menuBar.FindElements(MobileBy.Name("_Options")).Count == 0);
Assert.True(menuBar.FindElements(MobileBy.Name("Options")).Count == 1);
}
[PlatformFact(TestPlatforms.Windows)]
public void Win32_Avalonia_Menu_Has_ToolTip_If_Defined()
{
var viewMenu = _session.FindElementByXPath("//MenuItem[@Name='View']");
var viewMenu = _session.FindElement(MobileBy.XPath("//MenuItem[@Name='View']"));
viewMenu.Click();
var buttonMenuItem = viewMenu.FindElementByName("Button");
var buttonMenuItem = viewMenu.FindElement(MobileBy.Name("Button"));
buttonMenuItem.MovePointerOver();
// Wait for tooltip to open.
Thread.Sleep(2000);
var toolTipCandidates = _session.FindElementsByClassName("TextBlock");
var toolTipCandidates = _session.FindElements(MobileBy.ClassName("TextBlock"));
Assert.Contains(toolTipCandidates, x => x.Text == "Tip:Button");
}
[PlatformFact(TestPlatforms.MacOS, Skip = "Flaky test")]
public void MacOS_Native_Menu_Has_ToolTip_If_Defined()
{
var menuBar = _session.FindElementByXPath("/XCUIElementTypeApplication/XCUIElementTypeMenuBar");
var viewMenu = menuBar.FindElementByName("View");
var menuBar = _session.FindElement(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeMenuBar"));
var viewMenu = menuBar.FindElement(MobileBy.Name("View"));
viewMenu.Click();
var buttonMenuItem = viewMenu.FindElementByName("Button");
var buttonMenuItem = viewMenu.FindElement(MobileBy.Name("Button"));
buttonMenuItem.MovePointerOver();
// Wait for tooltip to open.
Thread.Sleep(4000);
var toolTipCandidates = _session.FindElementsByClassName("XCUIElementTypeStaticText");
var toolTipCandidates = _session.FindElements(MobileBy.ClassName("XCUIElementTypeStaticText"));
Assert.Contains(toolTipCandidates, x => x.Text == "Tip:Button");
}
}

4
tests/Avalonia.IntegrationTests.Appium/OverlayPopupsAppFixture.cs

@ -7,13 +7,13 @@ namespace Avalonia.IntegrationTests.Appium
protected override void ConfigureWin32Options(AppiumOptions options)
{
base.ConfigureWin32Options(options);
options.AddAdditionalCapability("appArguments", "--overlayPopups");
options.AddAdditionalAppiumOption("appArguments", "--overlayPopups");
}
protected override void ConfigureMacOptions(AppiumOptions options)
{
base.ConfigureMacOptions(options);
options.AddAdditionalCapability("appium:arguments", new[] { "--overlayPopups" });
options.AddAdditionalAppiumOption("appium:arguments", new[] { "--overlayPopups" });
}
}
}

15
tests/Avalonia.IntegrationTests.Appium/RadioButtonTests.cs

@ -1,4 +1,5 @@
using OpenQA.Selenium.Appium;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using Xunit;
namespace Avalonia.IntegrationTests.Appium
@ -6,21 +7,21 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class RadioButtonTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public RadioButtonTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
tabs.FindElementByName("RadioButton").Click();
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
tabs.FindElement(MobileBy.Name("RadioButton")).Click();
}
[Fact]
public void RadioButton_IsChecked_True_When_Clicked()
{
var button = _session.FindElementByAccessibilityId("BasicRadioButton");
var button = _session.FindElement(MobileBy.AccessibilityId("BasicRadioButton"));
Assert.False(button.GetIsChecked());
button.Click();
Assert.True(button.GetIsChecked());
@ -29,8 +30,8 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void ThreeState_RadioButton_IsChecked_False_When_Other_ThreeState_RadioButton_Checked()
{
var button1 = _session.FindElementByAccessibilityId("ThreeStatesRadioButton1");
var button2 = _session.FindElementByAccessibilityId("ThreeStatesRadioButton2");
var button1 = _session.FindElement(MobileBy.AccessibilityId("ThreeStatesRadioButton1"));
var button2 = _session.FindElement(MobileBy.AccessibilityId("ThreeStatesRadioButton2"));
Assert.True(button1.GetIsChecked());
Assert.False(button2.GetIsChecked());
button2.Click();

11
tests/Avalonia.IntegrationTests.Appium/ScrollBarTests.cs

@ -1,4 +1,5 @@
using OpenQA.Selenium.Appium;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using Xunit;
namespace Avalonia.IntegrationTests.Appium
@ -6,21 +7,21 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class ScrollBarTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public ScrollBarTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("ScrollBar");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("ScrollBar"));
tab.Click();
}
[Fact]
public void ScrollBar_Increases_Value_By_LargeChange_When_IncreaseButton_Is_Clicked()
{
var button = _session.FindElementByAccessibilityId("MyScrollBar");
var button = _session.FindElement(MobileBy.AccessibilityId("MyScrollBar"));
Assert.True(double.Parse(button.Text) == 20);
button.Click();

37
tests/Avalonia.IntegrationTests.Appium/SliderTests.cs

@ -1,5 +1,6 @@
using System;
using System.Globalization;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Interactions;
using Xunit;
@ -9,32 +10,32 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class SliderTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public SliderTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Slider");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Slider"));
tab.Click();
var reset = _session.FindElementByAccessibilityId("ResetSliders");
var reset = _session.FindElement(MobileBy.AccessibilityId("ResetSliders"));
reset.Click();
}
[Fact]
public void Horizontal_Changes_Value_Dragging_Thumb_Right()
{
var slider = _session.FindElementByAccessibilityId("HorizontalSlider");
var thumb = slider.FindElementByAccessibilityId("thumb");
var slider = _session.FindElement(MobileBy.AccessibilityId("HorizontalSlider"));
var thumb = slider.FindElement(MobileBy.AccessibilityId("thumb"));
var initialThumbRect = thumb.Rect;
new Actions(_session).ClickAndHold(thumb).MoveByOffset(100, 0).Release().Perform();
var value = Math.Round(double.Parse(slider.Text, CultureInfo.InvariantCulture));
var boundValue = double.Parse(
_session.FindElementByAccessibilityId("HorizontalSliderValue").Text,
_session.FindElement(MobileBy.AccessibilityId("HorizontalSliderValue")).Text,
CultureInfo.InvariantCulture);
Assert.True(value > 50);
@ -47,15 +48,15 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void Horizontal_Changes_Value_Dragging_Thumb_Left()
{
var slider = _session.FindElementByAccessibilityId("HorizontalSlider");
var thumb = slider.FindElementByAccessibilityId("thumb");
var slider = _session.FindElement(MobileBy.AccessibilityId("HorizontalSlider"));
var thumb = slider.FindElement(MobileBy.AccessibilityId("thumb"));
var initialThumbRect = thumb.Rect;
new Actions(_session).ClickAndHold(thumb).MoveByOffset(-100, 0).Release().Perform();
var value = Math.Round(double.Parse(slider.Text, CultureInfo.InvariantCulture));
var boundValue = double.Parse(
_session.FindElementByAccessibilityId("HorizontalSliderValue").Text,
_session.FindElement(MobileBy.AccessibilityId("HorizontalSliderValue")).Text,
CultureInfo.InvariantCulture);
Assert.True(value < 50);
@ -68,15 +69,15 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void Horizontal_Changes_Value_When_Clicking_Increase_Button()
{
var slider = _session.FindElementByAccessibilityId("HorizontalSlider");
var thumb = slider.FindElementByAccessibilityId("thumb");
var slider = _session.FindElement(MobileBy.AccessibilityId("HorizontalSlider"));
var thumb = slider.FindElement(MobileBy.AccessibilityId("thumb"));
var initialThumbRect = thumb.Rect;
new Actions(_session).MoveToElement(slider, 100, 0, MoveToElementOffsetOrigin.Center).Click().Perform();
new Actions(_session).MoveToElement(slider, 100, 0).Click().Perform();
var value = Math.Round(double.Parse(slider.Text, CultureInfo.InvariantCulture));
var boundValue = double.Parse(
_session.FindElementByAccessibilityId("HorizontalSliderValue").Text,
_session.FindElement(MobileBy.AccessibilityId("HorizontalSliderValue")).Text,
CultureInfo.InvariantCulture);
Assert.True(value > 50);
@ -89,15 +90,15 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void Horizontal_Changes_Value_When_Clicking_Decrease_Button()
{
var slider = _session.FindElementByAccessibilityId("HorizontalSlider");
var thumb = slider.FindElementByAccessibilityId("thumb");
var slider = _session.FindElement(MobileBy.AccessibilityId("HorizontalSlider"));
var thumb = slider.FindElement(MobileBy.AccessibilityId("thumb"));
var initialThumbRect = thumb.Rect;
new Actions(_session).MoveToElement(slider, -100, 0, MoveToElementOffsetOrigin.Center).Click().Perform();
new Actions(_session).MoveToElement(slider, -100, 0).Click().Perform();
var value = Math.Round(double.Parse(slider.Text, CultureInfo.InvariantCulture));
var boundValue = double.Parse(
_session.FindElementByAccessibilityId("HorizontalSliderValue").Text,
_session.FindElement(MobileBy.AccessibilityId("HorizontalSliderValue")).Text,
CultureInfo.InvariantCulture);
Assert.True(value < 50);

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

@ -15,14 +15,14 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class WindowTests
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public WindowTests(DefaultAppFixture fixture)
{
_session = fixture.Session;
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Window");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Window"));
tab.Click();
}
@ -90,8 +90,8 @@ namespace Avalonia.IntegrationTests.Appium
{
try
{
_session.FindElementByAccessibilityId("CurrentWindowState").SendClick();
_session.FindElementByAccessibilityId("WindowStateNormal").SendClick();
_session.FindElement(MobileBy.AccessibilityId("CurrentWindowState")).SendClick();
_session.FindElement(MobileBy.AccessibilityId("WindowStateNormal")).SendClick();
// Wait for animations to run.
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
@ -110,12 +110,12 @@ namespace Avalonia.IntegrationTests.Appium
{
using (OpenWindow(new Size(400, 400), ShowWindowMode.NonOwned, WindowStartupLocation.Manual))
{
var windowState = _session.FindElementByAccessibilityId("CurrentWindowState");
var windowState = _session.FindElement(MobileBy.AccessibilityId("CurrentWindowState"));
Assert.Equal("Normal", windowState.GetComboBoxValue());
var window = _session.FindElements(By.XPath("//Window")).First();
var window = _session.FindElements(MobileBy.XPath("//Window")).First();
new Actions(_session)
.KeyDown(Keys.Meta)
@ -126,7 +126,7 @@ namespace Avalonia.IntegrationTests.Appium
var original = GetWindowInfo();
windowState.Click();
_session.FindElementByName("Minimized").SendClick();
_session.FindElement(MobileBy.Name("Minimized")).SendClick();
new Actions(_session)
.KeyDown(Keys.Alt)
@ -147,8 +147,8 @@ namespace Avalonia.IntegrationTests.Appium
{
using (OpenWindow(new Size(4000, 2200), ShowWindowMode.NonOwned, WindowStartupLocation.Manual))
{
var screenRectTextBox = _session.FindElementByAccessibilityId("CurrentClientSize");
var measuredWithTextBlock = _session.FindElementByAccessibilityId("CurrentMeasuredWithText");
var screenRectTextBox = _session.FindElement(MobileBy.AccessibilityId("CurrentClientSize"));
var measuredWithTextBlock = _session.FindElement(MobileBy.AccessibilityId("CurrentMeasuredWithText"));
var measuredWithString = measuredWithTextBlock.Text;
var workingAreaString = screenRectTextBox.Text;
@ -167,17 +167,17 @@ namespace Avalonia.IntegrationTests.Appium
public void ShowMode(ShowWindowMode mode)
{
using var window = OpenWindow(null, mode, WindowStartupLocation.Manual);
var windowState = _session.FindElementByAccessibilityId("CurrentWindowState");
var windowState = _session.FindElement(MobileBy.AccessibilityId("CurrentWindowState"));
var original = GetWindowInfo();
Assert.Equal("Normal", windowState.GetComboBoxValue());
windowState.Click();
_session.FindElementByAccessibilityId("WindowStateMaximized").SendClick();
_session.FindElement(MobileBy.AccessibilityId("WindowStateMaximized")).SendClick();
Assert.Equal("Maximized", windowState.GetComboBoxValue());
windowState.Click();
_session.FindElementByAccessibilityId("WindowStateNormal").SendClick();
_session.FindElement(MobileBy.AccessibilityId("WindowStateNormal")).SendClick();
var current = GetWindowInfo();
Assert.Equal(original.Position, current.Position);
@ -187,7 +187,7 @@ namespace Avalonia.IntegrationTests.Appium
if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || mode == ShowWindowMode.NonOwned)
{
windowState.Click();
_session.FindElementByAccessibilityId("WindowStateFullScreen").SendClick();
_session.FindElement(MobileBy.AccessibilityId("WindowStateFullScreen")).SendClick();
Assert.Equal("FullScreen", windowState.GetComboBoxValue());
current = GetWindowInfo();
@ -197,7 +197,7 @@ namespace Avalonia.IntegrationTests.Appium
windowState.SendClick();
_session.FindElementByAccessibilityId("WindowStateNormal").SendClick();
_session.FindElement(MobileBy.AccessibilityId("WindowStateNormal")).SendClick();
current = GetWindowInfo();
Assert.Equal(original.Position, current.Position);
@ -210,7 +210,7 @@ namespace Avalonia.IntegrationTests.Appium
{
var clientSize = new Size(400, 400);
using var window = OpenWindow(clientSize, ShowWindowMode.NonOwned, WindowStartupLocation.CenterScreen, extendClientArea: true);
var windowState = _session.FindElementByAccessibilityId("CurrentWindowState");
var windowState = _session.FindElement(MobileBy.AccessibilityId("CurrentWindowState"));
var current = GetWindowInfo();
Assert.Equal(current.ClientSize, clientSize);
@ -219,11 +219,11 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void TransparentWindow()
{
var showTransparentWindow = _session.FindElementByAccessibilityId("ShowTransparentWindow");
var showTransparentWindow = _session.FindElement(MobileBy.AccessibilityId("ShowTransparentWindow"));
showTransparentWindow.Click();
Thread.Sleep(1000);
var window = _session.FindElementByAccessibilityId("TransparentWindow");
var window = _session.FindElement(MobileBy.AccessibilityId("TransparentWindow"));
var screenshot = window.GetScreenshot();
window.Click();
@ -239,12 +239,12 @@ namespace Avalonia.IntegrationTests.Appium
[Fact]
public void TransparentPopup()
{
var showTransparentWindow = _session.FindElementByAccessibilityId("ShowTransparentPopup");
var showTransparentWindow = _session.FindElement(MobileBy.AccessibilityId("ShowTransparentPopup"));
showTransparentWindow.Click();
Thread.Sleep(1000);
var window = _session.FindElementByAccessibilityId("TransparentPopupBackground");
var container = window.FindElementByAccessibilityId("PopupContainer");
var window = _session.FindElement(MobileBy.AccessibilityId("TransparentPopupBackground"));
var container = window.FindElement(MobileBy.AccessibilityId("PopupContainer"));
var screenshot = container.GetScreenshot();
window.Click();
@ -268,20 +268,20 @@ namespace Avalonia.IntegrationTests.Appium
{
using (OpenWindow(null, mode, WindowStartupLocation.Manual, canResize: false, extendClientArea: extendClientArea))
{
var secondaryWindow = GetWindow("SecondaryWindow");
AppiumWebElement? maximizeButton;
var secondaryWindow = GetWindow(_session, "SecondaryWindow");
AppiumElement? maximizeButton;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
maximizeButton = extendClientArea ?
secondaryWindow.FindElementByXPath("//Button[@Name='Maximize']") :
secondaryWindow.FindElementByXPath("//TitleBar/Button[2]");
secondaryWindow.FindElement(MobileBy.XPath("//Button[@Name='Maximize']")) :
secondaryWindow.FindElement(MobileBy.XPath("//TitleBar/Button[2]"));
}
else
{
maximizeButton = mode == ShowWindowMode.NonOwned ?
secondaryWindow.FindElementByAccessibilityId("_XCUI:FullScreenWindow") :
secondaryWindow.FindElementByAccessibilityId("_XCUI:ZoomWindow");
secondaryWindow.FindElement(MobileBy.AccessibilityId("_XCUI:FullScreenWindow")) :
secondaryWindow.FindElement(MobileBy.AccessibilityId("_XCUI:ZoomWindow"));
}
Assert.False(maximizeButton.Enabled);
@ -375,13 +375,13 @@ namespace Avalonia.IntegrationTests.Appium
bool canResize = true,
bool extendClientArea = false)
{
var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize");
var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode");
var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation");
var stateComboBox = _session.FindElementByAccessibilityId("ShowWindowState");
var canResizeCheckBox = _session.FindElementByAccessibilityId("ShowWindowCanResize");
var showButton = _session.FindElementByAccessibilityId("ShowWindow");
var extendClientAreaCheckBox = _session.FindElementByAccessibilityId("ShowWindowExtendClientAreaToDecorationsHint");
var sizeTextBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowSize"));
var modeComboBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowMode"));
var locationComboBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowLocation"));
var stateComboBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowState"));
var canResizeCheckBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowCanResize"));
var showButton = _session.FindElement(MobileBy.AccessibilityId("ShowWindow"));
var extendClientAreaCheckBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowExtendClientAreaToDecorationsHint"));
if (size.HasValue)
sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}");
@ -389,19 +389,19 @@ namespace Avalonia.IntegrationTests.Appium
if (modeComboBox.GetComboBoxValue() != mode.ToString())
{
modeComboBox.Click();
_session.FindElementByName(mode.ToString()).SendClick();
_session.FindElement(MobileBy.Name(mode.ToString())).SendClick();
}
if (locationComboBox.GetComboBoxValue() != location.ToString())
{
locationComboBox.Click();
_session.FindElementByName(location.ToString()).SendClick();
_session.FindElement(MobileBy.Name(location.ToString())).SendClick();
}
if (stateComboBox.GetComboBoxValue() != state.ToString())
{
stateComboBox.Click();
_session.FindElementByAccessibilityId($"ShowWindowState{state}").SendClick();
_session.FindElement(MobileBy.AccessibilityId($"ShowWindowState{state}")).SendClick();
}
if (canResizeCheckBox.GetIsChecked() != canResize)
@ -413,18 +413,18 @@ namespace Avalonia.IntegrationTests.Appium
return showButton.OpenWindowWithClick();
}
private AppiumWebElement GetWindow(string identifier)
internal static AppiumElement GetWindow(AppiumDriver session, string identifier)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
// The Avalonia a11y tree currently exposes two nested Window elements, this is a bug and should be fixed
// but in the meantime use the `parent::' selector to return the parent "real" window.
return _session.FindElementByXPath(
$"XCUIElementTypeWindow//*[@identifier='{identifier}']/parent::XCUIElementTypeWindow");
return session.FindElement(MobileBy.XPath(
$"XCUIElementTypeWindow//*[@identifier='{identifier}']/parent::XCUIElementTypeWindow"));
}
else
{
return _session.FindElementByXPath($"//Window[@AutomationId='{identifier}']");
return session.FindElement(MobileBy.XPath($"//Window[@AutomationId='{identifier}']"));
}
}
@ -432,7 +432,7 @@ namespace Avalonia.IntegrationTests.Appium
{
PixelRect? ReadOwnerRect()
{
var text = _session.FindElementByAccessibilityId("CurrentOwnerRect").Text;
var text = _session.FindElement(MobileBy.AccessibilityId("CurrentOwnerRect")).Text;
return !string.IsNullOrWhiteSpace(text) ? PixelRect.Parse(text) : null;
}
@ -443,13 +443,13 @@ namespace Avalonia.IntegrationTests.Appium
try
{
return new(
Size.Parse(_session.FindElementByAccessibilityId("CurrentClientSize").Text),
Size.Parse(_session.FindElementByAccessibilityId("CurrentFrameSize").Text),
PixelPoint.Parse(_session.FindElementByAccessibilityId("CurrentPosition").Text),
Size.Parse(_session.FindElement(MobileBy.AccessibilityId("CurrentClientSize")).Text),
Size.Parse(_session.FindElement(MobileBy.AccessibilityId("CurrentFrameSize")).Text),
PixelPoint.Parse(_session.FindElement(MobileBy.AccessibilityId("CurrentPosition")).Text),
ReadOwnerRect(),
PixelRect.Parse(_session.FindElementByAccessibilityId("CurrentScreenRect").Text),
double.Parse(_session.FindElementByAccessibilityId("CurrentScaling").Text),
Enum.Parse<WindowState>(_session.FindElementByAccessibilityId("CurrentWindowState").Text));
PixelRect.Parse(_session.FindElement(MobileBy.AccessibilityId("CurrentScreenRect")).Text),
double.Parse(_session.FindElement(MobileBy.AccessibilityId("CurrentScaling")).Text),
Enum.Parse<WindowState>(_session.FindElement(MobileBy.AccessibilityId("CurrentWindowState")).Text));
}
catch (OpenQA.Selenium.NoSuchElementException) when (retry++ < 3)
{

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

@ -14,7 +14,7 @@ namespace Avalonia.IntegrationTests.Appium
[Collection("Default")]
public class WindowTests_MacOS
{
private readonly AppiumDriver<AppiumWebElement> _session;
private readonly AppiumDriver _session;
public WindowTests_MacOS(DefaultAppFixture fixture)
{
@ -26,8 +26,8 @@ namespace Avalonia.IntegrationTests.Appium
{
try
{
var tabs = _session.FindElementByAccessibilityId("MainTabs");
var tab = tabs.FindElementByName("Window");
var tabs = _session.FindElement(MobileBy.AccessibilityId("MainTabs"));
var tab = tabs.FindElement(MobileBy.Name("Window"));
tab.Click();
return;
}
@ -44,7 +44,7 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
var mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Modal, WindowStartupLocation.Manual))
{
@ -83,7 +83,7 @@ namespace Avalonia.IntegrationTests.Appium
public void WindowOrder_Modal_Dialog_Stays_InFront_Of_Parent_When_In_Fullscreen()
{
var mainWindow = GetWindow("MainWindow");
var fullScreen = mainWindow.FindElementByAccessibilityId("_XCUI:FullScreenWindow");
var fullScreen = mainWindow.FindElement(MobileBy.AccessibilityId("_XCUI:FullScreenWindow"));
fullScreen.Click();
@ -99,14 +99,14 @@ namespace Avalonia.IntegrationTests.Appium
}
finally
{
_session.FindElementByAccessibilityId("ExitFullscreen").Click();
_session.FindElement(MobileBy.AccessibilityId("ExitFullscreen")).Click();
}
}
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Owned_Dialog_Stays_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
var mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.Manual))
{
@ -119,16 +119,16 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_Owned_Dialog_Stays_InFront_Of_FullScreen_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
var mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
// Enter fullscreen
mainWindow.FindElementByAccessibilityId("EnterFullscreen").Click();
mainWindow.FindElement(MobileBy.AccessibilityId("EnterFullscreen")).Click();
// Wait for fullscreen transition.
Thread.Sleep(1000);
// Make sure we entered fullscreen.
var windowState = mainWindow.FindElementByAccessibilityId("MainWindowState");
var windowState = mainWindow.FindElement(MobileBy.AccessibilityId("MainWindowState"));
Assert.Equal("FullScreen", windowState.Text);
// Open child window.
@ -140,14 +140,14 @@ namespace Avalonia.IntegrationTests.Appium
}
// Exit fullscreen by menu shortcut Command+R
mainWindow.FindElementByAccessibilityId("ExitFullscreen").Click();
mainWindow.FindElement(MobileBy.AccessibilityId("ExitFullscreen")).Click();
// Wait for restore transition.
Thread.Sleep(1000);
// Make sure we exited fullscreen.
mainWindow = _session.FindElementByAccessibilityId("MainWindow");
windowState = mainWindow.FindElementByAccessibilityId("MainWindowState");
mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
windowState = mainWindow.FindElement(MobileBy.AccessibilityId("MainWindowState"));
Assert.Equal("Normal", windowState.Text);
}
@ -167,21 +167,21 @@ namespace Avalonia.IntegrationTests.Appium
public void Does_Not_Switch_Space_From_FullScreen_To_Main_Desktop_When_FullScreen_Window_Clicked()
{
// Issue #9565
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
AppiumWebElement windowState;
var mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
AppiumElement windowState;
// Open child window.
using (OpenWindow(new PixelSize(200, 100), ShowWindowMode.Owned, WindowStartupLocation.Manual))
{
// Enter fullscreen
mainWindow.FindElementByAccessibilityId("EnterFullscreen").Click();
mainWindow.FindElement(MobileBy.AccessibilityId("EnterFullscreen")).Click();
// Wait for fullscreen transition.
Thread.Sleep(1000);
// Make sure we entered fullscreen.
mainWindow = _session.FindElementByAccessibilityId("MainWindow");
windowState = mainWindow.FindElementByAccessibilityId("MainWindowState");
mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
windowState = mainWindow.FindElement(MobileBy.AccessibilityId("MainWindowState"));
Assert.Equal("FullScreen", windowState.Text);
// Click on main window
@ -189,22 +189,22 @@ namespace Avalonia.IntegrationTests.Appium
// Failed here due to #9565: main window is no longer visible as the main space is now shown instead
// of the fullscreen space.
mainWindow.FindElementByAccessibilityId("ExitFullscreen").Click();
mainWindow.FindElement(MobileBy.AccessibilityId("ExitFullscreen")).Click();
// Wait for restore transition.
Thread.Sleep(1000);
}
// Make sure we exited fullscreen.
mainWindow = _session.FindElementByAccessibilityId("MainWindow");
windowState = mainWindow.FindElementByAccessibilityId("MainWindowState");
mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
windowState = mainWindow.FindElement(MobileBy.AccessibilityId("MainWindowState"));
Assert.Equal("Normal", windowState.Text);
}
[PlatformFact(TestPlatforms.MacOS)]
public void WindowOrder_NonOwned_Window_Does_Not_Stay_InFront_Of_Parent()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
var mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
using (OpenWindow(new PixelSize(800, 100), ShowWindowMode.NonOwned, WindowStartupLocation.Manual))
{
@ -214,7 +214,7 @@ namespace Avalonia.IntegrationTests.Appium
Assert.Equal(2, secondaryWindowIndex);
var sendToBack = _session.FindElementByAccessibilityId("SendToBack");
var sendToBack = _session.FindElement(MobileBy.AccessibilityId("SendToBack"));
sendToBack.Click();
}
}
@ -275,7 +275,7 @@ namespace Avalonia.IntegrationTests.Appium
using (OpenWindow(new PixelSize(200, 100), mode, WindowStartupLocation.Manual))
{
var secondaryWindow = GetWindow("SecondaryWindow");
var miniaturizeButton = secondaryWindow.FindElementByAccessibilityId("_XCUI:MinimizeWindow");
var miniaturizeButton = secondaryWindow.FindElement(MobileBy.AccessibilityId("_XCUI:MinimizeWindow"));
Assert.False(miniaturizeButton.Enabled);
}
@ -289,19 +289,19 @@ namespace Avalonia.IntegrationTests.Appium
using (OpenWindow(new PixelSize(200, 100), mode, WindowStartupLocation.Manual))
{
var secondaryWindow = GetWindow("SecondaryWindow");
var miniaturizeButton = secondaryWindow.FindElementByAccessibilityId("_XCUI:MinimizeWindow");
var miniaturizeButton = secondaryWindow.FindElement(MobileBy.AccessibilityId("_XCUI:MinimizeWindow"));
miniaturizeButton.Click();
Thread.Sleep(1000);
var hittable = _session.FindElementsByXPath("/XCUIElementTypeApplication/XCUIElementTypeWindow")
var hittable = _session.FindElements(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"))
.Select(x => x.GetAttribute("hittable")).ToList();
Assert.Equal(new[] { "true", "false" }, hittable);
_session.FindElementByAccessibilityId("RestoreAll").Click();
_session.FindElement(MobileBy.AccessibilityId("RestoreAll")).Click();
Thread.Sleep(1000);
hittable = _session.FindElementsByXPath("/XCUIElementTypeApplication/XCUIElementTypeWindow")
hittable = _session.FindElements(MobileBy.XPath("/XCUIElementTypeApplication/XCUIElementTypeWindow"))
.Select(x => x.GetAttribute("hittable")).ToList();
Assert.Equal(new[] { "true", "true" }, hittable);
}
@ -310,30 +310,30 @@ namespace Avalonia.IntegrationTests.Appium
[PlatformFact(TestPlatforms.MacOS)]
public void Hidden_Child_Window_Is_Not_Reshown_When_Parent_Clicked()
{
var mainWindow = _session.FindElementByAccessibilityId("MainWindow");
var mainWindow = _session.FindElement(MobileBy.AccessibilityId("MainWindow"));
// We don't use dispose to close the window here, because it seems that hiding and re-showing a window
// causes Appium to think it's a different window.
OpenWindow(null, ShowWindowMode.Owned, WindowStartupLocation.Manual);
var secondaryWindow = GetWindow("SecondaryWindow");
var hideButton = secondaryWindow.FindElementByAccessibilityId("HideButton");
var hideButton = secondaryWindow.FindElement(MobileBy.AccessibilityId("HideButton"));
hideButton.Click();
var windows = _session.FindElementsByXPath("XCUIElementTypeWindow");
var windows = _session.FindElements(MobileBy.XPath("XCUIElementTypeWindow"));
Assert.Single(windows);
mainWindow.Click();
windows = _session.FindElementsByXPath("XCUIElementTypeWindow");
windows = _session.FindElements(MobileBy.XPath("XCUIElementTypeWindow"));
Assert.Single(windows);
_session.FindElementByAccessibilityId("RestoreAll").Click();
_session.FindElement(MobileBy.AccessibilityId("RestoreAll")).Click();
// Close the window manually.
secondaryWindow = GetWindow("SecondaryWindow");
secondaryWindow.FindElementByAccessibilityId("_XCUI:CloseWindow").Click();
secondaryWindow.FindElement(MobileBy.AccessibilityId("_XCUI:CloseWindow")).Click();
}
[PlatformFact(TestPlatforms.MacOS)]
@ -347,16 +347,16 @@ namespace Avalonia.IntegrationTests.Appium
// The XPath of the title bar text _should_ be "XCUIElementTypeStaticText"
// but Appium seems to put a fake node between the window and the title bar
// https://stackoverflow.com/a/71914227/6448
var titleBar = secondaryWindow.FindElementsByXPath("/*/XCUIElementTypeStaticText").Count;
var titleBar = secondaryWindow.FindElements(MobileBy.XPath("/*/XCUIElementTypeStaticText")).Count;
Assert.Equal(0, titleBar);
secondaryWindow.FindElementByAccessibilityId("CurrentSystemDecorations").Click();
_session.FindElementByAccessibilityId("SystemDecorationsNone").SendClick();
secondaryWindow.FindElementByAccessibilityId("CurrentSystemDecorations").Click();
_session.FindElementByAccessibilityId("SystemDecorationsFull").SendClick();
secondaryWindow.FindElement(MobileBy.AccessibilityId("CurrentSystemDecorations")).Click();
_session.FindElement(MobileBy.AccessibilityId("SystemDecorationsNone")).SendClick();
secondaryWindow.FindElement(MobileBy.AccessibilityId("CurrentSystemDecorations")).Click();
_session.FindElement(MobileBy.AccessibilityId("SystemDecorationsFull")).SendClick();
titleBar = secondaryWindow.FindElementsByXPath("/*/XCUIElementTypeStaticText").Count;
titleBar = secondaryWindow.FindElements(MobileBy.XPath("/*/XCUIElementTypeStaticText")).Count;
Assert.Equal(0, titleBar);
}
}
@ -393,8 +393,8 @@ namespace Avalonia.IntegrationTests.Appium
{
if (decorations != SystemDecorations.Full)
{
secondaryWindow.FindElementByAccessibilityId("CurrentSystemDecorations").Click();
_session.FindElementByAccessibilityId("SystemDecorationsFull").SendClick();
secondaryWindow.FindElement(MobileBy.AccessibilityId("CurrentSystemDecorations")).Click();
_session.FindElement(MobileBy.AccessibilityId("SystemDecorationsFull")).SendClick();
}
}
}
@ -408,13 +408,13 @@ namespace Avalonia.IntegrationTests.Appium
SystemDecorations systemDecorations = SystemDecorations.Full,
bool extendClientArea = false)
{
var sizeTextBox = _session.FindElementByAccessibilityId("ShowWindowSize");
var modeComboBox = _session.FindElementByAccessibilityId("ShowWindowMode");
var locationComboBox = _session.FindElementByAccessibilityId("ShowWindowLocation");
var canResizeCheckBox = _session.FindElementByAccessibilityId("ShowWindowCanResize");
var showButton = _session.FindElementByAccessibilityId("ShowWindow");
var systemDecorationsComboBox = _session.FindElementByAccessibilityId("ShowWindowSystemDecorations");
var extendClientAreaCheckBox = _session.FindElementByAccessibilityId("ShowWindowExtendClientAreaToDecorationsHint");
var sizeTextBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowSize"));
var modeComboBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowMode"));
var locationComboBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowLocation"));
var canResizeCheckBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowCanResize"));
var showButton = _session.FindElement(MobileBy.AccessibilityId("ShowWindow"));
var systemDecorationsComboBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowSystemDecorations"));
var extendClientAreaCheckBox = _session.FindElement(MobileBy.AccessibilityId("ShowWindowExtendClientAreaToDecorationsHint"));
if (size.HasValue)
sizeTextBox.SendKeys($"{size.Value.Width}, {size.Value.Height}");
@ -422,13 +422,13 @@ namespace Avalonia.IntegrationTests.Appium
if (modeComboBox.GetComboBoxValue() != mode.ToString())
{
modeComboBox.Click();
_session.FindElementByName(mode.ToString()).SendClick();
_session.FindElement(MobileBy.Name(mode.ToString())).SendClick();
}
if (locationComboBox.GetComboBoxValue() != location.ToString())
{
locationComboBox.Click();
_session.FindElementByName(location.ToString()).SendClick();
_session.FindElement(MobileBy.Name(location.ToString())).SendClick();
}
if (canResizeCheckBox.GetIsChecked() != canResize)
@ -437,7 +437,7 @@ namespace Avalonia.IntegrationTests.Appium
if (systemDecorationsComboBox.GetComboBoxValue() != systemDecorations.ToString())
{
systemDecorationsComboBox.Click();
_session.FindElementByName(systemDecorations.ToString()).SendClick();
_session.FindElement(MobileBy.Name(systemDecorations.ToString())).SendClick();
}
if (extendClientAreaCheckBox.GetIsChecked() != extendClientArea)
@ -446,18 +446,18 @@ namespace Avalonia.IntegrationTests.Appium
return showButton.OpenWindowWithClick();
}
private AppiumWebElement GetWindow(string identifier)
private AppiumElement GetWindow(string identifier)
{
// The Avalonia a11y tree currently exposes two nested Window elements, this is a bug and should be fixed
// but in the meantime use the `parent::' selector to return the parent "real" window.
return _session.FindElementByXPath(
$"XCUIElementTypeWindow//*[@identifier='{identifier}']/parent::XCUIElementTypeWindow");
return _session.FindElement(MobileBy.XPath(
$"XCUIElementTypeWindow//*[@identifier='{identifier}']/parent::XCUIElementTypeWindow"));
}
private int GetWindowOrder(string identifier)
{
var window = GetWindow(identifier);
var order = window.FindElementByXPath("//*[@identifier='CurrentOrder']");
var order = window.FindElement(MobileBy.XPath("//*[@identifier='CurrentOrder']"));
return int.Parse(order.Text);
}

Loading…
Cancel
Save