6

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

如何暂停 Xamarin UITest 并使其等待图像加载到屏幕上,然后再继续下一步?

4

3 回答 3

11

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

最好的办法

使用WaitForElementAPI。

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

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

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

另一种方式

如果您不知道要与之交互的元素,或者您只是想暂停 Xamarin.UITest,您可以使用Thread.Sleep

Thread.Sleep(8000);

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

using System.Threading;

希望这可以帮助!

于 2016-12-08T22:50:25.150 回答
8

“暂停” UITest 的问题

您问:

“如何暂停 Xamarin.UITest 并让它等待图像加载到屏幕上,然后再继续下一步?”

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

如果您的图片在速度更快的设备上加载只需 1 秒,那么使用Thread.Sleep(10000)您的测试仍然至少需要10 秒。更糟糕的是,如果您使用这种方法并且Thread.Sleep时间不够长,测试仍然会失败;所以你必须强迫你的测试每次都像你的“最坏情况”一样慢。更多信息:Thread.Sleep文档

通过等待 UI 元素而不“暂停”执行的解决方案

Xamarin.UITestIApp.WaitForElementIApp.WaitForNoElement API 来处理这些场景。这些 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 秒后继续,如果在等待整整 90 秒后元素仍未出现,它只会抛出错误“Could not find myButton”。

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

您还可以使用这些 API 调用中的任何一个而不定义超时长度,在这种情况下,对于本地 UITest,它们将在 15 秒后超时,或者如果在 Xamarin 测试云中运行,则会在 1 分钟后超时。来源:Xamarin.UITest“超时和等待”指南

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

    app.WaitForElement (x => x.Marked ("myButton"));
于 2017-01-06T18:39:37.297 回答
5

如果您不等待特定的 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
    }
}
于 2018-07-09T19:22:17.547 回答