calabash 1.9.9.pre3 → 2.0.0.prelegacy
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -33
- data/bin/calabash +45 -36
- data/lib/calabash.rb +137 -13
- data/lib/calabash/android.rb +6 -0
- data/lib/calabash/android/adb.rb +25 -1
- data/lib/calabash/android/application.rb +14 -3
- data/lib/calabash/android/build/builder.rb +16 -3
- data/lib/calabash/android/build/java_keystore.rb +10 -0
- data/lib/calabash/android/build/resigner.rb +23 -1
- data/lib/calabash/android/build/test_server.rb +2 -0
- data/lib/calabash/android/defaults.rb +1 -0
- data/lib/calabash/android/device.rb +55 -3
- data/lib/calabash/android/environment.rb +10 -0
- data/lib/calabash/android/interactions.rb +106 -3
- data/lib/calabash/android/legacy.rb +143 -0
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/life_cycle.rb +6 -4
- data/lib/calabash/android/physical_buttons.rb +12 -1
- data/lib/calabash/android/screenshot.rb +1 -0
- data/lib/calabash/android/scroll.rb +115 -0
- data/lib/calabash/android/server.rb +3 -1
- data/lib/calabash/android/text.rb +16 -25
- data/lib/calabash/application.rb +29 -0
- data/lib/calabash/cli/build.rb +15 -1
- data/lib/calabash/cli/console.rb +9 -5
- data/lib/calabash/cli/generate.rb +5 -0
- data/lib/calabash/cli/helpers.rb +7 -1
- data/lib/calabash/cli/resign.rb +1 -0
- data/lib/calabash/cli/run.rb +10 -6
- data/lib/calabash/cli/setup_keystore.rb +2 -0
- data/lib/calabash/color.rb +7 -0
- data/lib/calabash/console_helpers.rb +4 -2
- data/lib/calabash/defaults.rb +1 -0
- data/lib/calabash/device.rb +8 -9
- data/lib/calabash/environment.rb +5 -0
- data/lib/calabash/gestures.rb +159 -66
- data/lib/calabash/http/retriable_client.rb +3 -1
- data/lib/calabash/interactions.rb +68 -5
- data/lib/calabash/ios.rb +4 -0
- data/lib/calabash/ios/application.rb +8 -1
- data/lib/calabash/ios/conditions.rb +3 -1
- data/lib/calabash/ios/date_picker.rb +412 -0
- data/lib/calabash/ios/defaults.rb +1 -0
- data/lib/calabash/ios/device.rb +1 -0
- data/lib/calabash/ios/device/device_implementation.rb +33 -16
- data/lib/calabash/ios/device/gestures_mixin.rb +202 -48
- data/lib/calabash/ios/device/ipad_1x_2x_mixin.rb +253 -0
- data/lib/calabash/ios/device/keyboard_mixin.rb +2 -0
- data/lib/calabash/ios/device/rotation_mixin.rb +11 -8
- data/lib/calabash/ios/device/routes/condition_route_mixin.rb +1 -0
- data/lib/calabash/ios/device/routes/handle_route_mixin.rb +5 -1
- data/lib/calabash/ios/device/routes/map_route_mixin.rb +1 -0
- data/lib/calabash/ios/device/routes/response_parser.rb +1 -0
- data/lib/calabash/ios/device/routes/uia_route_mixin.rb +44 -6
- data/lib/calabash/ios/device/runtime_attributes.rb +4 -5
- data/lib/calabash/ios/device/text_mixin.rb +2 -0
- data/lib/calabash/ios/device/uia_keyboard_mixin.rb +9 -0
- data/lib/calabash/ios/device/uia_mixin.rb +1 -0
- data/lib/calabash/ios/gestures.rb +82 -8
- data/lib/calabash/ios/interactions.rb +30 -1
- data/lib/calabash/ios/orientation.rb +21 -21
- data/lib/calabash/ios/runtime.rb +154 -2
- data/lib/calabash/ios/slider.rb +70 -0
- data/lib/calabash/ios/text.rb +11 -47
- data/lib/calabash/ios/uia.rb +24 -2
- data/lib/calabash/legacy.rb +7 -0
- data/lib/calabash/lib/skeleton/config/cucumber.yml +1 -3
- data/lib/calabash/lib/skeleton/features/support/dry_run.rb +8 -0
- data/lib/calabash/lib/skeleton/features/support/env.rb +15 -1
- data/lib/calabash/life_cycle.rb +78 -32
- data/lib/calabash/location.rb +2 -1
- data/lib/calabash/orientation.rb +0 -1
- data/lib/calabash/page.rb +51 -5
- data/lib/calabash/patch.rb +1 -0
- data/lib/calabash/patch/array.rb +7 -7
- data/lib/calabash/query.rb +17 -2
- data/lib/calabash/query_result.rb +14 -0
- data/lib/calabash/screenshot.rb +28 -8
- data/lib/calabash/text.rb +105 -8
- data/lib/calabash/utility.rb +6 -6
- data/lib/calabash/version.rb +1 -1
- data/lib/calabash/wait.rb +37 -11
- metadata +14 -7
data/lib/calabash/cli/build.rb
CHANGED
@@ -2,10 +2,24 @@ module Calabash
|
|
2
2
|
module CLI
|
3
3
|
# @!visibility private
|
4
4
|
module Build
|
5
|
+
# @!visibility private
|
5
6
|
def parse_build_arguments!
|
6
7
|
fail('Should only build test-server for Android') unless @platform.nil? || @platform == :android
|
7
8
|
|
8
9
|
application = @arguments.shift
|
10
|
+
test_server_path = nil
|
11
|
+
|
12
|
+
arg = @arguments.shift
|
13
|
+
|
14
|
+
if arg != nil
|
15
|
+
if arg == '-o'
|
16
|
+
test_server_path = @arguments.shift
|
17
|
+
|
18
|
+
if test_server_path == nil
|
19
|
+
raise 'Expected an output path for the test-server'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
9
23
|
|
10
24
|
if application.nil?
|
11
25
|
fail('Must supply application as first parameter to build', :build)
|
@@ -18,7 +32,7 @@ module Calabash
|
|
18
32
|
case extension
|
19
33
|
when '.apk'
|
20
34
|
set_platform!(:android)
|
21
|
-
Calabash::Android::Build::Builder.new(application_path).build
|
35
|
+
Calabash::Android::Build::Builder.new(application_path).build(test_server_path)
|
22
36
|
when '.ipa', '.app'
|
23
37
|
set_platform!(:ios)
|
24
38
|
fail('Should only build test-server for Android')
|
data/lib/calabash/cli/console.rb
CHANGED
@@ -3,6 +3,7 @@ module Calabash
|
|
3
3
|
module CLI
|
4
4
|
# @!visibility private
|
5
5
|
module Console
|
6
|
+
# @!visibility private
|
6
7
|
def parse_console_arguments!
|
7
8
|
application = @arguments.shift
|
8
9
|
|
@@ -22,12 +23,14 @@ module Calabash
|
|
22
23
|
when '.apk'
|
23
24
|
set_platform!(:android)
|
24
25
|
|
25
|
-
|
26
|
-
|
26
|
+
unless Environment::TEST_SERVER_PATH
|
27
|
+
# Create the test server if it does not exist
|
28
|
+
test_server = Android::Build::TestServer.new(application_path)
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
30
|
+
unless test_server.exists?
|
31
|
+
Logger.info('Test server does not exist. Creating test server.')
|
32
|
+
Calabash::Android::Build::Builder.new(application_path).build
|
33
|
+
end
|
31
34
|
end
|
32
35
|
|
33
36
|
enter_console(application_path)
|
@@ -45,6 +48,7 @@ module Calabash
|
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
51
|
+
# @!visibility private
|
48
52
|
def enter_console(application_path)
|
49
53
|
irbrc_path = Environment::IRBRC
|
50
54
|
|
@@ -5,6 +5,7 @@ module Calabash
|
|
5
5
|
module CLI
|
6
6
|
# @!visibility private
|
7
7
|
module Generate
|
8
|
+
# @!visibility private
|
8
9
|
def parse_generate_arguments!
|
9
10
|
if File.exist?('features')
|
10
11
|
puts "A features directory already exists. Please remove this to continue."
|
@@ -22,6 +23,7 @@ module Calabash
|
|
22
23
|
cucumber_config = File.read(file(File.join('config', 'cucumber.yml')))
|
23
24
|
|
24
25
|
env = File.read(file(File.join('features', 'support', 'env.rb')))
|
26
|
+
dry_run = File.read(file(File.join('features', 'support', 'dry_run.rb')))
|
25
27
|
sample_feature = File.read(file(File.join('features', 'sample.feature')))
|
26
28
|
calabash_steps = File.read(file(File.join('features', 'step_definitions', 'calabash_steps.rb')))
|
27
29
|
|
@@ -46,6 +48,7 @@ module Calabash
|
|
46
48
|
File.open(File.join('features', 'step_definitions', 'calabash_steps.rb'), 'w') {|file| file.write(calabash_steps) }
|
47
49
|
File.open(File.join('features', 'support', 'hooks.rb'), 'w') {|file| file.write(hooks) }
|
48
50
|
File.open(File.join('features', 'support', 'env.rb'), 'w') {|file| file.write(env) }
|
51
|
+
File.open(File.join('features', 'support', 'dry_run.rb'), 'w') {|file| file.write(dry_run) }
|
49
52
|
|
50
53
|
gemfile = File.readlines(file(File.join('Gemfile')))
|
51
54
|
|
@@ -68,10 +71,12 @@ module Calabash
|
|
68
71
|
end
|
69
72
|
end
|
70
73
|
|
74
|
+
# @!visibility private
|
71
75
|
def file(file)
|
72
76
|
File.join(Calabash::Environment::SKELETON_DIR_PATH, file)
|
73
77
|
end
|
74
78
|
|
79
|
+
# @!visibility private
|
75
80
|
def msg(title, &block)
|
76
81
|
puts "\n" + "-"*10 + title + "-"*10
|
77
82
|
block.call
|
data/lib/calabash/cli/helpers.rb
CHANGED
@@ -3,6 +3,7 @@ module Calabash
|
|
3
3
|
module CLI
|
4
4
|
# @!visibility private
|
5
5
|
module Helpers
|
6
|
+
# @!visibility private
|
6
7
|
HELP = {
|
7
8
|
help: 'help',
|
8
9
|
generate: 'generate',
|
@@ -14,6 +15,7 @@ module Calabash
|
|
14
15
|
build: 'build <apk>'
|
15
16
|
}
|
16
17
|
|
18
|
+
# @!visibility private
|
17
19
|
def key_for_command(command)
|
18
20
|
HELP.each do |key, value|
|
19
21
|
if value.split(' ').first == command
|
@@ -24,6 +26,7 @@ module Calabash
|
|
24
26
|
nil
|
25
27
|
end
|
26
28
|
|
29
|
+
# @!visibility private
|
27
30
|
def print_usage_for(key, output=STDOUT)
|
28
31
|
if key.nil? || HELP[key].nil?
|
29
32
|
output.write <<EOF
|
@@ -37,6 +40,7 @@ EOF
|
|
37
40
|
end
|
38
41
|
end
|
39
42
|
|
43
|
+
# @!visibility private
|
40
44
|
def print_usage(output=STDOUT)
|
41
45
|
output.write <<EOF
|
42
46
|
Usage: calabash [options] <command-name> [command specific options]
|
@@ -64,7 +68,7 @@ EOF
|
|
64
68
|
#{HELP[:resign]}
|
65
69
|
resigns the app with the currently configured keystore.
|
66
70
|
|
67
|
-
#{HELP[:build]}
|
71
|
+
#{HELP[:build]} [-o <output_file>]
|
68
72
|
builds the test server that will be used when testing the app.
|
69
73
|
|
70
74
|
iOS specific commands
|
@@ -101,11 +105,13 @@ EOF
|
|
101
105
|
EOF
|
102
106
|
end
|
103
107
|
|
108
|
+
# @!visibility private
|
104
109
|
def help
|
105
110
|
file_name = File.join(File.dirname(__FILE__), '..', 'doc', 'calabash_help.txt')
|
106
111
|
system("less \"#{file_name}\"")
|
107
112
|
end
|
108
113
|
|
114
|
+
# @!visibility private
|
109
115
|
def fail(reason, command=nil)
|
110
116
|
STDERR.write("#{reason}\n")
|
111
117
|
|
data/lib/calabash/cli/resign.rb
CHANGED
data/lib/calabash/cli/run.rb
CHANGED
@@ -3,6 +3,7 @@ module Calabash
|
|
3
3
|
module CLI
|
4
4
|
# @!visibility private
|
5
5
|
module Run
|
6
|
+
# @!visibility private
|
6
7
|
def parse_run_arguments!
|
7
8
|
first_argument = @arguments.first # Do not remove the entry from the arguments yet - it might be a cucumber arg
|
8
9
|
|
@@ -30,12 +31,14 @@ module Calabash
|
|
30
31
|
when '.apk'
|
31
32
|
set_platform!(:android)
|
32
33
|
|
33
|
-
|
34
|
-
|
34
|
+
unless Environment::TEST_SERVER_PATH
|
35
|
+
# Create the test server if it does not exist
|
36
|
+
test_server = Android::Build::TestServer.new(application_path)
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
unless test_server.exists?
|
39
|
+
Logger.info('Test server does not exist. Creating test server.')
|
40
|
+
Calabash::Android::Build::Builder.new(application_path).build
|
41
|
+
end
|
39
42
|
end
|
40
43
|
|
41
44
|
run(application_path, @arguments)
|
@@ -54,6 +57,7 @@ module Calabash
|
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
60
|
+
# @!visibility private
|
57
61
|
def run(application_path, cucumber_arguments)
|
58
62
|
cucumber_environment = {}
|
59
63
|
cucumber_environment['CAL_DEBUG'] = Environment::DEBUG ? '1' : '0'
|
@@ -88,7 +92,7 @@ module Calabash
|
|
88
92
|
end
|
89
93
|
end
|
90
94
|
|
91
|
-
arguments = ['-S', 'cucumber',
|
95
|
+
arguments = ['-S', 'cucumber', *cucumber_arguments]
|
92
96
|
|
93
97
|
Logger.debug("Starting Ruby with arguments: #{arguments.join(', ')} and environment #{cucumber_environment.to_s}")
|
94
98
|
|
@@ -6,6 +6,7 @@ module Calabash
|
|
6
6
|
module CLI
|
7
7
|
# @!visibility private
|
8
8
|
module SetupKeystore
|
9
|
+
# @!visibility private
|
9
10
|
def parse_setup_keystore_arguments!
|
10
11
|
set_platform!(:android)
|
11
12
|
|
@@ -25,6 +26,7 @@ module Calabash
|
|
25
26
|
puts "Saved your settings to '#{Android::Build::JavaKeystore::CALABASH_KEYSTORE_SETTINGS_FILENAME}'. You can edit the settings manually or run this setup script again"
|
26
27
|
end
|
27
28
|
|
29
|
+
# @!visibility private
|
28
30
|
def prompt(message, secure = false)
|
29
31
|
puts message
|
30
32
|
|
data/lib/calabash/color.rb
CHANGED
@@ -1,30 +1,37 @@
|
|
1
1
|
module Calabash
|
2
2
|
# @!visibility private
|
3
3
|
module Color
|
4
|
+
# @!visibility private
|
4
5
|
def self.colorize(string, color)
|
5
6
|
"\e[#{color}m#{string}\e[0m"
|
6
7
|
end
|
7
8
|
|
9
|
+
# @!visibility private
|
8
10
|
def self.red(string)
|
9
11
|
colorize(string, 31)
|
10
12
|
end
|
11
13
|
|
14
|
+
# @!visibility private
|
12
15
|
def self.green(string)
|
13
16
|
colorize(string, 32)
|
14
17
|
end
|
15
18
|
|
19
|
+
# @!visibility private
|
16
20
|
def self.yellow(string)
|
17
21
|
colorize(string, 33)
|
18
22
|
end
|
19
23
|
|
24
|
+
# @!visibility private
|
20
25
|
def self.blue(string)
|
21
26
|
colorize(string, 34)
|
22
27
|
end
|
23
28
|
|
29
|
+
# @!visibility private
|
24
30
|
def self.magenta(string)
|
25
31
|
colorize(string, 35)
|
26
32
|
end
|
27
33
|
|
34
|
+
# @!visibility private
|
28
35
|
def self.cyan(string)
|
29
36
|
colorize(string, 36)
|
30
37
|
end
|
@@ -4,7 +4,6 @@ module Calabash
|
|
4
4
|
|
5
5
|
# Methods you can use in the Calabash console to help you
|
6
6
|
# interact with your app.
|
7
|
-
# @!visibility private
|
8
7
|
module ConsoleHelpers
|
9
8
|
|
10
9
|
# Outputs all visible elements as a tree.
|
@@ -30,13 +29,15 @@ module Calabash
|
|
30
29
|
true
|
31
30
|
end
|
32
31
|
|
33
|
-
# Clear the console.
|
32
|
+
# Clear the console history. Note that this also clears the contents
|
33
|
+
# given to Calabash::ConsoleHelpers#copy.
|
34
34
|
def clear
|
35
35
|
ConsoleHelpers.clear
|
36
36
|
true
|
37
37
|
end
|
38
38
|
|
39
39
|
# Puts a message of the day.
|
40
|
+
# @!visibility private
|
40
41
|
def message_of_the_day
|
41
42
|
messages = [
|
42
43
|
"Let's get this done!",
|
@@ -141,6 +142,7 @@ module Calabash
|
|
141
142
|
readline_history.last(length)
|
142
143
|
end
|
143
144
|
|
145
|
+
# @!visibility private
|
144
146
|
FILTER_REGEX = Regexp.union(/\s*copy(\(|\z)/, /\s*tree(\(|\z)/,
|
145
147
|
/\s*flash(\(|\z)/, /\s*classes(\(|\z)/,
|
146
148
|
/\s*ids(\(|\z)/, /\s*start_app(\(|\z)/,
|
data/lib/calabash/defaults.rb
CHANGED
data/lib/calabash/device.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module Calabash
|
2
|
+
# A model of the device under test. Can be a physical Android or iOS device,
|
3
|
+
# an Android emulator, or an iOS simulator.
|
2
4
|
class Device
|
3
5
|
include Utility
|
4
6
|
|
@@ -138,9 +140,6 @@ module Calabash
|
|
138
140
|
gesture_options[:at] ||= {}
|
139
141
|
gesture_options[:at][:x] ||= 50
|
140
142
|
gesture_options[:at][:y] ||= 50
|
141
|
-
gesture_options[:offset] ||= {}
|
142
|
-
gesture_options[:offset][:x] ||= 0
|
143
|
-
gesture_options[:offset][:y] ||= 0
|
144
143
|
gesture_options[:timeout] ||= Calabash::Gestures::DEFAULT_GESTURE_WAIT_TIMEOUT
|
145
144
|
|
146
145
|
_tap(query, gesture_options)
|
@@ -156,9 +155,6 @@ module Calabash
|
|
156
155
|
gesture_options[:at] ||= {}
|
157
156
|
gesture_options[:at][:x] ||= 50
|
158
157
|
gesture_options[:at][:y] ||= 50
|
159
|
-
gesture_options[:offset] ||= {}
|
160
|
-
gesture_options[:offset][:x] ||= 0
|
161
|
-
gesture_options[:offset][:y] ||= 0
|
162
158
|
gesture_options[:timeout] ||= Calabash::Gestures::DEFAULT_GESTURE_WAIT_TIMEOUT
|
163
159
|
|
164
160
|
_double_tap(query, gesture_options)
|
@@ -174,9 +170,6 @@ module Calabash
|
|
174
170
|
gesture_options[:at] ||= {}
|
175
171
|
gesture_options[:at][:x] ||= 50
|
176
172
|
gesture_options[:at][:y] ||= 50
|
177
|
-
gesture_options[:offset] ||= {}
|
178
|
-
gesture_options[:offset][:x] ||= 0
|
179
|
-
gesture_options[:offset][:y] ||= 0
|
180
173
|
gesture_options[:timeout] ||= Calabash::Gestures::DEFAULT_GESTURE_WAIT_TIMEOUT
|
181
174
|
gesture_options[:duration] ||= 1
|
182
175
|
|
@@ -237,6 +230,7 @@ module Calabash
|
|
237
230
|
end
|
238
231
|
|
239
232
|
gesture_options = options.dup
|
233
|
+
gesture_options[:duration] ||= 0.5
|
240
234
|
gesture_options[:timeout] ||= Calabash::Gestures::DEFAULT_GESTURE_WAIT_TIMEOUT
|
241
235
|
|
242
236
|
_pinch(direction, query, gesture_options)
|
@@ -259,6 +253,11 @@ module Calabash
|
|
259
253
|
abstract_method!
|
260
254
|
end
|
261
255
|
|
256
|
+
# @!visibility private
|
257
|
+
def keyboard_visible?
|
258
|
+
abstract_method!
|
259
|
+
end
|
260
|
+
|
262
261
|
private
|
263
262
|
|
264
263
|
# @!visibility private
|
data/lib/calabash/environment.rb
CHANGED
@@ -11,6 +11,7 @@ module Calabash
|
|
11
11
|
ENV[name]
|
12
12
|
end
|
13
13
|
|
14
|
+
# @!visibility private
|
14
15
|
# Utility method to set the value of an environment variable.
|
15
16
|
#
|
16
17
|
# @param [String] name of the environment variable
|
@@ -30,6 +31,10 @@ module Calabash
|
|
30
31
|
# Is Calabash running in debug mode. True if $CAL_DEBUG is '1'
|
31
32
|
DEBUG = variable('CAL_DEBUG') == '1'
|
32
33
|
|
34
|
+
# @!visibility private
|
35
|
+
# Experimental! Print every method that is called in Calabash
|
36
|
+
DEBUG_CALLED_METHODS = variable('CAL_DEBUG_CALLED_METHODS') == '1'
|
37
|
+
|
33
38
|
# The path of the default app under test. This value is used if no app is
|
34
39
|
# given from the command line. e.g. $ calabash run.
|
35
40
|
#
|
data/lib/calabash/gestures.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
module Calabash
|
2
|
-
# Methods for performing gestures. Gestures are taps, flicks,
|
3
|
-
# and pans.
|
2
|
+
# Methods for performing gestures. Gestures are taps, flicks, and pans.
|
4
3
|
#
|
5
4
|
# Many gestures take an optional :duration. On iOS, the duration must be
|
6
5
|
# between 0.5 and 60 (seconds). This is a limitation of the UIAutomation API.
|
6
|
+
#
|
7
|
+
# @note All gestures have _undefined return values._ This is intentional.
|
8
|
+
# Please do not rely on return values of gestures in your tests. For
|
9
|
+
# convenience when working in the console, some gestures return sensible
|
10
|
+
# values. However, these values are subject to change.
|
7
11
|
module Gestures
|
8
12
|
|
9
13
|
# How long do we wait for a view to appear by default when performing a
|
10
14
|
# gesture.
|
11
15
|
DEFAULT_GESTURE_WAIT_TIMEOUT = 3
|
12
16
|
|
13
|
-
# Performs a
|
17
|
+
# Performs a **tap** on the first view that matches `query`.
|
14
18
|
#
|
15
19
|
# Taps the center of the view by default.
|
16
20
|
#
|
@@ -19,33 +23,25 @@ module Calabash
|
|
19
23
|
#
|
20
24
|
# ┬ ┌─────────────────────────────────────┐
|
21
25
|
# | │2 3│
|
22
|
-
# | │
|
26
|
+
# | │ │
|
23
27
|
# | │ │
|
24
28
|
# 200 px │ 1 │
|
25
29
|
# | │ │
|
26
|
-
# | │ 7 5 │ 6
|
27
30
|
# | │ │
|
31
|
+
# | │ 4 │
|
28
32
|
# ┴ └─────────────────────────────────────┘
|
29
33
|
#
|
30
34
|
# 1. tap("* marked:'email'")
|
31
35
|
# 2. tap("* marked:'email'", at: {x: 0, y: 0})
|
32
36
|
# 3. tap("* marked:'email'", at: {x: 100, y: 0})
|
33
|
-
# 4. tap("* marked:'email'",
|
34
|
-
# 5. tap("* marked:'email'", offset: {x: 20, y: 40})
|
35
|
-
# 6. tap("* marked:'email'", at: {x: 100, y: 75}, offset: {x: 80})
|
36
|
-
# 7. tap("* marked:'email'", at: {x: 50, y: 100},
|
37
|
-
# offset: {x: -80, y: -40})
|
37
|
+
# 4. tap("* marked:'email'", at: {x: 50, y: 100})
|
38
38
|
#
|
39
|
-
# @param [String] query A query describing the view
|
39
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
40
|
+
# to tap.
|
40
41
|
# @param [Hash] options Options for modifying the details of the touch.
|
41
42
|
# @option options [Hash] :at ({x: 50, y: 50}) The point at which the
|
42
43
|
# gesture originates from. It is a percentage-based translation using
|
43
|
-
# top-left `(0,0)` as the reference point.
|
44
|
-
# applied before any `:offset`.
|
45
|
-
# @option options [Hash] :offset ({x: 0, y: 0}) Offset to touch point.
|
46
|
-
# Offset supports an `:x` and `:y` key and causes the touch to be
|
47
|
-
# offset with `(x,y)`. This offset is always applied _after_ any
|
48
|
-
# translation performed by `:at`.
|
44
|
+
# top-left `(0,0)` as the reference point.
|
49
45
|
# @raise [ViewNotFoundError] If the `query` returns no results.
|
50
46
|
# @raise [ArgumentError] If `query` is invalid.
|
51
47
|
def tap(query, options={})
|
@@ -54,8 +50,17 @@ module Calabash
|
|
54
50
|
Device.default.tap(Query.new(query), options)
|
55
51
|
end
|
56
52
|
|
57
|
-
# Performs a
|
58
|
-
#
|
53
|
+
# Performs a **double_tap** on the first view that matches `query`.
|
54
|
+
#
|
55
|
+
# @see #tap
|
56
|
+
#
|
57
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
58
|
+
# to tap.
|
59
|
+
# @param [Hash] options Options for modifying the details of the touch.
|
60
|
+
# @option options [Hash] :at ({x: 50, y: 50}) The point at which the
|
61
|
+
# gesture originates from. It is a percentage-based translation using
|
62
|
+
# top-left `(0,0)` as the reference point.
|
63
|
+
#
|
59
64
|
# @raise [ViewNotFoundError] If the `query` returns no results.
|
60
65
|
# @raise [ArgumentError] If `query` is invalid.
|
61
66
|
def double_tap(query, options={})
|
@@ -64,12 +69,14 @@ module Calabash
|
|
64
69
|
Device.default.double_tap(Query.new(query), options)
|
65
70
|
end
|
66
71
|
|
67
|
-
# Performs a
|
72
|
+
# Performs a **long_press** on the first view that matches `query`.
|
73
|
+
#
|
68
74
|
# On iOS this is often referred to as _touch-and-hold_. On Android this
|
69
75
|
# is known variously as _press_, _long-push_, _press-and-hold_, or _hold_.
|
70
76
|
#
|
71
|
-
# @see tap
|
77
|
+
# @see #tap
|
72
78
|
#
|
79
|
+
# @param [String] query A query describing the view to tap.
|
73
80
|
# @param [Hash] options Options for modifying the details of the touch.
|
74
81
|
# @option options [Number] :duration (1.0) The amount of time in seconds to
|
75
82
|
# press. On iOS, the duration must be between 0.5 and 60.
|
@@ -82,11 +89,14 @@ module Calabash
|
|
82
89
|
Device.default.long_press(Query.new(query), options)
|
83
90
|
end
|
84
91
|
|
85
|
-
# Performs a
|
92
|
+
# Performs a **pan** on the first view that matches `query`.
|
93
|
+
#
|
86
94
|
# A pan is a straight line swipe that pauses at the final point
|
87
95
|
# before releasing the gesture. This is the general purpose pan method. For
|
88
96
|
# standardized pans see `pan_left`, `pan_right`, `pan_up`, and `pan_down`.
|
89
97
|
#
|
98
|
+
# Also known as **scroll** and **swipe**.
|
99
|
+
#
|
90
100
|
# @example
|
91
101
|
# Consider a pan on a scrollable view. When the finger is is released,
|
92
102
|
# the velocity of the view is zero.
|
@@ -112,7 +122,8 @@ module Calabash
|
|
112
122
|
# @see Calabash::IOS::Scroll#scroll_to_item
|
113
123
|
# @see Calabash::IOS::Scroll#scroll_to_item_with_mark
|
114
124
|
#
|
115
|
-
# @param [String] query A query describing the view
|
125
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
126
|
+
# to pan inside.
|
116
127
|
# @param [Hash] from `({:x, :y})` The point at which the gesture
|
117
128
|
# originates from.
|
118
129
|
# @param [Hash] to `({:x, :y})` The point at which the gesture
|
@@ -132,9 +143,11 @@ module Calabash
|
|
132
143
|
Device.default.pan(Query.new(query), from, to, options)
|
133
144
|
end
|
134
145
|
|
135
|
-
# Performs a
|
146
|
+
# Performs a **pan** from the center of the first view that matches
|
136
147
|
# `query_from` to the center of the first view that matches `query_to`.
|
137
148
|
#
|
149
|
+
# Also known as **drag and drop**.
|
150
|
+
#
|
138
151
|
# @example
|
139
152
|
# Panning between two elements.
|
140
153
|
# `pan_between("* id:'first'", "* id:'second'")`
|
@@ -171,56 +184,64 @@ module Calabash
|
|
171
184
|
Device.default.pan_between(Query.new(query_from), Query.new(query_to), options)
|
172
185
|
end
|
173
186
|
|
174
|
-
# Performs a
|
175
|
-
#
|
187
|
+
# Performs a **pan** heading _left_ on the first view that matches `query`.
|
188
|
+
#
|
189
|
+
# @see #pan
|
176
190
|
def pan_left(query, options={})
|
177
191
|
pan(query, {x: 90, y: 50}, {x: 10, y: 50}, options)
|
178
192
|
end
|
179
193
|
|
180
|
-
# Performs a
|
181
|
-
#
|
182
|
-
# @see pan
|
194
|
+
# Performs a **pan** heading _right_ on the first view that matches `query`.
|
195
|
+
#
|
196
|
+
# @see #pan
|
183
197
|
def pan_right(query, options={})
|
184
198
|
pan(query, {x: 10, y: 50}, {x: 90, y: 50}, options)
|
185
199
|
end
|
186
200
|
|
187
|
-
# Performs a
|
188
|
-
#
|
201
|
+
# Performs a **pan** heading _up_ on the first view that matches `query`.
|
202
|
+
#
|
203
|
+
# @see #pan
|
189
204
|
def pan_up(query, options={})
|
190
205
|
pan(query, {x: 50, y: 90}, {x: 50, y: 10}, options)
|
191
206
|
end
|
192
207
|
|
193
|
-
# Performs a
|
194
|
-
#
|
208
|
+
# Performs a **pan** heading _down_ on the first view that matches `query`.
|
209
|
+
#
|
210
|
+
# @see #pan
|
195
211
|
def pan_down(query, options={})
|
196
212
|
pan(query, {x: 50, y: 10}, {x: 50, y: 90}, options)
|
197
213
|
end
|
198
214
|
|
199
|
-
# Performs a
|
200
|
-
#
|
215
|
+
# Performs a **pan** heading _left_ on the screen.
|
216
|
+
#
|
217
|
+
# @see #pan
|
201
218
|
def pan_screen_left(options={})
|
202
219
|
pan_left('*', options)
|
203
220
|
end
|
204
221
|
|
205
|
-
# Performs a
|
206
|
-
#
|
222
|
+
# Performs a **pan** heading _right_ on the screen.
|
223
|
+
#
|
224
|
+
# @see #pan
|
207
225
|
def pan_screen_right(options={})
|
208
226
|
pan_right('*', options)
|
209
227
|
end
|
210
228
|
|
211
|
-
# Performs a
|
212
|
-
#
|
229
|
+
# Performs a **pan** heading _up_ on the screen.
|
230
|
+
#
|
231
|
+
# @see #pan
|
213
232
|
def pan_screen_up(options={})
|
214
233
|
_pan_screen_up(options)
|
215
234
|
end
|
216
235
|
|
217
|
-
# Performs a
|
218
|
-
#
|
236
|
+
# Performs a **pan** heading _down_ on the screen.
|
237
|
+
#
|
238
|
+
# @see #pan
|
219
239
|
def pan_screen_down(options={})
|
220
240
|
_pan_screen_down(options)
|
221
241
|
end
|
222
242
|
|
223
|
-
# Performs a
|
243
|
+
# Performs a **flick** on the first view that matches `query`.
|
244
|
+
#
|
224
245
|
# A flick is a straight line swipe that **lifts the finger while
|
225
246
|
# the gesture is still in motion**. This will often cause scrollable
|
226
247
|
# views to continue moving for some time after the gesture is released.
|
@@ -257,91 +278,163 @@ module Calabash
|
|
257
278
|
Device.default.flick(Query.new(query), from, to, options)
|
258
279
|
end
|
259
280
|
|
260
|
-
# Performs a
|
261
|
-
# @see flick
|
281
|
+
# Performs a **flick** heading _left_ on the first view that matches `query`.
|
282
|
+
# @see #flick
|
262
283
|
def flick_left(query, options={})
|
263
284
|
flick(query, {x: 90, y: 50}, {x: 10, y: 50}, options)
|
264
285
|
end
|
265
286
|
|
266
|
-
# Performs a
|
287
|
+
# Performs a **flick** heading _right_ on the first view that matches
|
267
288
|
# `query`.
|
268
|
-
# @see flick
|
289
|
+
# @see #flick
|
269
290
|
def flick_right(query, options={})
|
270
291
|
flick(query, {x: 10, y: 50}, {x: 90, y: 50}, options)
|
271
292
|
end
|
272
293
|
|
273
|
-
# Performs a
|
274
|
-
# @see flick
|
294
|
+
# Performs a **flick** heading _up_ on the first view that matches `query`.
|
295
|
+
# @see #flick
|
275
296
|
def flick_up(query, options={})
|
276
297
|
flick(query, {x: 50, y: 90}, {x: 50, y: 10}, options)
|
277
298
|
end
|
278
299
|
|
279
|
-
# Performs a
|
280
|
-
# @see flick
|
300
|
+
# Performs a **flick** heading _down_ on the first view that matches `query`.
|
301
|
+
# @see #flick
|
281
302
|
def flick_down(query, options={})
|
282
303
|
flick(query, {x: 50, y: 10}, {x: 50, y: 90}, options)
|
283
304
|
end
|
284
305
|
|
285
|
-
# Performs a
|
286
|
-
# @see
|
306
|
+
# Performs a **flick** heading _left_ on the screen.
|
307
|
+
# @see #flick
|
287
308
|
def flick_screen_left(options={})
|
288
309
|
flick_left('*', options)
|
289
310
|
end
|
290
311
|
|
291
|
-
# Performs a
|
292
|
-
# @see
|
312
|
+
# Performs a **flick** heading _right_ on the screen.
|
313
|
+
# @see #flick
|
293
314
|
def flick_screen_right(options={})
|
294
315
|
flick_right('*', options)
|
295
316
|
end
|
296
317
|
|
297
|
-
# Performs a
|
298
|
-
# @see
|
318
|
+
# Performs a **flick** heading _up_ on the screen.
|
319
|
+
# @see #flick
|
299
320
|
def flick_screen_up(options={})
|
300
321
|
_flick_screen_up(options)
|
301
322
|
end
|
302
323
|
|
303
|
-
# Performs a
|
304
|
-
# @see
|
324
|
+
# Performs a **flick** heading _down_ on the screen.
|
325
|
+
# @see #flick
|
305
326
|
def flick_screen_down(options={})
|
306
327
|
_flick_screen_down(options)
|
307
328
|
end
|
308
329
|
|
309
|
-
# Performs a
|
330
|
+
# Performs a **pinch** outwards on the first view match by `query`.
|
331
|
+
#
|
332
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
333
|
+
# to pinch.
|
334
|
+
# @param [Hash] options Options for controlling the pinch.
|
335
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
336
|
+
# the duration must be between 0.5 and 60.
|
337
|
+
#
|
338
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
339
|
+
# @raise [ArgumentError] If `query` is invalid.
|
340
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
310
341
|
def pinch_out(query, options={})
|
311
342
|
Device.default.pinch(:out, query, options)
|
312
343
|
end
|
313
344
|
|
314
|
-
# Performs a
|
345
|
+
# Performs a **pinch** inwards on the first view match by `query`.
|
346
|
+
#
|
347
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
348
|
+
# to pinch.
|
349
|
+
# @param [Hash] options Options for controlling the pinch.
|
350
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
351
|
+
# the duration must be between 0.5 and 60.
|
352
|
+
#
|
353
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
354
|
+
# @raise [ArgumentError] If `query` is invalid.
|
355
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
315
356
|
def pinch_in(query, options={})
|
316
357
|
Device.default.pinch(:in, query, options)
|
317
358
|
end
|
318
359
|
|
319
|
-
# Performs a
|
360
|
+
# Performs a **pinch** outwards on the screen.
|
361
|
+
#
|
362
|
+
# @param [Hash] options Options for controlling the pinch.
|
363
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
364
|
+
# the duration must be between 0.5 and 60.
|
365
|
+
#
|
366
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
367
|
+
# @raise [ArgumentError] If `query` is invalid.
|
368
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
320
369
|
def pinch_screen_out(options={})
|
321
370
|
_pinch_screen(:out, options)
|
322
371
|
end
|
323
372
|
|
324
|
-
# Performs a
|
373
|
+
# Performs a **pinch** inwards on the screen.
|
374
|
+
#
|
375
|
+
# @param [Hash] options Options for controlling the pinch.
|
376
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
377
|
+
# the duration must be between 0.5 and 60.
|
378
|
+
#
|
379
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
380
|
+
# @raise [ArgumentError] If `query` is invalid.
|
381
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
325
382
|
def pinch_screen_in(options={})
|
326
383
|
_pinch_screen(:in, options)
|
327
384
|
end
|
328
385
|
|
329
|
-
# Performs a
|
386
|
+
# Performs a **pinch** to zoom out.
|
387
|
+
#
|
388
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
389
|
+
# to pinch.
|
390
|
+
# @param [Hash] options Options for controlling the pinch.
|
391
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
392
|
+
# the duration must be between 0.5 and 60.
|
393
|
+
#
|
394
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
395
|
+
# @raise [ArgumentError] If `query` is invalid.
|
396
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
330
397
|
def pinch_to_zoom_out(query, options={})
|
331
398
|
_pinch_to_zoom(:out, query, options)
|
332
399
|
end
|
333
400
|
|
334
|
-
# Performs a
|
401
|
+
# Performs a **pinch** to zoom in.
|
402
|
+
#
|
403
|
+
# @param [String, Hash, Calabash::Query] query A query describing the view
|
404
|
+
# to pinch.
|
405
|
+
# @param [Hash] options Options for controlling the pinch.
|
406
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
407
|
+
# the duration must be between 0.5 and 60.
|
408
|
+
#
|
409
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
410
|
+
# @raise [ArgumentError] If `query` is invalid.
|
411
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
335
412
|
def pinch_to_zoom_in(query, options={})
|
336
413
|
_pinch_to_zoom(:in, query, options)
|
337
414
|
end
|
338
415
|
|
339
|
-
# Performs a
|
416
|
+
# Performs a **pinch** on the screen to zoom in.
|
417
|
+
#
|
418
|
+
# @param [Hash] options Options for controlling the pinch.
|
419
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
420
|
+
# the duration must be between 0.5 and 60.
|
421
|
+
#
|
422
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
423
|
+
# @raise [ArgumentError] If `query` is invalid.
|
424
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
340
425
|
def pinch_screen_to_zoom_in(options={})
|
341
426
|
_pinch_screen_to_zoom(:in, options)
|
342
427
|
end
|
343
428
|
|
344
|
-
# Performs a
|
429
|
+
# Performs a **pinch** on the screen to zoom out.
|
430
|
+
#
|
431
|
+
# @param [Hash] options Options for controlling the pinch.
|
432
|
+
# @option options [Numeric] :duration The duration of the pinch. On iOS,
|
433
|
+
# the duration must be between 0.5 and 60.
|
434
|
+
#
|
435
|
+
# @raise [ViewNotFoundError] If the `query` returns no results.
|
436
|
+
# @raise [ArgumentError] If `query` is invalid.
|
437
|
+
# @raise [ArgumentError] iOS: if the `:duration` is not between 0.5 and 60.
|
345
438
|
def pinch_screen_to_zoom_out(options={})
|
346
439
|
_pinch_screen_to_zoom(:out, options)
|
347
440
|
end
|