我有一个用C#/ Xamarin编写的UITest,测试执行得太快,导致它失败。在执行下一步之前,我需要测试等待图像出现在屏幕上。
如何暂停Xamarin UITest并使其等待图像在屏幕上加载,然后再继续下一步?
答案 0 :(得分:10)
根据我的经验,有几种方法可以暂停或放慢Xamarin.UITest。
使用WaitForElement
API。
例如,我在这里等待名为“imageButton”的Button。
app.WaitForElement(x => x.Marked("imageButton"));
上面的示例在执行另一个步骤之前等待元素“imageButton”出现。
如果您不知道要与哪个元素进行交互,或者只是想暂停Xamarin.UITest,则可以使用Thread.Sleep
:
Thread.Sleep(8000);
在这里,我暂停了Xamarin.UITest 8秒。请务必注意,您需要添加此库才能使用Thread.Sleep
:
using System.Threading;
希望这有帮助!
答案 1 :(得分:5)
你问:
"如何暂停Xamarin.UITest并让它等待图像在屏幕上加载,然后继续下一步?"
可能使用Thread.Sleep()
之类的东西暂停Xamarin.UITest,无论你需要多长时间。但是,问题在于Thread.Sleep ()
以不明智的方式冻结测试运行。例如,如果设置Thread.Sleep (10000)
,则线程将暂停10秒钟,无论您的应用程序实际加载所需元素的时间长短。
如果您的照片只需要1秒钟就可以加载更快的设备,那么使用Thread.Sleep(10000)
您的测试仍将始终至少 10秒。更糟糕的是,如果你使用这种方法并且不长Thread.Sleep
,测试仍然会失败;所以你必须强迫你的测试运行速度和你最糟糕的情况一样慢#34;每一次。更多信息:Thread.Sleep
documentation
Xamarin.UITest
有IApp.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秒后继续,它只会抛出错误"找不到myButton"如果在等待整整90秒后元素仍然没有出现。
您也可以使用这些API调用中的任何一个而不定义超时长度,在这种情况下,对于本地UITests,它们将在15秒后超时,或者如果在Xamarin Test Cloud中运行,则将在1分钟后超时。资料来源:Xamarin.UITest "Timeouts & Waiting" guide
这是上述查询中最简单的形式,使用默认超时和&默认错误消息"等待元素超时...":
app.WaitForElement (x => x.Marked ("myButton"));
答案 2 :(得分:2)
如果您不等待特定的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
}
}