4

我是使用 FLAUI 和自动化测试的新手,想用它来测试我的系统。目前我正在使用 Thread.Sleep() 等待应用程序启动,然后找到登录文本框。有没有比使用 Thread.Sleep() 更有效的方法来做到这一点?

目前我启动应用程序并使用 Thread.sleep(10000) 等到应用程序完全启动并且在单击控件输入密码进入应用程序之前可以找到登录文本框。但是我知道 Thread.Sleep 是告诉系统等待的最糟糕的方法,尤其是在自动化测试中。谁能提供我可以测试的任何其他东西?

4

4 回答 4

4

最好使用重试机制并等到主窗口加载并且控件可见。例如,在调用 Application.Launch 后,您最多可以重试 30 秒以找到主窗口,并在其中输入 txtLogin:

        Retry.WhileException(() =>
        {
            using (var automation = new UIA3Automation())
            {
                Window mainWindow = Application.GetMainWindow(automation, TimeSpan.FromSeconds(60));

                Assert.IsNotNull(Mainwindow, "Main window is not found");

                TextBox loginTextBox = mainWindow.FindFirstDescendant(x => x.ByAutomationId("txtLogin")).AsTextBox();

                Assert.IsNotNull(loginTextBox, "txtLogin is not found");
            }

        }, TimeSpan.FromSeconds(30), null, true);
于 2018-08-02T11:33:34.587 回答
2

这个问题已经有了很好的答案,但我找到了另一种方法来等待任何元素(包括主窗口)使用FlaUI.Core.Tools.Retry类中的 Retry 类

[TestFixture]
public class SmokeTests
{
    private Application _theApp;
    private UIA3Automation _automation;
    private Window _mainWindow;
    private const int BigWaitTimeout = 3000;
    private const int SmallWaitTimeout = 1000;

    [SetUp]
    public void Setup()
    {
        _theApp = FlaUI.Core.Application.Launch(new ProcessStartInfo("YOUR_APPLICATION.exe", "/quickStart"));
        _automation = new UIA3Automation();
        _mainWindow = _theApp.GetMainWindow(_automation);
    }

    [TearDown]
    public void Teardown()
    {
        _automation?.Dispose();
        _theApp?.Close();
    }

    [Test]
    public void Foo()
    {
        // This will wait until the element is available, or timeout passed
        var examplesWrapPanel = WaitForElement(() => _mainWindow.FindFirstDescendant(cf => cf.ByAutomationId("ExamplesWrapPanel")));

        // This will wait for the child element or timeout 
        var exampleButton = WaitForElement(() => examplesWrapPanel?.FindFirstDescendant(cf => cf.ByAutomationId("Another Automation Id")).AsButton());

        // Do something with your elements 
        exampleButton?.WaitUntilClickable();
        exampleButton?.Invoke();
    }

    private T WaitForElement<T>(Func<T> getter)
    {
        var retry = Retry.WhileNull<T>(
            () => getter(),
            TimeSpan.FromMilliseconds(BigWaitTimeout));

        if (!retry.Success)
        {
            Assert.Fail("Failed to get an element within a wait timeout");
        }

        return retry.Result;
    }
}

}

于 2019-11-09T14:54:13.450 回答
0
private void RunProc()
{
Process.Start("exeName");
}


public async Task StartProcessAsync()
{
var result= await Task.Run(()=>RunProc());
//optional
Task.Delay(new TimeSpan.FromSeconds(5));
}
于 2018-06-28T20:23:58.807 回答
-1

你试过这个解决方案吗?

public static void LaunchApplication(string exePath, string arguments, bool waitForExit, bool waitForStart, int waitForStartTimeout)
    {
        ProcessStartInfo thisProcessInfo = new ProcessStartInfo();
        thisProcessInfo.CreateNoWindow = true;
        thisProcessInfo.UseShellExecute = false;
        thisProcessInfo.RedirectStandardOutput = false;
        thisProcessInfo.FileName = exePath;
        thisProcessInfo.Arguments = arguments;
        using(Process thisProcess = Process.Start(thisProcessInfo))
        {
            if(waitForStart)
                thisProcess.WaitForInputIdle(waitForStartTimeout);
            if(waitForExit)
                thisProcess.WaitForExit();
        }
    }
于 2018-06-25T14:45:47.287 回答