Доступ к элементам управления пользовательского интерфейса проекта WPF из проекта Unit Test после завершения загрузки индикатора выполнения - PullRequest
3 голосов
/ 13 января 2020

У меня есть приложение WPF, и я пытаюсь автоматизировать тестирование пользовательского интерфейса. Я использую FlaUI для этого. Я также использую NUnit в качестве основы тестирования. Мое приложение использует DevExpress элементы управления, и в настоящее время я сталкиваюсь с проблемой, из-за которой я не могу проверить Visibility of my progress bar из моего приложения Unit Test. Используя FlaUI, я могу launch приложению и получить дескриптор Window, но приложению требуется некоторое время для установки visibility UI elements. Поскольку загрузка пользовательского интерфейса занимает много времени, и она управляется индикатором выполнения, я ищу механизм, в котором мой тестовый проект мог бы проверить, видимость индикатора выполнения находится на changed, а затем go вперед и выполнить тестовые примеры. Вот элемент управления XAML из проекта WPF

    <ProgressBar AutomationProperties.AutomationId="showProgress"
        Grid.Row="1"
        Height="4"
        Margin="0"
        BorderThickness="0"
        IsIndeterminate="True"
        IsTabStop="False"
        ToolTip="Contacting Server, Please Wait..."
        Visibility="{Binding IsServerActive, Converter={StaticResource MwBoolToVisibilityConverterReverse}}" />

    <views1:VoyageEditorControl Grid.Row="2" Grid.Column="0" />

Здесь ниже приведен код из моей Nunit framework

[TestFixture(AutomationType.UIA3)]
    public class UnitTest1 : FlaUITestBase
    {


        public AutomationType AutomationType { get; }

        protected override ApplicationStartMode ApplicationStartMode => ApplicationStartMode.OncePerFixture;

        public UnitTest1(AutomationType automationType)
        {
            AutomationType = automationType;
        }

        protected override AutomationBase GetAutomation()
        {
            return UtilityMethods.GetAutomation(AutomationType);
        }

        protected override Application StartApplication()
        {
            string executableLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            string projectPath = executableLocation.Replace("BP.GIS.Synergy.ShipTracker.UITests", "BP.GIS.Synergy.ShipTracker");

            string exeLocation = Path.Combine(projectPath, "BP.GIS.Synergy.ShipTracker.exe");

            var app= Application.Launch(exeLocation);
            app.WaitWhileMainHandleIsMissing();
            return app;

        }
 #region Test cases      


        [Test]
        public void getAppHandleFirst()
        {
            //  Thread.Sleep(10000);


            var mainWindow = Application.GetMainWindow(Automation);

            var elementName = mainWindow.FindFirstDescendant(cf => cf.ByAutomationId("AvailableViews")).AsComboBox();

            Assert.That(elementName.IsEnabled, Is.True);
            Action action = () => elementName.Click();

            RetryResults retryResult = Retry.While(action, TimeSpan.FromSeconds(1));
            bool isCompletedSuccessfully = retryResult.IsCompletedSuccessfully;

        }

        [Test]
        public void checkAppLoadProgress()
        {
            var mainWindow = Application.GetMainWindow(Automation);
            var elementName = mainWindow.FindFirstDescendant(cf => cf.ByAutomationId("showProgress")).AsProgressBar();

        }

Короче говоря, метод getAppHandleFirst() и другие должен начинать выполнение только после того, как индикатор прогресса исчезнет с экрана.

...