calabash-cucumber 0.16.4 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/calabash-ios-generate.rb +61 -10
- data/dylibs/libCalabashDyn.dylib +0 -0
- data/dylibs/libCalabashDynSim.dylib +0 -0
- data/features-skeleton/sample.feature +7 -0
- data/features-skeleton/steps/sample_steps.rb +45 -0
- data/features-skeleton/support/01_launch.rb +31 -33
- data/features-skeleton/support/dry_run.rb +2 -0
- data/features-skeleton/support/env.rb +1 -0
- data/features-skeleton/support/patches/cucumber.rb +15 -0
- data/lib/calabash-cucumber.rb +4 -0
- data/lib/calabash-cucumber/actions/instruments_actions.rb +0 -5
- data/lib/calabash-cucumber/actions/playback_actions.rb +1 -6
- data/lib/calabash-cucumber/connection_helpers.rb +50 -1
- data/lib/calabash-cucumber/core.rb +94 -72
- data/lib/calabash-cucumber/dot_dir.rb +18 -0
- data/lib/calabash-cucumber/launch/simulator_launcher.rb +35 -3
- data/lib/calabash-cucumber/launcher.rb +46 -99
- data/lib/calabash-cucumber/logging.rb +79 -0
- data/lib/calabash-cucumber/playback_helpers.rb +2 -2
- data/lib/calabash-cucumber/store/preferences.rb +223 -0
- data/lib/calabash-cucumber/uia.rb +0 -43
- data/lib/calabash-cucumber/usage_tracker.rb +192 -0
- data/lib/calabash-cucumber/version.rb +2 -2
- data/lib/calabash-cucumber/wait_helpers.rb +32 -0
- data/scripts/.irbrc +19 -4
- data/staticlib/calabash.framework.zip +0 -0
- data/staticlib/libFrankCalabash.a +0 -0
- metadata +31 -19
- data/features-skeleton/my_first.feature +0 -12
- data/features-skeleton/step_definitions/calabash_steps.rb +0 -1
- data/features-skeleton/step_definitions/my_first_steps.rb +0 -4
- data/features-skeleton/support/02_pre_stop_hooks.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21ca53be02da9a57cb4baffd965a8ce32d959a80
|
4
|
+
data.tar.gz: 30ff3a6acafdca9a4d45b5855418e37d122a0cc0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b20587099e1b708a242899de712604b6e675768a453a09f91ba5f5dd4b4a4e088c72343ff6577b40a945c9eaca58fd3ef54af5a2711af20c16090844ae353629
|
7
|
+
data.tar.gz: 2b532a1873a5b4a56c141b363b0e9acb46b6012b228fe34f19afb78ab40066444df869ced45d35ffd300e5b90e604729ded46827441546cc6bf79b3a1a8d9d82
|
@@ -2,22 +2,73 @@
|
|
2
2
|
def calabash_scaffold
|
3
3
|
if File.exists?(@features_dir)
|
4
4
|
puts "A features directory already exists. Stopping..."
|
5
|
-
#puts "Run calabash-ios update for update instructions."
|
6
5
|
exit 1
|
7
6
|
end
|
7
|
+
|
8
8
|
msg("Question") do
|
9
|
-
puts "I'm about to create a
|
10
|
-
puts "
|
11
|
-
puts "
|
9
|
+
puts "I'm about to create a features directory here:"
|
10
|
+
puts ""
|
11
|
+
puts "#{ENV["PWD"]}/features"
|
12
|
+
puts ""
|
13
|
+
puts "This directory will contain all of your calabash tests."
|
14
|
+
puts "Shall I proceed? (Y/n)"
|
12
15
|
end
|
13
|
-
exit 2 unless STDIN.gets.chomp == ''
|
14
16
|
|
15
|
-
|
17
|
+
response = STDIN.gets.chomp.downcase
|
18
|
+
proceed = response == "" || response == "y"
|
19
|
+
|
20
|
+
puts ""
|
16
21
|
|
17
|
-
|
18
|
-
puts "
|
19
|
-
|
20
|
-
|
22
|
+
if !proceed
|
23
|
+
puts "Skipping installation of features/ directory"
|
24
|
+
else
|
25
|
+
FileUtils.cp_r(@source_dir, @features_dir)
|
26
|
+
puts "Created: #{ENV["PWD"]}/features"
|
27
|
+
puts ""
|
21
28
|
end
|
22
29
|
|
30
|
+
gemfile = File.join(ENV["PWD"], "Gemfile")
|
31
|
+
|
32
|
+
version = Calabash::Cucumber::VERSION
|
33
|
+
gemline = "gem \"calabash-cucumber\", \">= #{version}\", \"< 2.0\"\n"
|
34
|
+
|
35
|
+
if File.exist?(gemfile)
|
36
|
+
printf "Found a Gemfile..."
|
37
|
+
contents = File.read(gemfile).force_encoding('utf-8')
|
38
|
+
if contents[/calabash-cucumber/, 0]
|
39
|
+
puts "and it contains calabash-cucumber!"
|
40
|
+
puts ""
|
41
|
+
else
|
42
|
+
puts "but it doesn't contain calabash-cucumber!"
|
43
|
+
puts "You'll have to add it yourself"
|
44
|
+
puts ""
|
45
|
+
puts "> #{gemline}"
|
46
|
+
puts ""
|
47
|
+
end
|
48
|
+
else
|
49
|
+
msg("Question") do
|
50
|
+
puts "I want to create a Gemfile for you."
|
51
|
+
puts "Shall I proceed? (Y/n)"
|
52
|
+
|
53
|
+
response = STDIN.gets.chomp.downcase
|
54
|
+
proceed = response == "" || response == "y"
|
55
|
+
|
56
|
+
puts ""
|
57
|
+
|
58
|
+
if !proceed
|
59
|
+
puts "Skipping installation of Gemfile"
|
60
|
+
else
|
61
|
+
File.open(gemfile, "w") do |file|
|
62
|
+
file.write("source \"https://rubygems.org\"\n")
|
63
|
+
file.write("\n")
|
64
|
+
file.write(gemline)
|
65
|
+
file.write("\n")
|
66
|
+
end
|
67
|
+
puts "Created: #{gemfile}"
|
68
|
+
puts""
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
puts "My work is done here."
|
23
73
|
end
|
74
|
+
|
data/dylibs/libCalabashDyn.dylib
CHANGED
Binary file
|
Binary file
|
@@ -0,0 +1,45 @@
|
|
1
|
+
Given(/^the app has launched$/) do
|
2
|
+
wait_for do
|
3
|
+
!query("*").empty?
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
And(/^I have done a specific thing$/) do
|
8
|
+
# Example: Given I am logged in
|
9
|
+
# wait_for do
|
10
|
+
# !query("* marked:'username'").empty?
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# touch("* marked:'username'")
|
14
|
+
# wait_for_keyboard
|
15
|
+
# keyboard_enter_text("cleveruser27")
|
16
|
+
#
|
17
|
+
# touch("* marked:'password'")
|
18
|
+
# wait_for_keyboard
|
19
|
+
# keyboard_enter_text("pa$$w0rd")
|
20
|
+
#
|
21
|
+
# wait_for_element_exists("* marked:'Login'")
|
22
|
+
# touch("* marked:'Login'")
|
23
|
+
|
24
|
+
# Remember: any Ruby is allowed in your step definitions
|
25
|
+
did_something = true
|
26
|
+
|
27
|
+
unless did_something
|
28
|
+
fail 'Expected to have done something'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
When(/^I do something$/) do
|
33
|
+
# Example: When I create a new entry
|
34
|
+
# tap("* marked:'new_entry'")
|
35
|
+
# wait_for_keyboard
|
36
|
+
# keyboard_enter_text("* marked:'entry_title'", 'My Entry')
|
37
|
+
#
|
38
|
+
# tap("* marked:'submit'")
|
39
|
+
end
|
40
|
+
|
41
|
+
Then(/^something should happen$/) do
|
42
|
+
# Example: Then I should see the entry on my home page
|
43
|
+
# wait_for_element_exists("* text:'My Entry'")
|
44
|
+
end
|
45
|
+
|
@@ -1,46 +1,44 @@
|
|
1
|
-
########################################
|
2
|
-
# #
|
3
|
-
# Important Note #
|
4
|
-
# #
|
5
|
-
# When running calabash-ios tests at #
|
6
|
-
# www.xamarin.com/test-cloud #
|
7
|
-
# the methods invoked by #
|
8
|
-
# CalabashLauncher are overridden. #
|
9
|
-
# It will automatically ensure #
|
10
|
-
# running on device, installing apps #
|
11
|
-
# etc. #
|
12
|
-
# #
|
13
|
-
########################################
|
14
|
-
|
15
1
|
require 'calabash-cucumber/launcher'
|
16
2
|
|
3
|
+
# You can find examples of more complicated launch hooks in these
|
4
|
+
# two repositories:
|
5
|
+
#
|
6
|
+
# https://github.com/calabash/ios-smoke-test-app/blob/master/CalSmokeApp/features/support/01_launch.rb
|
7
|
+
# https://github.com/calabash/ios-webview-test-app/blob/master/CalWebViewApp/features/support/01_launch.rb
|
17
8
|
|
18
|
-
|
19
|
-
|
20
|
-
# However the recommended approach is to let Calabash find the app itself
|
21
|
-
# or set the environment variable APP_BUNDLE_PATH
|
9
|
+
module Calabash::Launcher
|
10
|
+
@@launcher = nil
|
22
11
|
|
12
|
+
def self.launcher
|
13
|
+
@@launcher ||= Calabash::Cucumber::Launcher.new
|
14
|
+
end
|
23
15
|
|
24
|
-
|
25
|
-
|
26
|
-
unless @calabash_launcher.calabash_no_launch?
|
27
|
-
@calabash_launcher.relaunch
|
28
|
-
@calabash_launcher.calabash_notify(self)
|
16
|
+
def self.launcher=(launcher)
|
17
|
+
@@launcher = launcher
|
29
18
|
end
|
30
19
|
end
|
31
20
|
|
21
|
+
Before do |scenario|
|
22
|
+
launcher = Calabash::Launcher.launcher
|
23
|
+
options = {
|
24
|
+
# Add launch options here.
|
25
|
+
}
|
26
|
+
|
27
|
+
launcher.relaunch(options)
|
28
|
+
launcher.calabash_notify(self)
|
29
|
+
end
|
30
|
+
|
32
31
|
After do |scenario|
|
33
|
-
|
32
|
+
# Calabash can shutdown the app cleanly by calling the app life cycle methods
|
33
|
+
# in the UIApplicationDelegate. This is really nice for CI environments, but
|
34
|
+
# not so good for local development.
|
35
|
+
#
|
36
|
+
# See the documentation for NO_STOP for a nice debugging workflow
|
37
|
+
#
|
38
|
+
# http://calabashapi.xamarin.com/ios/file.ENVIRONMENT_VARIABLES.html#label-NO_STOP
|
39
|
+
# http://calabashapi.xamarin.com/ios/Calabash/Cucumber/Core.html#console_attach-instance_method
|
40
|
+
unless launcher.calabash_no_stop?
|
34
41
|
calabash_exit
|
35
|
-
if @calabash_launcher.active?
|
36
|
-
@calabash_launcher.stop
|
37
|
-
end
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
41
|
-
at_exit do
|
42
|
-
launcher = Calabash::Cucumber::Launcher.new
|
43
|
-
if launcher.simulator_target?
|
44
|
-
launcher.simulator_launcher.stop unless launcher.calabash_no_stop?
|
45
|
-
end
|
46
|
-
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# override cucumber pending on the XTC
|
2
|
+
if ENV['XAMARIN_TEST_CLOUD'] == '1'
|
3
|
+
module Cucumber
|
4
|
+
module RbSupport
|
5
|
+
def pending(message = 'TODO')
|
6
|
+
raise "PENDING: #{message}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def ask(message, _)
|
10
|
+
raise "Cannot ask: '#{message}'; User interaction is not allowed on the XTC"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
World(Cucumber::RbSupport)
|
15
|
+
end
|
data/lib/calabash-cucumber.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
require "calabash-cucumber/logging"
|
2
|
+
require "calabash-cucumber/dot_dir"
|
3
|
+
require "calabash-cucumber/store/preferences"
|
4
|
+
require "calabash-cucumber/usage_tracker.rb"
|
1
5
|
require 'calabash-cucumber/core'
|
2
6
|
require 'calabash-cucumber/tests_helpers'
|
3
7
|
require 'calabash-cucumber/keyboard_helpers'
|
@@ -15,11 +15,6 @@ class Calabash::Cucumber::InstrumentsActions
|
|
15
15
|
query_action(options, :uia_tap_offset)
|
16
16
|
end
|
17
17
|
|
18
|
-
# @!visibility private
|
19
|
-
def wait_tap(options)
|
20
|
-
uia_wait_tap(options[:query], options)
|
21
|
-
end
|
22
|
-
|
23
18
|
# @!visibility private
|
24
19
|
def double_tap(options)
|
25
20
|
query_action(options, :uia_double_tap_offset)
|
@@ -13,11 +13,6 @@ class Calabash::Cucumber::PlaybackActions
|
|
13
13
|
playback('touch', options)
|
14
14
|
end
|
15
15
|
|
16
|
-
# @!visibility private
|
17
|
-
def wait_tap(options)
|
18
|
-
touch(options)
|
19
|
-
end
|
20
|
-
|
21
16
|
# @!visibility private
|
22
17
|
def double_tap(options)
|
23
18
|
playback('double_tap', options)
|
@@ -111,4 +106,4 @@ class Calabash::Cucumber::PlaybackActions
|
|
111
106
|
def error_message(gesture)
|
112
107
|
"Gesture: '#{gesture}' not supported unless running with instruments."
|
113
108
|
end
|
114
|
-
end
|
109
|
+
end
|
@@ -3,6 +3,8 @@ require 'calabash-cucumber/connection'
|
|
3
3
|
module Calabash
|
4
4
|
module Cucumber
|
5
5
|
|
6
|
+
class ResponseError < RuntimeError ; end
|
7
|
+
|
6
8
|
# @!visibility private
|
7
9
|
module ConnectionHelpers
|
8
10
|
|
@@ -16,6 +18,53 @@ module Calabash
|
|
16
18
|
Calabash::Cucumber::Connection.instance
|
17
19
|
end
|
18
20
|
|
21
|
+
# @!visibility private
|
22
|
+
def response_body_to_hash(body)
|
23
|
+
if body.nil? || body == ""
|
24
|
+
raise ResponseError,
|
25
|
+
"Server replied with an empty response. Your app has probably crashed"
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
hash = JSON.parse(body)
|
30
|
+
rescue TypeError, JSON::ParserError => e
|
31
|
+
raise ResponseError,
|
32
|
+
%Q{Could not parse server response '#{body}':
|
33
|
+
|
34
|
+
#{e}
|
35
|
+
|
36
|
+
This usually means your app has crashed.
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
outcome = hash['outcome']
|
41
|
+
|
42
|
+
case outcome
|
43
|
+
when 'FAILURE'
|
44
|
+
reason = hash['reason']
|
45
|
+
if reason.nil? || reason.empty?
|
46
|
+
hash['reason'] = 'Server provided no reason.'
|
47
|
+
end
|
48
|
+
|
49
|
+
details = hash['details']
|
50
|
+
if details.nil? || details.empty?
|
51
|
+
hash['details'] = 'Server provided no details.'
|
52
|
+
end
|
53
|
+
|
54
|
+
when 'SUCCESS'
|
55
|
+
if !hash.has_key?('results')
|
56
|
+
raise ResponseError,
|
57
|
+
%Q{Server responded with '#{outcome}'
|
58
|
+
but response #{hash} does not contain 'results' key
|
59
|
+
}
|
60
|
+
end
|
61
|
+
else
|
62
|
+
raise ResponseError,
|
63
|
+
%Q{Server responded with an invalid outcome: '#{hash["outcome"]}'}
|
64
|
+
end
|
65
|
+
hash
|
66
|
+
end
|
67
|
+
|
19
68
|
end
|
20
69
|
end
|
21
|
-
end
|
70
|
+
end
|
@@ -161,7 +161,7 @@ module Calabash
|
|
161
161
|
# If the view is not visible `touch` will fail. If the view is animating
|
162
162
|
# `touch` will *silently* fail.
|
163
163
|
# By default, taps the center of the view.
|
164
|
-
# @see #wait_tap
|
164
|
+
# @see Calabash::Cucumber::WaitHelpers#wait_tap
|
165
165
|
# @see Calabash::Cucumber::Operations#tap_mark
|
166
166
|
# @see #tap_point
|
167
167
|
# @param {String} uiquery query describing view to tap. Note `nil` is allowed and is interpreted as
|
@@ -178,7 +178,7 @@ module Calabash
|
|
178
178
|
end
|
179
179
|
|
180
180
|
# Performs the `tap` gesture on an absolute coordinate.
|
181
|
-
# @see #wait_tap
|
181
|
+
# @see Calabash::Cucumber::WaitHelpers#wait_tap
|
182
182
|
# @see Calabash::Cucumber::Operations#tap_mark
|
183
183
|
# @see #touch
|
184
184
|
# @param {Numeric} x x-coordinate to tap
|
@@ -188,33 +188,6 @@ module Calabash
|
|
188
188
|
touch(nil, offset: {x:x, y:y})
|
189
189
|
end
|
190
190
|
|
191
|
-
# Performs the `tap` gesture on the (first) view that matches query `uiquery`.
|
192
|
-
#
|
193
|
-
# As opposed to `touch`, `wait_tap` is a high-level method that combines:
|
194
|
-
#
|
195
|
-
# 1. waiting for the view to appear,
|
196
|
-
# 2. waiting for animations to complete on the view (and it's parents) and
|
197
|
-
# 3. actually tapping the view.
|
198
|
-
#
|
199
|
-
# This removes the common boiler-plate trio: `wait_for_element_exists`,
|
200
|
-
# `wait_for_none_animating`, `touch`.
|
201
|
-
#
|
202
|
-
# By default, taps the center of the view.
|
203
|
-
# @see #touch
|
204
|
-
# @see #tap_point
|
205
|
-
# @param {String} uiquery query describing view to tap. Note `nil` is not allowed.
|
206
|
-
# @param {Hash} options option for modifying the details of the touch
|
207
|
-
# @option options {Hash} :offset (nil) optional offset to tap point. Offset has an `:x` and `:y` key
|
208
|
-
# the tap will be performed on the center of the view plus the offset.
|
209
|
-
# @option options {Hash} :timeout (30) maximum number of seconds to wait for the view to appear
|
210
|
-
# @option options {Hash} :frequency (0.2) polling frequency to for checking if the view is present (>= 0.1)
|
211
|
-
# @return {Array<Hash>} serialized version of the tapped view
|
212
|
-
def wait_tap(uiquery, options={})
|
213
|
-
# noinspection RubyUnusedLocalVariable
|
214
|
-
_uiquery, options = extract_query_and_options(uiquery, options)
|
215
|
-
launcher.actions.wait_tap(options)
|
216
|
-
end
|
217
|
-
|
218
191
|
# Performs the "double tap" gesture on the (first) view that matches query `uiquery`.
|
219
192
|
#
|
220
193
|
# @note This assumes the view is visible and not animating.
|
@@ -653,11 +626,67 @@ module Calabash
|
|
653
626
|
views_touched
|
654
627
|
end
|
655
628
|
|
656
|
-
# Sends app to
|
657
|
-
#
|
658
|
-
#
|
659
|
-
|
660
|
-
|
629
|
+
# Sends the app to the background.
|
630
|
+
#
|
631
|
+
# Sending the app to the background for more than 60 seconds may
|
632
|
+
# cause unpredicatable results.
|
633
|
+
#
|
634
|
+
# @param [Numeric] seconds How long to send the app to the background.
|
635
|
+
# @raise [ArgumentError] if `seconds` argument is < 1.0
|
636
|
+
def send_app_to_background(seconds)
|
637
|
+
if seconds < 1.0
|
638
|
+
raise ArgumentError, "Seconds '#{seconds}' must be >= 1.0"
|
639
|
+
end
|
640
|
+
|
641
|
+
parameters = {
|
642
|
+
:duration => seconds
|
643
|
+
}
|
644
|
+
|
645
|
+
begin
|
646
|
+
body = http({:method => :post, :path => "suspend"}, parameters)
|
647
|
+
result = response_body_to_hash(body)
|
648
|
+
rescue RuntimeError => e
|
649
|
+
raise RuntimeError, e
|
650
|
+
end
|
651
|
+
|
652
|
+
if result["outcome"] != "SUCCESS"
|
653
|
+
raise RuntimeError,
|
654
|
+
%Q{Could not send app to background:
|
655
|
+
reason => '#{result["reason"]}'
|
656
|
+
details => '#{result["details"]}'
|
657
|
+
}
|
658
|
+
end
|
659
|
+
result["results"]
|
660
|
+
end
|
661
|
+
|
662
|
+
# Cause the device to shake.
|
663
|
+
#
|
664
|
+
# @param [Numeric] seconds How long to shake the device
|
665
|
+
# @raise [ArgumentError] if `seconds` argument is <= 0.0
|
666
|
+
def shake(seconds)
|
667
|
+
if seconds <= 0.0
|
668
|
+
raise ArgumentError, "Seconds '#{seconds}' must be >= 0.0"
|
669
|
+
end
|
670
|
+
|
671
|
+
parameters = {
|
672
|
+
:duration => seconds
|
673
|
+
}
|
674
|
+
|
675
|
+
begin
|
676
|
+
body = http({:method => :post, :path => "shake"}, parameters)
|
677
|
+
result = response_body_to_hash(body)
|
678
|
+
rescue RuntimeError => e
|
679
|
+
raise RuntimeError, e
|
680
|
+
end
|
681
|
+
|
682
|
+
if result["outcome"] != "SUCCESS"
|
683
|
+
raise RuntimeError,
|
684
|
+
%Q{Could not shake the device:
|
685
|
+
reason => '#{result["reason"]}'
|
686
|
+
details => '#{result["details"]}'
|
687
|
+
}
|
688
|
+
end
|
689
|
+
result["results"]
|
661
690
|
end
|
662
691
|
|
663
692
|
# Simulates gps location of the device/simulator.
|
@@ -798,50 +827,43 @@ module Calabash
|
|
798
827
|
|
799
828
|
# Calls a method on the app's AppDelegate object.
|
800
829
|
#
|
801
|
-
#
|
802
|
-
#
|
803
|
-
# speed purposes or reset the app to a good known state.
|
830
|
+
# Use this to call an arbitrary Objective-C or Swift method in your
|
831
|
+
# app's UIApplicationDelegate.
|
804
832
|
#
|
805
|
-
#
|
833
|
+
# Commonly used to "go around" the UI speed purposes or reset the app to
|
834
|
+
# a good known state.
|
806
835
|
#
|
807
|
-
#
|
836
|
+
# @note For methods that take arguments, don't forget to include the
|
837
|
+
# trailing ":"
|
808
838
|
#
|
809
|
-
#
|
810
|
-
#
|
811
|
-
#
|
812
|
-
|
813
|
-
|
814
|
-
# @example
|
815
|
-
# backdoor("calabashBackdoor:", {example:'param'})
|
816
|
-
# @param {String} selector the selector to perform on the app delegate
|
817
|
-
# @param {Object} argument the argument to pass to the selector
|
818
|
-
# @return {Object} the result of performing the selector with the argument (serialized)
|
819
|
-
def backdoor(selector, argument)
|
820
|
-
|
821
|
-
unless selector.end_with?(':')
|
822
|
-
messages =
|
823
|
-
[
|
824
|
-
"Selector '#{selector}' is missing a trailing ':'",
|
825
|
-
'Valid backdoor selectors must take one argument.',
|
826
|
-
"Before 0.15.0, the server will append a trailing ':'.",
|
827
|
-
' After 0.15.0, this behavior is scheduled to change.',
|
828
|
-
'',
|
829
|
-
'http://developer.xamarin.com/guides/testcloud/calabash/working-with/backdoors/#backdoor_in_iOS',
|
830
|
-
''
|
831
|
-
]
|
832
|
-
_deprecated('0.15.0', messages.join("\n"), :warn)
|
833
|
-
end
|
834
|
-
|
835
|
-
json = {
|
839
|
+
# @param [String] selector the selector to perform on the app delegate
|
840
|
+
# @param [Object] argument the argument to pass to the selector
|
841
|
+
# @return [Object] the result of performing the selector with the argument
|
842
|
+
def backdoor(selector, *arguments)
|
843
|
+
parameters = {
|
836
844
|
:selector => selector,
|
837
|
-
:
|
845
|
+
:arguments => arguments
|
838
846
|
}
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
847
|
+
|
848
|
+
begin
|
849
|
+
body = http({:method => :post, :path => "backdoor"}, parameters)
|
850
|
+
result = response_body_to_hash(body)
|
851
|
+
rescue RuntimeError => e
|
852
|
+
raise RuntimeError, e
|
853
|
+
end
|
854
|
+
|
855
|
+
if result["outcome"] != "SUCCESS"
|
856
|
+
raise RuntimeError,
|
857
|
+
%Q{backdoor call failed:
|
858
|
+
selector => '#{selector}'
|
859
|
+
arguments => '#{arguments}'
|
860
|
+
reason => '#{result["reason"]}'
|
861
|
+
|
862
|
+
#{result["details"]}
|
863
|
+
|
864
|
+
}
|
843
865
|
end
|
844
|
-
|
866
|
+
result["results"]
|
845
867
|
end
|
846
868
|
|
847
869
|
# Attempts to shut the app down gracefully by simulating the transition
|