E2ETests: Refactor initial class structure
All checks were successful
Test / Run tests (push) Successful in 2m35s

This commit is contained in:
2024-07-07 14:35:54 +02:00
parent ddd821e478
commit 6b48a1090c
11 changed files with 238 additions and 210 deletions

View File

@ -1,4 +1,5 @@
<Window x:Class="Elwig.Dialogs.DeleteMemberDialog" <Window x:Class="Elwig.Dialogs.DeleteMemberDialog"
AutomationProperties.AutomationId="DeleteMemberDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

View File

@ -1,5 +1,6 @@
<local:AdministrationWindow <local:AdministrationWindow
x:Class="Elwig.Windows.BaseDataWindow" x:Class="Elwig.Windows.BaseDataWindow"
AutomationProperties.AutomationId="BaseDataWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

View File

@ -1,4 +1,6 @@
<local:AdministrationWindow x:Class="Elwig.Windows.DeliveryAdminWindow" <local:AdministrationWindow
x:Class="Elwig.Windows.DeliveryAdminWindow"
AutomationProperties.AutomationId="DeliveryAdminWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Elwig.Windows" xmlns:local="clr-namespace:Elwig.Windows"

View File

@ -1,9 +1,9 @@
<local:AdministrationWindow <local:AdministrationWindow
x:Class="Elwig.Windows.MemberAdminWindow" x:Class="Elwig.Windows.MemberAdminWindow"
AutomationProperties.AutomationId="MemberAdminWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Elwig.Windows" xmlns:local="clr-namespace:Elwig.Windows"
AutomationProperties.AutomationId="MemberAdminWindow"
Title="Mitglieder - Elwig" Height="700" Width="1250" MinHeight="650" MinWidth="1150" Title="Mitglieder - Elwig" Height="700" Width="1250" MinHeight="650" MinWidth="1150"
Loaded="Window_Loaded"> Loaded="Window_Loaded">
<Window.Resources> <Window.Resources>

View File

@ -0,0 +1,47 @@
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Appium;
namespace Tests.E2ETests {
public class AppSession : IDisposable {
private const int WaitForAppLaunch = 3;
private readonly string WinAppDriverUrl;
public readonly WindowsDriver<WindowsElement> App;
public readonly WindowsDriver<WindowsElement> Desktop;
public AppSession(string appPath, string winAppDriverUrl) {
WinAppDriverUrl = winAppDriverUrl;
var appiumOptions = new AppiumOptions();
appiumOptions.AddAdditionalCapability("app", appPath);
appiumOptions.AddAdditionalCapability("deviceName", "WindowsPC");
appiumOptions.AddAdditionalCapability("ms:waitForAppLaunch", WaitForAppLaunch);
App = new WindowsDriver<WindowsElement>(new Uri(WinAppDriverUrl), appiumOptions);
Assert.That(App, Is.Not.Null);
Assert.That(App.SessionId, Is.Not.Null);
App.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1.5);
var desktopOptions = new AppiumOptions();
desktopOptions.AddAdditionalCapability("app", "Root");
desktopOptions.AddAdditionalCapability("deviceName", "WindowsPC");
Desktop = new WindowsDriver<WindowsElement>(new Uri(WinAppDriverUrl), desktopOptions);
}
public WindowsDriver<WindowsElement> CreateWindowDriver(string windowName) {
var window = Desktop.FindElementByAccessibilityId(windowName);
var windowHandle = int.Parse(window.GetAttribute("NativeWindowHandle")).ToString("x"); // Convert to Hex
var appiumOptions = new AppiumOptions();
appiumOptions.AddAdditionalCapability("appTopLevelWindow", windowHandle);
return new WindowsDriver<WindowsElement>(new Uri(WinAppDriverUrl), appiumOptions);
}
public void Dispose() {
GC.SuppressFinalize(this);
App.Close();
try {
Desktop.FindElementByName("Ja").Click();
} catch { }
App.Dispose();
Desktop.Close();
Desktop.Dispose();
}
}
}

View File

@ -1,30 +1,50 @@
namespace Tests.E2ETests { namespace Tests.E2ETests {
[TestFixture] [TestFixture]
public class MainWindowTest : TestBase { public class MainWindowTest {
private AppSession Session;
[OneTimeSetUp] [OneTimeSetUp]
public void ClassSetUp() { public void Setup() {
} Session = new(Utils.ApplicationPath, WinAppDriver.WinAppDriverUrl);
[SetUp]
public void TestSetUp() {
Setup();
} }
[OneTimeTearDown] [OneTimeTearDown]
public void ClassTearDown() { public void Teardown() {
StopWinappDriver(); Session.Dispose();
}
[TearDown]
public void TestTearDown() {
TearDown();
} }
[Test] [Test]
public void StartApplication() { public void Test_Open_MemberAdminWindow() {
AppSession.FindElementByName("Mitglieder").Click(); Assert.DoesNotThrow(() => {
Thread.Sleep(5000); Session.App.FindElementByName("Mitglieder").Click();
Thread.Sleep(1500);
var window = Session.CreateWindowDriver("MemberAdminWindow");
Assert.That(window.Title, Is.EqualTo("Mitglieder - Elwig"));
window.Close();
});
}
[Test]
public void Test_Open_DeliveryAdminWindow() {
Assert.DoesNotThrow(() => {
Session.App.FindElementByName("Lieferungen").Click();
Thread.Sleep(1500);
var window = Session.CreateWindowDriver("DeliveryAdminWindow");
Assert.That(window.Title, Is.EqualTo("Lieferungen - Elwig"));
window.Close();
});
}
[Test]
public void Test_Open_BaseDataWindow() {
Assert.DoesNotThrow(() => {
Session.App.FindElementByName("Stammdaten").Click();
Thread.Sleep(1500);
var window = Session.CreateWindowDriver("BaseDataWindow");
Assert.That(window.Title, Is.EqualTo("Stammdaten - Elwig"));
window.Close();
});
} }
} }
} }

View File

@ -1,150 +1,146 @@
using OpenQA.Selenium.Appium.Windows; using OpenQA.Selenium.Appium.Windows;
namespace Tests.E2ETests { namespace Tests.E2ETests {
public class MemberAdminWindowTest : TestBase { [TestFixture]
public class MemberAdminWindowTest {
public WindowsDriver<WindowsElement> Session { get; private set; } private AppSession Session;
private WindowsDriver<WindowsElement> Window;
[OneTimeSetUp] [OneTimeSetUp]
public void ClassSetUp() { public void WindowSetup() {
Setup(); Session = new(Utils.ApplicationPath, WinAppDriver.WinAppDriverUrl);
AppSession.FindElementByName("Mitglieder").Click(); Session.App.FindElementByName("Mitglieder").Click();
Thread.Sleep(1000); Thread.Sleep(1000);
Session = CreateWindowDriver("MemberAdminWindow"); Window = Session.CreateWindowDriver("MemberAdminWindow");
}
[SetUp]
public void TestSetUp() {
} }
[OneTimeTearDown] [OneTimeTearDown]
public void ClassTearDown() { public void WindowTeardown() {
if (Session != null) { Window.Close();
Session.Close(); Window.Quit();
Session.Quit(); Session.Dispose();
Session = null;
}
TearDown();
StopWinappDriver();
} }
[TearDown] [TearDown]
public void TestTearDown() { public void Teardown() {
Session.FindElementByAccessibilityId("SearchInput").Clear(); Window!.FindById("SearchInput").Clear();
Thread.Sleep(1000); Thread.Sleep(500);
} }
[Test, Order(1)] [Test]
public void CreateMember() { public void Test_1_CreateMember() {
Session.FindElementByAccessibilityId("NewMemberButton").Click(); Window!.FindById("NewMemberButton").Click();
var mgnr = Session.FindElementByAccessibilityId("MgNrInput").Text; //TODO: Fixe MGNR verwenden Window.FindById("MgNrInput").Clear();
Window.FindById("MgNrInput").SendKeys("10003");
Session.FindElementByAccessibilityId("GivenNameInput").SendKeys("Max"); Window.FindById("GivenNameInput").SendKeys("Max");
Session.FindElementByAccessibilityId("FamilyNameInput").SendKeys("Mustermann"); Window.FindById("FamilyNameInput").SendKeys("Mustermann");
Session.FindElementByAccessibilityId("PrefixInput").SendKeys("Ing."); Window.FindById("PrefixInput").SendKeys("Ing.");
Session.FindElementByAccessibilityId("SuffixInput").SendKeys("jun."); Window.FindById("SuffixInput").SendKeys("jun.");
Session.FindElementByAccessibilityId("BirthdayInput").SendKeys("1987"); Window.FindById("BirthdayInput").SendKeys("1987");
Session.FindElementByAccessibilityId("AddressInput").SendKeys("Musterstraße 9"); Window.FindById("AddressInput").SendKeys("Musterstraße 9");
Session.FindElementByAccessibilityId("PlzInput").SendKeys("2120"); Window.FindById("PlzInput").SendKeys("2120");
ClickComboBoxByCount(Session, "OrtInput", 1); Window.SelectComboBoxItemByCount("OrtInput", 1);
Session.FindElementByAccessibilityId("EmailAddress1Input").SendKeys("max.mustermann@aon.at"); Window.FindById("EmailAddress1Input").SendKeys("max.mustermann@aon.at");
Session.FindElementByAccessibilityId("EmailAddress2Input").SendKeys("erika.mustermann@aon.at"); Window.FindById("EmailAddress2Input").SendKeys("erika.mustermann@aon.at");
ClickComboBoxByCount(Session, "PhoneNr1TypeInput", 1); Window.SelectComboBoxItemByCount("PhoneNr1TypeInput", 1);
Session.FindElementByAccessibilityId("PhoneNr1Input").SendKeys("+43 1234 5678"); Window.FindById("PhoneNr1Input").SendKeys("012345678");
ClickComboBoxByCount(Session, "PhoneNr2TypeInput", 2); Window.SelectComboBoxItemByCount("PhoneNr2TypeInput", 2);
Session.FindElementByAccessibilityId("PhoneNr2Input").SendKeys("+43 123 45678901"); Window.FindById("PhoneNr2Input").SendKeys("0664123456");
Session.FindElementByAccessibilityId("IbanInput").SendKeys("AT611904300234573201"); Window.FindById("IbanInput").SendKeys("AT611904300234573201");
Session.FindElementByAccessibilityId("BicInput").SendKeys("RLNWATWWWDF"); Window.FindById("BicInput").SendKeys("RLNWATWWWDF");
Session.FindElementByAccessibilityId("UstIdNrInput").SendKeys("ATU66192906"); //TODO: Testdaten? Window.FindById("UstIdNrInput").SendKeys("ATU66192906"); //TODO: Testdaten?
Session.FindElementByAccessibilityId("LfbisNrInput").SendKeys("1251074"); //TODO: Testdaten? Window.FindById("LfbisNrInput").SendKeys("1251074"); //TODO: Testdaten?
Session.FindElementByAccessibilityId("BuchführendInput").Click(); Window.FindById("BuchführendInput").Click();
Session.FindElementByAccessibilityId("OrganicInput").Click(); Window.FindById("OrganicInput").Click();
Session.FindElementByAccessibilityId("BillingNameInput").SendKeys("Mustermann KG"); Window.FindById("BillingNameInput").SendKeys("Mustermann KG");
Session.FindElementByAccessibilityId("BillingAddressInput").SendKeys("Betriebsstraße 1"); Window.FindById("BillingAddressInput").SendKeys("Betriebsstraße 1");
Session.FindElementByAccessibilityId("BillingPlzInput").SendKeys("2120"); Window.FindById("BillingPlzInput").SendKeys("2120");
ClickComboBoxByCount(Session, "BillingOrtInput", 2); Window.SelectComboBoxItemByCount("BillingOrtInput", 2);
Session.FindElementByAccessibilityId("BusinessSharesInput").SendKeys("10"); Window.FindById("BusinessSharesInput").SendKeys("10");
ClickComboBoxByText(Session, "BranchInput", "Matzen"); Window.SelectComboBoxItemByText("BranchInput", "Matzen");
ClickComboBoxByCount(Session, "DefaultKgInput", 3); Window.SelectComboBoxItemByCount("DefaultKgInput", 3);
Session.FindElementByAccessibilityId("VollLieferantInput").Click(); Window.FindById("VollLieferantInput").Click();
Session.FindElementByAccessibilityId("FunkionärInput").Click(); Window.FindById("FunkionärInput").Click();
Session.FindElementByAccessibilityId("CommentInput").SendKeys("Die lieben Mustermänner und Musterfrauen!"); Window.FindById("CommentInput").SendKeys("Die lieben Mustermänner und Musterfrauen!");
Session.FindElementByAccessibilityId("ContactEmailInput").Click(); Window.FindById("ContactEmailInput").Click();
Session.FindElementByAccessibilityId("SaveButton").Click(); Window.FindById("SaveButton").Click();
Session.FindElementByAccessibilityId("SearchInput").SendKeys($"{mgnr} Max Mustermann"); Window.FindById("SearchInput").SendKeys("10003 Max Mustermann");
Thread.Sleep(500);
var memberListow = Session.FindElementByAccessibilityId("MemberList").FindElementByClassName("DataGridRow"); var memberListRow = Window.FindById("MemberList").FindElementByClassName("DataGridRow");
Assert.That(memberListow, Is.Not.Null);
Assert.Multiple(() => { Assert.Multiple(() => {
Assert.That(memberListow.FindElementByName($"{mgnr} "), Is.Not.Null); Assert.That(memberListRow, Is.Not.Null);
Assert.That(memberListow.FindElementByName("Max"), Is.Not.Null); Assert.That(memberListRow.FindElementByName("10003 "), Is.Not.Null);
Assert.That(memberListow.FindElementByName("Mustermann"), Is.Not.Null); Assert.That(memberListRow.FindElementByName("Max"), Is.Not.Null);
Assert.That(memberListRow.FindElementByName("Mustermann"), Is.Not.Null);
}); });
} }
[Test, Order(2)] [Test]
public void EditMember() { public void Test_2_EditMember() {
Session.FindElementByAccessibilityId("SearchInput").SendKeys("10003 Max Mustermann"); Window!.FindById("SearchInput").SendKeys("10003 Max Mustermann");
var memberList = Session.FindElementByAccessibilityId("MemberList"); Thread.Sleep(500);
var memberList = Window.FindById("MemberList");
Assert.That(memberList, Is.Not.Null); Assert.That(memberList, Is.Not.Null);
var memberListRows = memberList.FindElementsByClassName("DataGridRow"); var memberListRows = memberList.FindElementsByClassName("DataGridRow");
Assert.That(memberListRows, Has.Count.EqualTo(1)); Assert.That(memberListRows, Has.Count.EqualTo(1));
Session.FindElementByAccessibilityId("EditMemberButton").Click(); Window.FindById("EditMemberButton").Click();
var businessSharesInput = Session.FindElementByAccessibilityId("BusinessSharesInput"); var businessSharesInput = Window.FindById("BusinessSharesInput");
Assert.That(businessSharesInput, Is.Not.Null); Assert.That(businessSharesInput, Is.Not.Null);
var businessShares = int.Parse(businessSharesInput.Text); var businessShares = int.Parse(businessSharesInput.Text);
businessSharesInput.Clear(); businessSharesInput.Clear();
businessSharesInput.SendKeys($"{businessShares + 5}"); businessSharesInput.SendKeys($"{businessShares + 5}");
Session.FindElementByAccessibilityId("SaveButton").Click(); Window.FindById("SaveButton").Click();
var newBusinessShares = int.Parse(businessSharesInput.Text); var newBusinessShares = int.Parse(businessSharesInput.Text);
Assert.That(newBusinessShares, Is.EqualTo(businessShares + 5)); Assert.That(newBusinessShares, Is.EqualTo(businessShares + 5));
} }
[Test, Order(3)] [Test]
public void DeleteMember() { public void Test_3_DeleteMember() {
Session.FindElementByAccessibilityId("SearchInput").SendKeys("10003 Max Mustermann"); Window!.FindById("SearchInput").SendKeys("10003 Max Mustermann");
var memberList = Session.FindElementByAccessibilityId("MemberList"); Thread.Sleep(500);
var memberList = Window.FindById("MemberList");
Assert.That(memberList, Is.Not.Null); Assert.That(memberList, Is.Not.Null);
var memberListRows = memberList.FindElementsByClassName("DataGridRow"); var memberListRows = memberList.FindElementsByClassName("DataGridRow");
Assert.That(memberListRows, Has.Count.EqualTo(1)); Assert.That(memberListRows, Has.Count.EqualTo(1));
var memberListRow = memberListRows.First(); var memberListRow = memberListRows.First();
Assert.Multiple(() => { Assert.Multiple(() => {
Assert.That(memberListRow, Is.Not.Null);
Assert.That(memberListRow.FindElementByName("10003 "), Is.Not.Null); Assert.That(memberListRow.FindElementByName("10003 "), Is.Not.Null);
Assert.That(memberListRow.FindElementByName("Max"), Is.Not.Null); Assert.That(memberListRow.FindElementByName("Max"), Is.Not.Null);
Assert.That(memberListRow.FindElementByName("Mustermann"), Is.Not.Null); Assert.That(memberListRow.FindElementByName("Mustermann"), Is.Not.Null);
}); });
Session.FindElementByAccessibilityId("DeleteMemberButton").Click(); Window.FindById("DeleteMemberButton").Click();
DesktopSession.FindElementByName("OK").Click(); var dialog = Session.CreateWindowDriver("DeleteMemberDialog");
dialog.FindById("NameInput").SendKeys("10003 Ing. Max Mustermann jun.");
dialog.FindById("ConfirmButton").Click();
memberListRows = memberList.FindElementsByClassName("DataGridRow"); memberListRows = memberList.FindElementsByClassName("DataGridRow");
Assert.That(memberListRows, Has.Count.EqualTo(0)); Assert.That(memberListRows, Has.Count.EqualTo(0));
} }
} }
} }

17
Tests/E2ETests/Setup.cs Normal file
View File

@ -0,0 +1,17 @@
namespace Tests.E2ETests {
[SetUpFixture]
public static class Setup {
private static WinAppDriver? Driver;
[OneTimeSetUp]
public static void SetupWinAppDriver() {
Driver = new();
}
[OneTimeTearDown]
public static void TeardownWinAppDriver() {
Driver?.Dispose();
}
}
}

View File

@ -1,110 +0,0 @@
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Windows;
using System.Diagnostics;
using System.Windows;
namespace Tests.E2ETests {
public class TestBase {
protected const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723";
//private const string ApplicationPath = @"..\..\Elwig\bin\Release\net8.0-windows\Elwig.exe";
private const string ApplicationPath = @"C:\Users\tom\source\repos\elwig\Elwig\bin\Release\net8.0-windows\Elwig.exe";
private const int WaitForAppLaunch = 3;
private const string WinAppDriverPath = @"C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe";
private static Process winAppDriverProcess;
public WindowsDriver<WindowsElement> AppSession { get; private set; }
public WindowsDriver<WindowsElement> DesktopSession { get; private set; }
private static void StartWinAppDriver() {
ProcessStartInfo psi = new(WinAppDriverPath) {
UseShellExecute = true,
//Verb = "runas" // run as administrator
};
//psi.EnvironmentVariables.Add("DX.UITESTINGENABLED", "1");
winAppDriverProcess = Process.Start(psi);
}
public void Setup() {
//StartWinAppDriver();
var appiumOptions = new AppiumOptions();
appiumOptions.AddAdditionalCapability("app", ApplicationPath);
appiumOptions.AddAdditionalCapability("deviceName", "WindowsPC");
appiumOptions.AddAdditionalCapability("ms:waitForAppLaunch", WaitForAppLaunch);
AppSession = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appiumOptions);
Assert.That(AppSession, Is.Not.Null);
Assert.That(AppSession.SessionId, Is.Not.Null);
AppSession.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1.5);
AppiumOptions desktopOptions = new AppiumOptions();
desktopOptions.AddAdditionalCapability("app", "Root");
desktopOptions.AddAdditionalCapability("deviceName", "WindowsPC");
DesktopSession = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), desktopOptions);
}
public void TearDown() {
// Close the AppSession
if (AppSession != null) {
CloseElwig();
AppSession.Quit();
AppSession = null;
}
// Close the DesktopSession
if (DesktopSession != null) {
DesktopSession.Close();
DesktopSession.Quit();
DesktopSession = null;
}
}
private void CloseElwig() {
try {
AppSession.Close();
string currentHandle = AppSession.CurrentWindowHandle;
DismissOpenWindowsDialog();
} catch { }
}
private void DismissOpenWindowsDialog() {
try {
DesktopSession.FindElementByName("Yes").Click();
} catch { }
}
protected static void StopWinappDriver() {
// Stop the WinAppDriverProcess
if (winAppDriverProcess != null) {
foreach (var process in Process.GetProcessesByName("WinAppDriver")) {
process.Kill();
}
}
}
protected WindowsDriver<WindowsElement> CreateWindowDriver(string windowName) {
var mainWindow = DesktopSession.FindElementByAccessibilityId(windowName);
var mainWindowHandle = mainWindow.GetAttribute("NativeWindowHandle");
mainWindowHandle = (int.Parse(mainWindowHandle)).ToString("x"); // Convert to Hex
var appiumOptions = new AppiumOptions();
appiumOptions.AddAdditionalCapability("appTopLevelWindow", mainWindowHandle);
return new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appiumOptions);
}
protected void ClickComboBoxByCount(WindowsDriver<WindowsElement> session, string accessibilityId, int count) {
var element = session.FindElementByAccessibilityId(accessibilityId);
element.Click();
for (int i = 0; i < count; i++) {
element.SendKeys(Keys.Down);
}
element.SendKeys(Keys.Enter);
}
protected void ClickComboBoxByText(WindowsDriver<WindowsElement> session, string accessibilityId, string text) {
var element = session.FindElementByAccessibilityId(accessibilityId);
element.Click();
element.SendKeys(text);
element.SendKeys(Keys.Enter);
}
}
}

27
Tests/E2ETests/Utils.cs Normal file
View File

@ -0,0 +1,27 @@
using OpenQA.Selenium;
using OpenQA.Selenium.Appium.Windows;
namespace Tests.E2ETests {
public static class Utils {
public const string ApplicationPath = @"..\..\..\..\Elwig\bin\Debug\net8.0-windows\Elwig.exe";
public static WindowsElement FindById(this WindowsDriver<WindowsElement> session, string accessibilityId) {
return session.FindElementByAccessibilityId(accessibilityId);
}
public static void SelectComboBoxItemByCount(this WindowsDriver<WindowsElement> session, string accessibilityId, int count) {
var element = session.FindElementByAccessibilityId(accessibilityId);
element.Click();
element.SendKeys(string.Concat(Enumerable.Repeat(Keys.Down, count)));
element.SendKeys(Keys.Enter);
}
public static void SelectComboBoxItemByText(this WindowsDriver<WindowsElement> session, string accessibilityId, string text) {
var element = session.FindElementByAccessibilityId(accessibilityId);
element.Click();
element.SendKeys(text);
element.SendKeys(Keys.Enter);
}
}
}

View File

@ -0,0 +1,27 @@
using System.Diagnostics;
namespace Tests.E2ETests {
public class WinAppDriver : IDisposable {
public const string WinAppDriverUrl = "http://127.0.0.1:4723";
private const string WinAppDriverPath = @"C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe";
private readonly Process WinAppDriverProcess;
public WinAppDriver() {
WinAppDriverProcess = Process.Start(new ProcessStartInfo(WinAppDriverPath) {
//UseShellExecute = true,
//Verb = "runas", // run as administrator
RedirectStandardInput = true,
EnvironmentVariables = {
// { "DX.UITESTINGENABLED", "1" },
}
})!;
}
public void Dispose() {
GC.SuppressFinalize(this);
WinAppDriverProcess.StandardInput.WriteLine("");
WinAppDriverProcess.Dispose();
}
}
}