我的环境:Xcode:7.2.1 模拟器:iOS iPad Air 9.1 葫芦:0.17.1
目前,在我的应用程序后台操作时,我的iOS应用程序问题没有正确触摸按钮。以下是问题发生的一般黄瓜步骤:
When I send the app to the background for 2 seconds
And I skip logging in to MyApp
And I wait and wait
And I should see "Speed"
And I wait for 10 seconds
And I touch "Speed"
以下是将应用程序发送到后台步骤的代码:
Given /^I send the app to the background for ([\d\.]+) second(?:s)?$/ do |num_seconds|
num_seconds = num_seconds.to_f
send_app_to_background(num_seconds)
end
基本上,只有在我将应用程序发送到后台后,触摸才会出现障碍。如果我采取这一步骤,Calabash会像预期的那样触摸按钮。我包括了它看到“速度”的步骤,只是为了确保Calabash能够实际看到按钮,它可以,因为它为该步骤变为绿色,以及等待步骤。但是在触摸“速度”时,Calabash进入一个不断尝试触摸它的状态,但由于它没有,它会无限期地挂在那个步骤上。我怀疑这可能是一个Calabash或UIAutomation错误(https://github.com/calabash/calabash-ios/issues/836),因为一切都按预期工作,直到或除非我将我的应用程序发送到后台,但我想100%肯定,以防我正在做我没有看到的错误。
有没有人对这个问题有什么想法?
更新:
根据https://groups.google.com/forum/#!topic/calabash-ios/NZAmTp6ckrk,将应用程序发送到后台仍未实现,当我检查send_app_to_background的代码时,它看起来确实如此:
def send_app_to_background(secs)
raise 'Not implemented when running without instruments / UIA'
end
有没有人有办法解决这个问题呢?在物理设备上运行它不是我的选择,它必须使用模拟器完成。
更新
关注https://github.com/calabash/calabash-ios/issues/556后,我更改了将应用程序发送到后台代码以遵循解决方法:
Given /^I send the app to the background for ([\d\.]+) second(?:s)?$/ do |num_seconds|
num_seconds = num_seconds.to_f
uia_send_app_to_background(num_seconds)
end
uia_send_app_to_background的实现是:
def uia_send_app_to_background(secs)
#uia_handle_command(:deactivate, secs)
#Temporary workaround: https://github.com/calabash/calabash-ios/issues/556
js_deactivate = %Q[var x = target.deactivateAppForDuration(#{secs}); var MAX_RETRY=5, retry_count = 0; while (!x && retry_count < MAX_RETRY) { x = target.deactivateAppForDuration(#{secs}); retry_count += 1}; x]
uia(js_deactivate)
end
然而,对我来说,这种解决方法似乎不起作用。应用程序被推送到后台,但永远不会回到前台。当我在等待几分钟后停止irb中的那一步时,我收到了这个错误:
When I send the app to the background for 2 seconds # features/step_definitions/common.rb:91
Could not parse response ''; the app has probably crashed (RuntimeError)
./features/step_definitions/common.rb:93:in `/^I send the app to the background for ([\d\.]+) second(?:s)?$/'
features/display_mapping_units_from_2630.feature:216:in `When I send the app to the background for 2 seconds'
更新
我尝试了这些解决方法步骤,但是在后台操作后触摸仍然不起作用,我也在8.4模拟器上尝试了这个,它也不起作用,这让我怀疑更多是需要的Xcode 7+问题待解决:
When(/^I background the app$/) do
open_app_via_simctl("com.apple.mobilesafari")
sleep(2)
end
When(/^I launch the app$/) do
open_app_via_simctl("com.me.MyApp-cal")
sleep(2)
end
步骤:
And I background the app
And I wait
And I launch the app
And I wait
And I should see "Button1"
And I wait for 10 seconds
And I touch "Button1"
Calabash成功地看到了Button1,但是当它试图触摸Button1时,在9.1模拟器中,Calabash无限期挂起,试图找到按钮,在8.4模拟器中,我立刻得到一个错误,Calabash无法找到视图“Button1的”。
答案 0 :(得分:2)
问题#836于11月修复。 2013年的谷歌论坛帖子和#556号是从2014年开始的。比几个月前的任何事情都应该受到怀疑。
请勿致电uia_send_app_to_background
,该API已被破坏(由Apple提供)。通常坚持使用非UIA API(除非绝对必要,否则不要调用uia_ *方法)。
将Calabash更新为最新发布的版本(截至今天为0.18.1)并再次尝试测试。
$ be calabash-ios console
> start_test_server_in_background
# Can touch before background
> touch("view marked:'my view'")
> send_app_to_background(1)
# Can touch after resuming from background
> touch("view marked:'my view'")
以下解决方案不起作用。如果您打开另一个应用,您的应用将转到后台。但是,如果您使用simctl打开应用程序,则仪器将不再与应用程序建立连接,并且手势将失败。
When(/^I background the app$/) do
open_app_via_simctl("com.apple.mobilesafari")
sleep(2)
end
When(/^I launch the app$/) do
open_app_via_simctl("com.me.MyApp-cal")
sleep(2)
end