2013-03-12 36 views
3

我注意到,当网络速度很慢时,我的所有UI测试失败。例如,用户会尝试登录,然后下一个屏幕的加载速度不够快,以使另一个UIElement出现在屏幕上。如何处理与UIAutomation的慢速网络连接

如何在不使用延迟()的情况下处理较慢的网络连接?

回答

0

你绝对应该看看多线程。在处理网络连接时,您应该应该在辅助线程中完成所有这些处理。如果没有,主线程将被阻止,应用程序将无法响应用户。

多线程是一个非常大的主题。我建议你为此开始寻找Apple's reference。你也可以参考a great course on iTunes U(讲座11)。

如果你只是想给它一个镜头,这里的实际代码(类似),你将需要:

dispatch_queue_t newQueue = dispatch_queue_create("networkQueue", NULL); 

dispatch_async(newQueue, ^{ 

// here you need to call the networking processes 

    dispatch_async(dispatch_get_main_queue(), ^{ 

    // if you need to update your UI, you need to get back to the main queue. 
    // This block will be executed in your main queue. 

    }); 
}); 
+1

是啊,我相当好与GCD熟悉,我们做实现后台线程所有的网络电话,然而,问题在于我的自动化代码正在屏幕上寻找UIElement,并且目前尚未显示。 举一个例子,说你要加载一个充满文本的屏幕,但你有一个微调,直到文本加载。我希望我的自动化代码能够等待文本加载,但我不想使用target.delay() – codeRefiner 2013-03-12 20:45:06

+0

可以使用什么来代替target.delay()?它似乎阻止了应用程序的主线程。 – 2015-01-08 19:34:31

+0

@maremmle我知道这已经有一段时间了,但我只是发布了一个新的答案,解释了我们如何等待UIAutomation测试中的网络/其他后台任务以防万一。 – lekksi 2015-10-08 19:08:42

0

的唯一途径,我知道正在使用的延迟。从互联网上加载东西时,我通常会有一个活动指示器。所以,我想补充的延迟而活动指示灯显示

while (activityIndicator.isVisible()) 
{ 
    UIALogger.logMessage("Loading"); 
    UIATarget.localTarget().delay(1); 
} 
0

退房在UIATargetpushTimeoutpopTimeout方法。你可以找到文档here

这里是我们的iOS应用UIAutomation测试一个代码示例:

// Tap "Post" button, which starts a network request 
 
mainWindow.buttons()["post.button.post"].tap(); 
 
    
 
// Wait for maximum of 30 seconds to "OKAY" button to be valid 
 
target.pushTimeout(30); 
 

 
// Tap the button which is shown from the network request success callback 
 
mainWindow.buttons()["dialog.button.okay"].tap(); 
 

 
// End the wait scope 
 
target.popTimeout();