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

Bra*_*ick 5 c# xamarin xamarin.uitest

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

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

Jun*_*une 10

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

最好的办法

使用WaitForElementAPI.

例如,我在这里等待名为"imageButton"的Button.

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

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

其他方式

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

Thread.Sleep(8000);

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

using System.Threading;

希望这可以帮助!


Ken*_*een 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.UITest具有IApp.WaitForElementIApp.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));
Run Code Online (Sandbox Code Playgroud)

如果该元素仅花费30秒来加载,则在此示例中,该元素app.WaitForElement将在30秒后继续运行,如果在等待整整90秒后仍未出现该元素,它将仅引发错误“找不到myButton”。

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

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

这是上述查询的最简单的可能形式,使用默认超时和默认错误消息“等待元素...超时”:

    app.WaitForElement (x => x.Marked ("myButton"));
Run Code Online (Sandbox Code Playgroud)


小智 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
    }
}
Run Code Online (Sandbox Code Playgroud)