calabash 1.9.9.pre3 → 2.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -0
- data/bin/calabash +45 -36
- data/lib/calabash/android/build/builder.rb +1 -1
- data/lib/calabash/android/build/resigner.rb +19 -1
- data/lib/calabash/android/device.rb +13 -2
- data/lib/calabash/android/interactions.rb +104 -3
- data/lib/calabash/android/lib/TestServer.apk +0 -0
- data/lib/calabash/android/life_cycle.rb +5 -4
- data/lib/calabash/android/physical_buttons.rb +4 -1
- data/lib/calabash/android/scroll.rb +5 -0
- data/lib/calabash/android/text.rb +10 -25
- data/lib/calabash/android.rb +3 -0
- data/lib/calabash/cli/generate.rb +2 -0
- data/lib/calabash/console_helpers.rb +4 -2
- data/lib/calabash/device.rb +1 -9
- data/lib/calabash/environment.rb +4 -0
- data/lib/calabash/gestures.rb +159 -66
- data/lib/calabash/http/retriable_client.rb +1 -1
- data/lib/calabash/interactions.rb +67 -5
- data/lib/calabash/ios/conditions.rb +0 -1
- data/lib/calabash/ios/device/device_implementation.rb +17 -5
- data/lib/calabash/ios/device/gestures_mixin.rb +202 -48
- data/lib/calabash/ios/device/rotation_mixin.rb +10 -8
- data/lib/calabash/ios/device/routes/handle_route_mixin.rb +5 -1
- data/lib/calabash/ios/device/runtime_attributes.rb +4 -5
- data/lib/calabash/ios/gestures.rb +82 -8
- data/lib/calabash/ios/orientation.rb +21 -21
- data/lib/calabash/ios/runtime.rb +146 -2
- data/lib/calabash/ios/slider.rb +70 -0
- data/lib/calabash/ios/text.rb +6 -2
- data/lib/calabash/ios/uia.rb +24 -2
- data/lib/calabash/ios.rb +2 -0
- data/lib/calabash/lib/skeleton/features/support/dry_run.rb +8 -0
- data/lib/calabash/life_cycle.rb +59 -30
- data/lib/calabash/location.rb +0 -1
- data/lib/calabash/orientation.rb +0 -1
- data/lib/calabash/page.rb +38 -5
- data/lib/calabash/patch/array.rb +7 -7
- data/lib/calabash/query.rb +17 -2
- data/lib/calabash/query_result.rb +10 -0
- data/lib/calabash/screenshot.rb +28 -8
- data/lib/calabash/text.rb +52 -8
- data/lib/calabash/utility.rb +3 -3
- data/lib/calabash/version.rb +1 -1
- data/lib/calabash/wait.rb +33 -11
- data/lib/calabash.rb +124 -13
- metadata +114 -111
data/lib/calabash/ios/runtime.rb
CHANGED
@@ -1,16 +1,160 @@
|
|
1
1
|
module Calabash
|
2
2
|
module IOS
|
3
|
-
|
3
|
+
|
4
|
+
# Methods that describe the runtime attributes of the device under test.
|
5
|
+
#
|
6
|
+
# @note The key/value pairs in the Hash returned by #runtime_details are
|
7
|
+
# not stable and can change at any time. Don't write tests that rely on
|
8
|
+
# specific keys or values in this Hash. Instead, use the API methods
|
9
|
+
# defined in this class.
|
4
10
|
module Runtime
|
5
11
|
|
6
|
-
#
|
12
|
+
# Is the device under test a simulator?
|
7
13
|
def simulator?
|
8
14
|
Calabash::IOS::Device.default.simulator?
|
9
15
|
end
|
10
16
|
|
17
|
+
# Is the device under test a physical device?
|
11
18
|
def physical_device?
|
12
19
|
Calabash::IOS::Device.default.physical_device?
|
13
20
|
end
|
21
|
+
|
22
|
+
# Is the device under test an iPad?
|
23
|
+
def ipad?
|
24
|
+
Calabash::IOS::Device.default.device_family == 'iPad'
|
25
|
+
end
|
26
|
+
|
27
|
+
# Is the device under test an iPhone?
|
28
|
+
def iphone?
|
29
|
+
Calabash::IOS::Device.default.device_family == 'iPhone'
|
30
|
+
end
|
31
|
+
|
32
|
+
# Is the device under test an iPod?
|
33
|
+
def ipod?
|
34
|
+
Calabash::IOS::Device.default.device_family == 'iPod'
|
35
|
+
end
|
36
|
+
|
37
|
+
# Is the device under test an iPhone or iPod?
|
38
|
+
def device_family_iphone?
|
39
|
+
iphone? or ipod?
|
40
|
+
end
|
41
|
+
|
42
|
+
# Is the app that is being tested an iPhone app emulated on an iPad?
|
43
|
+
#
|
44
|
+
# An iPhone only app running on an iPad will be displayed in an emulated
|
45
|
+
# mode. Starting in iOS 7, such apps will always be launched in 2x mode.
|
46
|
+
def iphone_app_emulated_on_ipad?
|
47
|
+
Calabash::IOS::Device.default.iphone_app_emulated_on_ipad?
|
48
|
+
end
|
49
|
+
|
50
|
+
# Is the device under test have a 4 inch screen?
|
51
|
+
def iphone_4in?
|
52
|
+
Calabash::IOS::Device.default.form_factor == 'iphone 4in'
|
53
|
+
end
|
54
|
+
|
55
|
+
# Is the device under test an iPhone 6.
|
56
|
+
def iphone_6?
|
57
|
+
Calabash::IOS::Device.default.form_factor == 'iphone 6'
|
58
|
+
end
|
59
|
+
|
60
|
+
# Is the device under test an iPhone 6+?
|
61
|
+
def iphone_6_plus?
|
62
|
+
Calabash::IOS::Device.default.form_factor == 'iphone 6 +'
|
63
|
+
end
|
64
|
+
|
65
|
+
# Is the device under test an iPhone 3.5in?
|
66
|
+
def iphone_35in?
|
67
|
+
Calabash::IOS::Device.default.form_factor == 'iphone 3.5in'
|
68
|
+
end
|
69
|
+
|
70
|
+
# The screen dimensions and details about scale and sample rates.
|
71
|
+
#
|
72
|
+
# @example
|
73
|
+
# > app_screen_details
|
74
|
+
# => {
|
75
|
+
# :height => 1,
|
76
|
+
# :height => 1334,
|
77
|
+
# :width => 750,
|
78
|
+
# :scale => 2
|
79
|
+
# }
|
80
|
+
#
|
81
|
+
# @return [Hash] See the example.
|
82
|
+
def app_screen_details
|
83
|
+
Calabash::IOS::Device.default.screen_dimensions
|
84
|
+
end
|
85
|
+
|
86
|
+
# The version of iOS running on the test device.
|
87
|
+
#
|
88
|
+
# @example
|
89
|
+
# > ios_version.major
|
90
|
+
# > ios_version.minor
|
91
|
+
# > ios_version.patch
|
92
|
+
#
|
93
|
+
# @return [RunLoop::Version] A version object.
|
94
|
+
def ios_version
|
95
|
+
Calabash::IOS::Device.default.ios_version
|
96
|
+
end
|
97
|
+
|
98
|
+
# Is the device under test running iOS 6?
|
99
|
+
def ios6?
|
100
|
+
ios_version.major == 6
|
101
|
+
end
|
102
|
+
|
103
|
+
# Is the device under test running iOS 7?
|
104
|
+
def ios7?
|
105
|
+
ios_version.major == 7
|
106
|
+
end
|
107
|
+
|
108
|
+
# Is the device under test running iOS 8?
|
109
|
+
def ios8?
|
110
|
+
ios_version.major == 8
|
111
|
+
end
|
112
|
+
|
113
|
+
# Is the device under test running iOS 9?
|
114
|
+
def ios9?
|
115
|
+
ios_version.major == 9
|
116
|
+
end
|
117
|
+
|
118
|
+
# The version of the Calabash iOS Server running in the app.
|
119
|
+
#
|
120
|
+
# @example
|
121
|
+
# > server_version.major
|
122
|
+
# > server_version.minor
|
123
|
+
# > server_version.patch
|
124
|
+
#
|
125
|
+
# @return [RunLoop::Version] A version object.
|
126
|
+
def server_version
|
127
|
+
Calabash::IOS::Device.default.server_version
|
128
|
+
end
|
129
|
+
|
130
|
+
# Details about the version of the app under test.
|
131
|
+
#
|
132
|
+
# Will always contain these two keys:
|
133
|
+
#
|
134
|
+
# * :bundle_version => CFBundleVersion
|
135
|
+
# * :short_version => CFBundleShortVersionString
|
136
|
+
#
|
137
|
+
# It may contain other key/value pairs.
|
138
|
+
#
|
139
|
+
# @return [Hash] Key/value pairs that describe the version of the app
|
140
|
+
# under test.
|
141
|
+
def app_version_details
|
142
|
+
hash = runtime_details
|
143
|
+
{
|
144
|
+
:bundle_version => hash['app_version'],
|
145
|
+
:short_version => hash['short_version_string']
|
146
|
+
}
|
147
|
+
end
|
148
|
+
|
149
|
+
# A hash of all the details about the runtime environment.
|
150
|
+
#
|
151
|
+
# @note The key/value pairs in this Hash are subject to change. Don't
|
152
|
+
# write tests that rely on a specific key appearing in the Hash. Use
|
153
|
+
# the methods in the {Calabash::IOS::Runtime} module instead.
|
154
|
+
# @return[Hash] Key/value pairs that describe the runtime environment.
|
155
|
+
def runtime_details
|
156
|
+
Calabash::IOS::Device.default.runtime_details
|
157
|
+
end
|
14
158
|
end
|
15
159
|
end
|
16
160
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Calabash
|
2
|
+
module IOS
|
3
|
+
|
4
|
+
# An interface for interacting with UISliders.
|
5
|
+
module Slider
|
6
|
+
|
7
|
+
# Sets the value of the first UISliders matched by `query` to `value`.
|
8
|
+
#
|
9
|
+
# If `query` matches a view that is not a UISlider or UISlider subclass,
|
10
|
+
# an error will be raised.
|
11
|
+
#
|
12
|
+
# An error will be raised if more than on view is matched by `query`.
|
13
|
+
#
|
14
|
+
# To avoid matching more than one UISlider (or subclass):
|
15
|
+
# * Make the query more specific: "UISlider marked:'volume'"
|
16
|
+
# * Use the index language feature: "UISlider index:0"
|
17
|
+
#
|
18
|
+
# @example
|
19
|
+
# slider_set_value("UISlider marked:'office slider'", 2)
|
20
|
+
# slider_set_value("slider marked:'weather slider'", -1)
|
21
|
+
# slider_set_value("UISlider", 11)
|
22
|
+
#
|
23
|
+
# @param [String, Hash, Calabash::Query] query A query to that indicates
|
24
|
+
# in which slider to set the value.
|
25
|
+
# @param [Numeric] value The value to set the slider to. value.to_s should
|
26
|
+
# produce a String representation of a Number.
|
27
|
+
#
|
28
|
+
# @param [options] options Options to control the behavior of the gesture.
|
29
|
+
# @option options [Boolean] :animate (true) Animate the change.
|
30
|
+
# @option options [Boolean] :notify_targets (true) Simulate a UIEvent by
|
31
|
+
# calling every target/action pair defined on the UISlider matching
|
32
|
+
# `query`.
|
33
|
+
#
|
34
|
+
# @raise [RuntimeError] When `query` does not match exactly one slider.
|
35
|
+
# @raise [RuntimeError] When setting the value of the slider matched by
|
36
|
+
# `query` is not successful.
|
37
|
+
def slider_set_value(query, value, options={})
|
38
|
+
Query.ensure_valid_query(query)
|
39
|
+
|
40
|
+
default_options = {
|
41
|
+
:animate => true,
|
42
|
+
:notify_targets => true
|
43
|
+
}
|
44
|
+
|
45
|
+
merged_options = default_options.merge(options)
|
46
|
+
|
47
|
+
found_none = "Expected '#{query}' to match exactly one view, but found no matches."
|
48
|
+
query_object = Query.new(query)
|
49
|
+
wait_for(found_none) do
|
50
|
+
results = query(query_object)
|
51
|
+
if results.length > 1
|
52
|
+
message = [
|
53
|
+
"Expected '#{query}' to match exactly one view, but found '#{results.length}'",
|
54
|
+
results.join("\n")
|
55
|
+
].join("\n")
|
56
|
+
fail(message)
|
57
|
+
else
|
58
|
+
results.length == 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
value_str = value.to_s
|
63
|
+
|
64
|
+
args = [merged_options[:animate], merged_options[:notify_targets]]
|
65
|
+
|
66
|
+
Device.default.map_route(query, :changeSlider, value_str, *args)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/calabash/ios/text.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Calabash
|
2
2
|
module IOS
|
3
3
|
# Methods for entering text and interacting with iOS keyboards.
|
4
|
-
# @!visibility private
|
5
4
|
module Text
|
6
5
|
# @!visibility private
|
7
6
|
def _enter_text(text)
|
@@ -128,7 +127,12 @@ module Calabash
|
|
128
127
|
# @todo Refactor uia_route to a public API call
|
129
128
|
# @todo Move this documentation to the public method
|
130
129
|
# @!visibility private
|
131
|
-
def
|
130
|
+
def _tap_keyboard_action_key(action_key)
|
131
|
+
unless action_key.nil?
|
132
|
+
raise ArgumentError,
|
133
|
+
"An iOS keyboard does not have multiple action keys"
|
134
|
+
end
|
135
|
+
|
132
136
|
char_sequence = ESCAPED_KEYBOARD_CHARACTERS[:action]
|
133
137
|
Device.default.uia_route("uia.keyboard().typeString('#{char_sequence}')")
|
134
138
|
end
|
data/lib/calabash/ios/uia.rb
CHANGED
@@ -1,22 +1,44 @@
|
|
1
1
|
module Calabash
|
2
2
|
module IOS
|
3
|
-
|
3
|
+
|
4
|
+
# Methods for interacting directly with Apple's UIAutomation API.
|
5
|
+
#
|
6
|
+
# https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UsingtheAutomationInstrument/UsingtheAutomationInstrument.html
|
7
|
+
# https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/
|
8
|
+
#
|
9
|
+
# Calabash iOS uses this API to perform gestures. It is sometimes helpful
|
10
|
+
# to drop down into this API to explore your app.
|
4
11
|
module UIA
|
5
12
|
|
6
|
-
# Evaluates `script`
|
13
|
+
# Evaluates `script` using Apples's UIAutomation API.
|
7
14
|
#
|
15
|
+
# @example
|
16
|
+
# uia("UIATarget.localTarget().shake()")
|
17
|
+
# uia("UIATarget.localTarget().frontMostApp().keyboard().buttons()['Delete']")
|
18
|
+
# uia("UIATarget.localTarget().frontMostApp().mainWindow().elements()")
|
8
19
|
def uia(script)
|
9
20
|
Device.default.evaluate_uia(script)
|
10
21
|
end
|
11
22
|
|
23
|
+
# Evaluates `script` after prefixing with "UIATarget.localTarget()"
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# uia_with_target("shake()")
|
12
27
|
def uia_with_target(script)
|
13
28
|
uia("UIATarget.localTarget().#{script}")
|
14
29
|
end
|
15
30
|
|
31
|
+
# Evaluates `script` after prefixing with
|
32
|
+
# "UIATarget.localTarget().frontMostApp()"
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
# uia_with_app("keyboard().buttons()['Delete'])
|
16
36
|
def uia_with_app(script)
|
17
37
|
uia("UIATarget.localTarget().frontMostApp().#{script}")
|
18
38
|
end
|
19
39
|
|
40
|
+
# Evaluates `script` after prefixing with
|
41
|
+
# "UIATarget.localTarget().frontMostApp().mainWindow()"
|
20
42
|
def uia_with_main_window(script)
|
21
43
|
uia("UIATarget.localTarget().frontMostApp().mainWindow().#{script}")
|
22
44
|
end
|
data/lib/calabash/ios.rb
CHANGED
@@ -30,6 +30,7 @@ module Calabash
|
|
30
30
|
require 'calabash/ios/scroll'
|
31
31
|
require 'calabash/ios/runtime'
|
32
32
|
require 'calabash/ios/gestures'
|
33
|
+
require 'calabash/ios/slider'
|
33
34
|
|
34
35
|
include Calabash::IOS::Conditions
|
35
36
|
include Calabash::IOS::Orientation
|
@@ -39,6 +40,7 @@ module Calabash
|
|
39
40
|
include Calabash::IOS::Scroll
|
40
41
|
include Calabash::IOS::Runtime
|
41
42
|
include Calabash::IOS::Gestures
|
43
|
+
include Calabash::IOS::Slider
|
42
44
|
|
43
45
|
end
|
44
46
|
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# Cucumber does not load env.rb when running a dry-run. As the pages inherit
|
2
|
+
# from Calabash::Page and assert that the scopes IOS and Android are defined,
|
3
|
+
# we should require calabash.
|
4
|
+
|
5
|
+
if ARGV.include?('--dry-run')
|
6
|
+
require 'calabash/android'
|
7
|
+
require 'calabash/ios'
|
8
|
+
end
|
data/lib/calabash/life_cycle.rb
CHANGED
@@ -1,58 +1,85 @@
|
|
1
1
|
module Calabash
|
2
|
-
# @!visibility private
|
3
2
|
module LifeCycle
|
4
|
-
|
5
|
-
|
3
|
+
# Start the given application (and its test-server) on the port of
|
4
|
+
# {Calabash::Defaults#default_server Calabash.default_server}.
|
5
|
+
# This method will **not** install the application specified. If no
|
6
|
+
# application is given, it will start
|
7
|
+
# {Calabash::Defaults#default_application Calabash.default_application}
|
8
|
+
#
|
9
|
+
# @note This method will fail if the application (and test-server for
|
10
|
+
# Android) is not installed, or if the application installed is not the
|
11
|
+
# same as the one specified.
|
12
|
+
#
|
13
|
+
# @note On Android, if a test-server is already running on the port of
|
14
|
+
# {Calabash::Defaults#default_server Calabash.default_server} then that
|
15
|
+
# application will be shut down.
|
16
|
+
#
|
17
|
+
# @param [String, Calabash::Application] path_or_application A path to the
|
18
|
+
# application, or an instance of {Calabash::Application}.
|
19
|
+
# Defaults to
|
20
|
+
# {Calabash::Defaults#default_application Calabash.default_application}
|
21
|
+
# @param [Hash] options Options for specifying the details the app start
|
22
|
+
# @option options [Hash] :activity Android-only. Specify which activity
|
23
|
+
# to start. If none is given, launch the default launchable activity.
|
24
|
+
# @option options [Hash] :extras Android-only. Specify the extras for the
|
25
|
+
# startup intent.
|
26
|
+
def start_app(path_or_application = nil, **options)
|
27
|
+
path_or_application ||= Calabash.default_application
|
6
28
|
|
7
29
|
unless path_or_application
|
8
|
-
raise 'No application given, and
|
30
|
+
raise 'No application given, and Calabash.default_application is not set'
|
9
31
|
end
|
10
32
|
|
11
|
-
Device.default.start_app(path_or_application,
|
33
|
+
Device.default.start_app(path_or_application, options.dup)
|
12
34
|
end
|
13
35
|
|
36
|
+
# Stop the app running on
|
37
|
+
# {Calabash::Defaults#default_server Calabash.default_server}
|
14
38
|
def stop_app
|
15
39
|
Device.default.stop_app
|
16
40
|
end
|
17
41
|
|
18
42
|
# Installs the given application. If the application is already installed,
|
19
43
|
# the application will be uninstalled, and installed afterwards. If no
|
20
|
-
# application is given, it will install
|
44
|
+
# application is given, it will install
|
45
|
+
# {Calabash::Defaults#default_application Calabash.default_application}
|
21
46
|
#
|
22
47
|
# If the given application is an instance of
|
23
|
-
#
|
48
|
+
# {Calabash::Android::Application}, the same procedure is executed for the
|
24
49
|
# test-server of the application, if it is set.
|
25
50
|
#
|
26
51
|
# @param [String, Calabash::Application] path_or_application A path to the
|
27
|
-
# application, or an instance of
|
28
|
-
#
|
52
|
+
# application, or an instance of {Calabash::Application}.
|
53
|
+
# Defaults to
|
54
|
+
# {Calabash::Defaults#default_application Calabash.default_application}
|
29
55
|
def install_app(path_or_application = nil)
|
30
|
-
path_or_application ||=
|
56
|
+
path_or_application ||= Calabash.default_application
|
31
57
|
|
32
58
|
unless path_or_application
|
33
|
-
raise 'No application given, and
|
59
|
+
raise 'No application given, and Calabash.default_application is not set'
|
34
60
|
end
|
35
61
|
|
36
62
|
Device.default.install_app(path_or_application)
|
37
63
|
end
|
38
64
|
|
39
65
|
# Installs the given application *if it is not already installed*. If no
|
40
|
-
# application is given, it will ensure `
|
66
|
+
# application is given, it will ensure `Calabash.default_application` is installed.
|
41
67
|
# If the application has changed, it will be installed using the same
|
42
|
-
# approach as
|
68
|
+
# approach as {#install_app}.
|
43
69
|
#
|
44
70
|
# If the given application is an instance of
|
45
|
-
#
|
71
|
+
# {Calabash::Android::Application}, the same procedure is executed for the
|
46
72
|
# test-server of the application, if it is set.
|
47
73
|
#
|
48
74
|
# @param [String, Calabash::Application] path_or_application A path to the
|
49
|
-
# application, or an instance of
|
50
|
-
#
|
75
|
+
# application, or an instance of {Calabash::Application}.
|
76
|
+
# Defaults to
|
77
|
+
# {Calabash::Defaults#default_application Calabash.default_application}
|
51
78
|
def ensure_app_installed(path_or_application = nil)
|
52
|
-
path_or_application ||=
|
79
|
+
path_or_application ||= Calabash.default_application
|
53
80
|
|
54
81
|
unless path_or_application
|
55
|
-
raise 'No application given, and
|
82
|
+
raise 'No application given, and Calabash.default_application is not set'
|
56
83
|
end
|
57
84
|
|
58
85
|
Device.default.ensure_app_installed(path_or_application)
|
@@ -60,16 +87,17 @@ module Calabash
|
|
60
87
|
|
61
88
|
# Uninstalls the given application. Does nothing if the application is
|
62
89
|
# already uninstalled. If no application is given, it will uninstall
|
63
|
-
#
|
90
|
+
# {Calabash::Defaults#default_application Calabash.default_application}
|
64
91
|
#
|
65
92
|
# @param [String, Calabash::Application] path_or_application A path to the
|
66
|
-
# application, or an instance of
|
67
|
-
#
|
93
|
+
# application, or an instance of {Calabash::Application}.
|
94
|
+
# Defaults to
|
95
|
+
# {Calabash::Defaults#default_application Calabash.default_application}
|
68
96
|
def uninstall_app(path_or_application = nil)
|
69
|
-
path_or_application ||=
|
97
|
+
path_or_application ||= Calabash.default_application
|
70
98
|
|
71
99
|
unless path_or_application
|
72
|
-
raise 'No application given, and
|
100
|
+
raise 'No application given, and Calabash.default_application is not set'
|
73
101
|
end
|
74
102
|
|
75
103
|
Device.default.uninstall_app(path_or_application)
|
@@ -77,16 +105,17 @@ module Calabash
|
|
77
105
|
|
78
106
|
# Clears the contents of the given application. This is roughly equivalent to
|
79
107
|
# reinstalling the application. If no application is given, it will clear
|
80
|
-
#
|
108
|
+
# {Calabash::Defaults#default_application Calabash.default_application}.
|
81
109
|
#
|
82
110
|
# @param [String, Calabash::Application] path_or_application A path to the
|
83
|
-
# application, or an instance of
|
84
|
-
#
|
111
|
+
# application, or an instance of {Calabash::Application}.
|
112
|
+
# Defaults to
|
113
|
+
# {Calabash::Defaults#default_application Calabash.default_application}
|
85
114
|
def clear_app_data(path_or_application = nil)
|
86
|
-
path_or_application ||=
|
115
|
+
path_or_application ||= Calabash.default_application
|
87
116
|
|
88
117
|
unless path_or_application
|
89
|
-
raise 'No application given, and
|
118
|
+
raise 'No application given, and Calabash.default_application is not set'
|
90
119
|
end
|
91
120
|
|
92
121
|
Device.default.clear_app_data(path_or_application)
|
@@ -96,8 +125,8 @@ module Calabash
|
|
96
125
|
# `for_seconds`. This should not exceed 60 seconds for iOS.
|
97
126
|
#
|
98
127
|
# On Android you can control the app lifecycle more granularly using
|
99
|
-
#
|
100
|
-
#
|
128
|
+
# {Calabash::Android::Interactions#go_home \#go_home} and
|
129
|
+
# {Calabash::Android::LifeCycle#resume_app \#resume_app}.
|
101
130
|
def send_current_app_to_background(for_seconds = 10)
|
102
131
|
_send_current_app_to_background(for_seconds)
|
103
132
|
|
data/lib/calabash/location.rb
CHANGED
data/lib/calabash/orientation.rb
CHANGED
data/lib/calabash/page.rb
CHANGED
@@ -5,12 +5,45 @@ module Calabash
|
|
5
5
|
|
6
6
|
def self.inherited(subclass)
|
7
7
|
# Define the page into global scope
|
8
|
-
|
8
|
+
full_name = subclass.name
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
if full_name == 'IOS' || full_name == 'Android'
|
11
|
+
raise "Invalid page name '#{full_name}'"
|
12
|
+
end
|
13
|
+
|
14
|
+
os_scope = full_name.split('::').first
|
15
|
+
|
16
|
+
if os_scope == 'IOS' || os_scope == 'Android'
|
17
|
+
page_name = full_name.split('::', 2).last
|
18
|
+
|
19
|
+
unless Calabash.is_defined?(page_name)
|
20
|
+
scopes = page_name.split('::')
|
21
|
+
|
22
|
+
previous_scope = ''
|
23
|
+
|
24
|
+
scopes[0..-2].each do |scope|
|
25
|
+
old_scope = Calabash.recursive_const_get("Object::#{os_scope}#{previous_scope}")
|
26
|
+
new_scope = Calabash.recursive_const_get("Object#{previous_scope}")
|
27
|
+
|
28
|
+
old_const = old_scope.const_get(scope.to_sym)
|
29
|
+
|
30
|
+
if new_scope.const_defined?(scope.to_sym)
|
31
|
+
new_scope.send(:remove_const, scope.to_sym)
|
32
|
+
end
|
33
|
+
|
34
|
+
new_scope.const_set(scope.to_sym, old_const.class.allocate)
|
35
|
+
|
36
|
+
previous_scope << "::#{scope}"
|
37
|
+
end
|
38
|
+
|
39
|
+
simple_page_name = page_name.split('::').last.to_sym
|
40
|
+
new_scope = Calabash.recursive_const_get("Object#{previous_scope}")
|
41
|
+
|
42
|
+
unless new_scope.const_defined?(simple_page_name, false)
|
43
|
+
clz = Class.new(StubPage)
|
44
|
+
new_scope.const_set(simple_page_name, clz)
|
45
|
+
end
|
46
|
+
end
|
14
47
|
end
|
15
48
|
end
|
16
49
|
|
data/lib/calabash/patch/array.rb
CHANGED
@@ -4,13 +4,13 @@ module Calabash
|
|
4
4
|
|
5
5
|
# @!visibility private
|
6
6
|
module Array
|
7
|
-
def to_pct
|
8
|
-
if length != 2
|
9
|
-
raise RangeError, "Cannot convert #{self} to {:x, :y} hash"
|
10
|
-
end
|
11
|
-
|
12
|
-
{x: self.[](0), y: self.[](1)}
|
13
|
-
end
|
7
|
+
# def to_pct
|
8
|
+
# if length != 2
|
9
|
+
# raise RangeError, "Cannot convert #{self} to {:x, :y} hash"
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# {x: self.[](0), y: self.[](1)}
|
13
|
+
# end
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/calabash/query.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Calabash
|
2
2
|
|
3
3
|
# A representation of a Calabash query.
|
4
|
-
# @todo Query needs more documentation.
|
5
|
-
# @todo Query needs some methods moved to private or doc'd private.
|
6
4
|
class Query
|
7
5
|
# @!visibility private
|
8
6
|
def self.web_query?(query_string)
|
@@ -110,6 +108,13 @@ module Calabash
|
|
110
108
|
result
|
111
109
|
end
|
112
110
|
|
111
|
+
# Create a new query. The returned instance will be frozen (immutable).
|
112
|
+
#
|
113
|
+
# @example
|
114
|
+
# Calabash::Query.new({marked: 'mark'})
|
115
|
+
# Calabash::Query.new("myview")
|
116
|
+
#
|
117
|
+
# @param [String, Hash, Calabash::Query] query The query to create
|
113
118
|
def initialize(query)
|
114
119
|
unless query.is_a?(Query) || query.is_a?(Hash) || query.is_a?(String)
|
115
120
|
raise ArgumentError, "Invalid argument for query: '#{query}' (#{query.class})"
|
@@ -120,6 +125,13 @@ module Calabash
|
|
120
125
|
freeze
|
121
126
|
end
|
122
127
|
|
128
|
+
# Parse the query to it's string representation.
|
129
|
+
#
|
130
|
+
# @example
|
131
|
+
# puts Calabash::Query.new({marked: 'foo'})
|
132
|
+
# # => "* marked:'foo'"
|
133
|
+
#
|
134
|
+
# @!visibility private
|
123
135
|
def to_s
|
124
136
|
if @query.is_a?(Query)
|
125
137
|
@query.to_s
|
@@ -130,14 +142,17 @@ module Calabash
|
|
130
142
|
end
|
131
143
|
end
|
132
144
|
|
145
|
+
# @!visibility private
|
133
146
|
def inspect
|
134
147
|
"<Calabash::Query #{@query.inspect}>"
|
135
148
|
end
|
136
149
|
|
150
|
+
# @!visibility private
|
137
151
|
def web_query?
|
138
152
|
Query.web_query?(to_s)
|
139
153
|
end
|
140
154
|
|
155
|
+
# @!visibility private
|
141
156
|
WEB_QUERY_INDICATORS =
|
142
157
|
[
|
143
158
|
{
|