I'm working on FlaUI tests for my app and I have an issue with application launch. The steps in base class looks like application starts, wait for open, maximize window, wait for control to change status and then it should go to test execution. But instead of it, application launch 2 more times and then start tests execution correctly. I can't localize where is a problem. Do you have any idea or had similar issue and know how to solve it? Here is my base class code:
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using UI.Tests.Utilities;
using FlaUI.Core.AutomationElements;
using FlaUI.Core.Conditions;
using FlaUI.Core.Definitions;
using FlaUI.Core.Tools;
using FlaUI.UIA3;
using Application = FlaUI.Core.Application;
namespace UI.Tests
{
public class UiTestsFixture: IDisposable
{
public Application Application;
public AutomationElement Desktop { get; }
public ConditionFactory ConditionFactory { get; }
public const string ApplicationName = "App.Shell";
public UiTestsFixture()
{
ConditionFactory = new ConditionFactory(new UIA3PropertyLibrary());
UIA3Automation automation = new UIA3Automation();
var configuration = "Debug";
var mainWindowTitle = "App (DEBUG 32-bit)";
var loadingWindowTitle = "Opening - App";
var applicationExecutablePath = GetApplicationExecutablePath(configuration);
GetApplication(applicationExecutablePath);
Desktop = automation.GetDesktop();
GetApplicationWindow(loadingWindowTitle);
WaitForMainPageToAppear(mainWindowTitle);
WaitForOOServiceAndMaximizeWindow();
}
private string GetApplicationExecutablePath(string configuration)
{
var solutionDirectory = Directory.GetParent(Directory.GetCurrentDirectory())
?.Parent
?.Parent
?.Parent
?.FullName;
var applicationDirectory = Path.Combine(solutionDirectory, $@"App.Shell\bin\x86\{configuration}");
var applicationPath = Path.Combine(applicationDirectory, $"{ApplicationName}.exe");
return applicationPath;
}
private void GetApplication(string applicationExecutablePath)
{
PreventOpenMoreThenOneWindowApplication();
Application = Application.Launch(applicationExecutablePath);
if (Application is null)
{
throw new ApplicationException("application can't be null!");
}
}
private void PreventOpenMoreThenOneWindowApplication()
{
var processes = Process.GetProcessesByName(ApplicationName);
foreach (var process in processes)
{
process.Kill();
}
}
private void GetApplicationWindow(string loadingWindowTitle)
{
if (Desktop is null)
{
throw new ArgumentNullException(nameof(Desktop), "Window can't be null!");
}
}
private void WaitForMainPageToAppear(string mainWindowTitle)
{
Retry.Find(() => Desktop.FindFirstDescendant(ConditionFactory.ByClassName("ServiceStatusTopMenuItemControl")),
new RetrySettings
{
Timeout = TimeSpan.FromSeconds(30),
Interval = TimeSpan.FromSeconds(5)
});
}
private void WaitForOOServiceAndMaximizeWindow()
{
Desktop.FindFirstDescendant(ConditionFactory.ByAutomationId("PART_Max")).AsButton().Click();
while (!Desktop.FindFirstDescendant(ConditionFactory.ByClassName("StateIndicatorControl")).HelpText.Contains("Service is running"))
{
Thread.Sleep(2000);
}
Desktop.FindFirstDescendant(ConditionFactory.ByAutomationId("NotificationCloseBtn")).AsButton().Click();
}
public void Dispose()
{
Application.Dispose();
}
}
}