DefaultAppFixture.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Runtime.InteropServices;
  5. using OpenQA.Selenium.Appium;
  6. using OpenQA.Selenium.Appium.Enums;
  7. namespace Avalonia.IntegrationTests.Appium
  8. {
  9. public class DefaultAppFixture : IDisposable
  10. {
  11. private const string TestAppPath = @"..\..\..\..\..\samples\IntegrationTestApp\bin\Debug\net8.0\IntegrationTestApp.exe";
  12. private const string TestAppBundleId = "net.avaloniaui.avalonia.integrationtestapp";
  13. public DefaultAppFixture()
  14. {
  15. var options = new AppiumOptions();
  16. if (OperatingSystem.IsWindows())
  17. {
  18. ConfigureWin32Options(options);
  19. Session = new WindowsDriver(
  20. new Uri("http://127.0.0.1:4723"),
  21. options);
  22. // https://github.com/microsoft/WinAppDriver/issues/1025
  23. SetForegroundWindow(new IntPtr(int.Parse(
  24. Session.WindowHandles[0].Substring(2),
  25. NumberStyles.AllowHexSpecifier)));
  26. }
  27. else if (OperatingSystem.IsMacOS())
  28. {
  29. ConfigureMacOptions(options);
  30. Session = new MacDriver(
  31. new Uri("http://127.0.0.1:4723/wd/hub"),
  32. options);
  33. }
  34. else
  35. {
  36. throw new PlatformNotSupportedException();
  37. }
  38. }
  39. protected virtual void ConfigureWin32Options(AppiumOptions options, string? app = null)
  40. {
  41. options.AddAdditionalCapability(MobileCapabilityType.App, app ?? Path.GetFullPath(TestAppPath));
  42. options.AddAdditionalCapability(MobileCapabilityType.PlatformName, MobilePlatform.Windows);
  43. options.AddAdditionalCapability(MobileCapabilityType.DeviceName, "WindowsPC");
  44. }
  45. protected virtual void ConfigureMacOptions(AppiumOptions options, string? app = null)
  46. {
  47. options.AddAdditionalCapability("appium:bundleId", app ?? TestAppBundleId);
  48. options.AddAdditionalCapability(MobileCapabilityType.PlatformName, MobilePlatform.MacOS);
  49. options.AddAdditionalCapability(MobileCapabilityType.AutomationName, "mac2");
  50. options.AddAdditionalCapability("appium:showServerLogs", true);
  51. }
  52. public AppiumDriver Session { get; }
  53. public void Dispose()
  54. {
  55. try
  56. {
  57. Session.Close();
  58. }
  59. catch
  60. {
  61. // Closing the session currently seems to crash the mac2 driver.
  62. }
  63. }
  64. public AppiumDriver CreateNestedSession(string appName)
  65. {
  66. var options = new AppiumOptions();
  67. if (OperatingSystem.IsWindows())
  68. {
  69. ConfigureWin32Options(options, appName);
  70. return new WindowsDriver(new Uri("http://127.0.0.1:4723"), options);
  71. }
  72. else if (OperatingSystem.IsMacOS())
  73. {
  74. ConfigureMacOptions(options, appName);
  75. return new MacDriver(new Uri("http://127.0.0.1:4723/wd/hub"), options);
  76. }
  77. else
  78. {
  79. throw new PlatformNotSupportedException();
  80. }
  81. }
  82. [DllImport("user32.dll")]
  83. [return: MarshalAs(UnmanagedType.Bool)]
  84. private static extern bool SetForegroundWindow(IntPtr hWnd);
  85. }
  86. }