首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flaui应用程序多次打开

Flaui应用程序多次打开
EN

Stack Overflow用户
提问于 2021-11-09 11:09:59
回答 1查看 184关注 0票数 1

我正在为我的应用程序做FlaUI测试,我在应用程序启动时遇到了一个问题。基类中的步骤看起来像应用程序启动,等待打开,最大化窗口,等待控件改变状态,然后它应该进入测试执行。但不是这样,应用程序再启动两次,然后正确地开始测试执行。我不能定位哪里是问题所在。您是否有任何想法或类似的问题,并知道如何解决它?下面是我的基类代码:

代码语言:javascript
复制
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();
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-11-10 16:07:41

只需检查和丢弃选项:在第一行的UiTestsFixture()构造函数中添加:

代码语言:javascript
复制
System.Diagnostics.StackTrace t = new System.Diagnostics.StackTrace();
Console.WriteLine("Constructor" + t.ToString());

最后:

代码语言:javascript
复制
Console.WriteLine("Constructor end");

还要检查cmd打开它是否也会打开应用程序3次(win + r和"cmd",回车),输入C:....\Debug\App.Shell.exe

操作:

感谢你的建议,我注意到我在测试中错误地使用了构造函数。感谢您的帮助:)

( From Gitter Thread)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69897072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档