Xamarin.UITest: 如何暂停测试步骤

Xamarin.UITest: How To Pause a Test Step

我有一个用 C#/Xamarin 编写的 UITest,但测试执行得太快,导致失败。我需要测试在执行下一步之前等待图像出现在屏幕上。

如何暂停 Xamarin UITest 并使其在继续下一步之前等待图像加载到屏幕上?

根据我的经验,有几种方法可以暂停或放慢速度 Xamarin.UITest。

最佳方式

使用 WaitForElement API.

例如,我在这里等待一个名为“imageButton”的按钮。

app.WaitForElement(x => x.Marked("imageButton"));

上面的示例在执行另一个步骤之前等待元素“imageButton”出现。

另一种方式

如果您不知道要与哪个元素交互或只想暂停 Xamarin.UITest,您可以使用 Thread.Sleep:

Thread.Sleep(8000);

在这里,我暂停 Xamarin.UITest 8 秒。请务必注意,您需要添加此库才能使用 Thread.Sleep:

using System.Threading;

希望对您有所帮助!

"pausing"的问题UI测试

您问的是:

"How can I pause the Xamarin.UITest and make it wait for an Image to load on the screen before continuing to the next step?"

可以使用Thread.Sleep()之类的方法暂停Xamarin.UITest,无论您需要多长时间。但是,这样做的问题是 Thread.Sleep () 不灵活地冻结了测试 运行。例如,如果您设置 Thread.Sleep (10000),那么线程将恰好暂停 10 秒,而不管您的应用实际需要多长时间来加载所需的元素。

如果您的图片在更快的设备上加载只需要 1 秒,那么使用 Thread.Sleep(10000) 您的测试仍然总是需要 至少 10 秒。更糟糕的是,如果您使用这种方法并且 Thread.Sleep 时间不够长,测试仍然会失败;所以你必须每次都强制你的测试运行和你的"worst case scenario"一样慢。更多信息:Thread.Sleep documentation

等待 UI 元素而不 "pausing" 执行的解决方案

Xamarin.UITestIApp.WaitForElement & IApp.WaitForNoElement API 来处理这些情况。这些 API 优于 Thread.Sleep,因为您可以自定义它恢复的条件,而不仅仅是等待一段设定的时间。

例子

此代码段示例将等待 90 秒,以便出现标记为或 ID 为 "myButton."

的元素
    // Wait up to 90 seconds for myButton to appear             
    app.WaitForElement(c=>c.Marked("myButton"), "Could not find myButton", new TimeSpan(0,0,0,90,0));

如果元素只需要 30 秒加载,那么在这个例子中 app.WaitForElement 将在 30 秒后继续,它只会抛出错误 "Could not find myButton" 如果元素等待整整 90 秒仍然没有出现。

使用默认超时和错误消息的简单查询

您也可以使用这些 API 调用中的任何一个而不定义超时长度,在这种情况下,对于本地 UI 测试,它们将在 15 秒后超时,或者如果 运行 在Xamarin Test Cloud 将在 1 分钟后超时。资料来源:Xamarin.UITest "Timeouts & Waiting" guide

这是上述查询的最简单形式,使用默认超时和默认错误消息 "Timed out waiting for element...":

    app.WaitForElement (x => x.Marked ("myButton"));

如果您不等待特定的 UI 元素并且不想休眠当前线程,则此解决方案有效:

public static void WaitForTimeSpan(IApp app, TimeSpan timeSpan)
{
    try
    {
        app.WaitForElement(c => c.Text("BLAH BLAH BLAH"), "Waiting for something, killing time", timeSpan);
    }
    catch (Exception)
    {
        //do nothing we just wanted to kill some time
    }
}