calabash-android 0.4.22.pre4 → 0.5.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/calabash-android +66 -45
- data/lib/calabash-android/calabash_steps.rb +0 -8
- data/lib/calabash-android/canned_steps.md +2 -30
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +199 -23
- data/lib/calabash-android/removed_actions.txt +52 -0
- data/lib/calabash-android/steps/assert_steps.rb +9 -24
- data/lib/calabash-android/steps/check_box_steps.rb +2 -2
- data/lib/calabash-android/steps/context_menu_steps.rb +11 -4
- data/lib/calabash-android/steps/date_picker_steps.rb +2 -2
- data/lib/calabash-android/steps/enter_text_steps.rb +13 -13
- data/lib/calabash-android/steps/l10n_steps.rb +5 -5
- data/lib/calabash-android/steps/map_steps.rb +12 -12
- data/lib/calabash-android/steps/navigation_steps.rb +12 -12
- data/lib/calabash-android/steps/press_button_steps.rb +16 -12
- data/lib/calabash-android/steps/progress_steps.rb +19 -22
- data/lib/calabash-android/steps/search_steps.rb +2 -2
- data/lib/calabash-android/steps/spinner_steps.rb +10 -2
- data/lib/calabash-android/steps/time_picker_steps.rb +2 -2
- data/lib/calabash-android/version.rb +1 -1
- data/lib/calabash-android/wait_helpers.rb +29 -1
- data/test-server/instrumentation-backend/antlr/UIQuery.g +11 -11
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/CalabashInstrumentationTestRunner.java +3 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/InstrumentationBackend.java +9 -4
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +16 -12
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/application/Backdoor.java +55 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/LongPressCoordinate.java +19 -2
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptExecuter.java +105 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +27 -30
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +27 -18
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ComparisonOperator.java +7 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicate.java +16 -4
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +13 -6
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +94 -48
- metadata +5 -59
- data/lib/calabash-android/steps/additions_manual_steps.rb +0 -11
- data/lib/calabash-android/steps/app_steps.rb +0 -10
- data/lib/calabash-android/steps/list_steps.rb +0 -41
- data/lib/calabash-android/steps/rotation_steps.rb +0 -7
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/button/PressButtonNumber.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/button/PressButtonText.java +0 -27
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/button/PressImageButtonDescription.java +0 -39
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/button/PressImageButtonNumber.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/button/WaitForButton.java +0 -47
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/checkbox/ToggleCheckboxNumber.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/contextmenu/LongPressText.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/contextmenu/LongPressTextAndSelectFromMenuById.java +0 -26
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/contextmenu/LongPressTextAndSelectFromMenuByIndex.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/contextmenu/LongPressTextAndSelectFromMenuByText.java +0 -26
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/helpers/InspectCurrentDialog.java +0 -76
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListData.java +0 -85
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemProperties.java +0 -194
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/GetListItemText.java +0 -136
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/LongPressListItems.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/list/PressListItems.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/scrolling/ScrollDown.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/scrolling/ScrollUp.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/search/EnterQueryByIndex.java +0 -29
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/SelectFromMenuByText.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/spinner/GetSelectedSpinnerItemText.java +0 -36
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/spinner/SelectSpinnerItemByContentDescription.java +0 -43
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/AssertGridViewContainsNoDuplicates.java +0 -72
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/AssertText.java +0 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/AssertTextOfSpecificTextViewByContentDescription.java +0 -32
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/ClearTextById.java +0 -30
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/ClearTextByIndex.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/ClearTextFieldByContentDescription.java +0 -33
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/ClickOnText.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/EnterTextByContentDescription.java +0 -32
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/EnterTextById.java +0 -33
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/EnterTextByIndex.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/text/GetTextById.java +0 -42
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/AssertViewProperty.java +0 -141
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/ClickOnViewByDescription.java +0 -46
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/ClickOnViewById.java +0 -56
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/GetViewProperty.java +0 -101
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/HasView.java +0 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/IsEnabled.java +0 -30
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/LongPressOnViewById.java +0 -34
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/Press.java +0 -89
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/view/SelectTab.java +0 -110
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/Wait.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForDialogClose.java +0 -21
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForProgress.java +0 -47
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForScreen.java +0 -54
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForTab.java +0 -108
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForText.java +0 -37
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForView.java +0 -43
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/wait/WaitForViewById.java +0 -58
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +0 -44
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +0 -70
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a378465ba71fd03e09901a56b34e16b780d0753
|
4
|
+
data.tar.gz: 8e9117755d320057f9cc55e842c448d45db6c726
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14cbc8db152ca204468d1549cd7a96bc032198897eac5e9702941d6b3cc862025b7fc8792031937b97323046a8b3510543f435705ae0ea515559a8a19ab22ced
|
7
|
+
data.tar.gz: 4c2c2504a207311335d62e2680a1b582852278bfe106d1812622dcbb92866f56553ef7771eb20051ff2ede477f1311e602623da3852b86043f9678b3a2be47f9
|
data/bin/calabash-android
CHANGED
@@ -51,51 +51,72 @@ def relative_to_full_path(file_path)
|
|
51
51
|
File.expand_path(file_path)
|
52
52
|
end
|
53
53
|
|
54
|
-
if
|
54
|
+
if ARGV.length == 0
|
55
55
|
print_usage
|
56
|
-
|
57
|
-
cmd = ARGV.shift
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
56
|
+
else
|
57
|
+
cmd = ARGV.shift
|
58
|
+
|
59
|
+
case cmd
|
60
|
+
when 'help'
|
61
|
+
print_help
|
62
|
+
when 'build'
|
63
|
+
Env.exit_if_env_not_set_up
|
64
|
+
|
65
|
+
if ARGV.empty?
|
66
|
+
puts "Please specify the app you want to build a test server for"
|
67
|
+
exit 1
|
68
|
+
elsif !File.exist?(ARGV.first)
|
69
|
+
puts "Could not find file '#{ARGV.first}'"
|
70
|
+
exit 1
|
71
|
+
elsif !is_apk_file?(ARGV.first)
|
72
|
+
puts "'#{ARGV.first}' is not a valid android application"
|
73
|
+
exit 1
|
74
|
+
else
|
75
|
+
while not ARGV.empty? and is_apk_file?(ARGV.first)
|
76
|
+
calabash_build(relative_to_full_path(ARGV.shift))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
when 'run'
|
80
|
+
Env.exit_if_env_not_set_up
|
81
|
+
if ARGV.empty? or not is_apk_file?(ARGV.first)
|
82
|
+
puts "The first parameter must be the path to the apk file."
|
83
|
+
exit 1
|
84
|
+
else
|
85
|
+
exit calabash_run(relative_to_full_path(ARGV.shift))
|
86
|
+
end
|
87
|
+
when 'gen'
|
88
|
+
calabash_scaffold
|
89
|
+
when 'console'
|
90
|
+
Env.exit_if_env_not_set_up
|
91
|
+
|
92
|
+
if ARGV.empty? or not is_apk_file?(ARGV.first)
|
93
|
+
puts "The first parameter must be the path to the apk file."
|
94
|
+
exit 1
|
95
|
+
else
|
96
|
+
calabash_console(relative_to_full_path(ARGV.shift))
|
97
|
+
end
|
98
|
+
when 'setup'
|
99
|
+
Env.exit_if_env_not_set_up
|
100
|
+
calabash_setup
|
101
|
+
when 'resign'
|
102
|
+
Env.exit_if_env_not_set_up
|
103
|
+
|
104
|
+
if ARGV.empty?
|
105
|
+
puts "Please specify the app you want to resign"
|
106
|
+
exit 1
|
107
|
+
elsif !File.exist?(ARGV.first)
|
108
|
+
puts "Could not find file '#{ARGV.first}'"
|
109
|
+
exit 1
|
110
|
+
elsif !is_apk_file?(ARGV.first)
|
111
|
+
puts "'#{ARGV.first}' is not a valid android application"
|
112
|
+
exit 1
|
113
|
+
else
|
114
|
+
resign_apk(File.expand_path(ARGV.first))
|
115
|
+
end
|
116
|
+
when 'version'
|
117
|
+
puts Calabash::Android::VERSION
|
70
118
|
else
|
71
|
-
|
72
|
-
|
73
|
-
elsif cmd == 'gen'
|
74
|
-
calabash_scaffold
|
75
|
-
elsif cmd == 'console'
|
76
|
-
Env.exit_if_env_not_set_up
|
77
|
-
if ARGV.empty?
|
78
|
-
puts "Please specify an app"
|
79
|
-
exit 1
|
119
|
+
puts "Invalid command '#{cmd}'"
|
120
|
+
print_usage
|
80
121
|
end
|
81
|
-
|
82
|
-
puts "No such file #{ARGV.first}"
|
83
|
-
exit 1
|
84
|
-
end
|
85
|
-
calabash_console(relative_to_full_path(ARGV.shift))
|
86
|
-
elsif cmd == 'setup'
|
87
|
-
Env.exit_if_env_not_set_up
|
88
|
-
calabash_setup
|
89
|
-
elsif cmd == 'resign'
|
90
|
-
Env.exit_if_env_not_set_up
|
91
|
-
unless File.exist?(File.expand_path(ARGV.first))
|
92
|
-
puts "No such file #{ARGV.first}"
|
93
|
-
exit 1
|
94
|
-
end
|
95
|
-
resign_apk(File.expand_path(ARGV.first))
|
96
|
-
|
97
|
-
elsif cmd == 'version'
|
98
|
-
puts Calabash::Android::VERSION
|
99
|
-
else
|
100
|
-
print_usage
|
101
|
-
end
|
122
|
+
end
|
@@ -1,9 +1,3 @@
|
|
1
|
-
|
2
|
-
WAIT_TIMEOUT = (ENV['WAIT_TIMEOUT'] || 30).to_f
|
3
|
-
STEP_PAUSE = (ENV['STEP_PAUSE'] || 0.5).to_f
|
4
|
-
|
5
|
-
require 'calabash-android/steps/additions_manual_steps'
|
6
|
-
require 'calabash-android/steps/app_steps'
|
7
1
|
require 'calabash-android/steps/assert_steps'
|
8
2
|
require 'calabash-android/steps/check_box_steps'
|
9
3
|
require 'calabash-android/steps/context_menu_steps'
|
@@ -13,10 +7,8 @@ require 'calabash-android/steps/location_steps'
|
|
13
7
|
require 'calabash-android/steps/navigation_steps'
|
14
8
|
require 'calabash-android/steps/press_button_steps'
|
15
9
|
require 'calabash-android/steps/progress_steps'
|
16
|
-
require 'calabash-android/steps/rotation_steps'
|
17
10
|
require 'calabash-android/steps/screenshot_steps'
|
18
11
|
require 'calabash-android/steps/search_steps'
|
19
12
|
require 'calabash-android/steps/spinner_steps'
|
20
13
|
require 'calabash-android/steps/time_picker_steps'
|
21
|
-
require 'calabash-android/steps/list_steps'
|
22
14
|
|
@@ -23,7 +23,7 @@ To assert that specified text cannot be found use any of the following steps.
|
|
23
23
|
Input steps
|
24
24
|
-----------
|
25
25
|
|
26
|
-
Then /^I toggle checkbox number (\d+)$/ do |
|
26
|
+
Then /^I toggle checkbox number (\d+)$/ do |checkbox_number|
|
27
27
|
Toggles checkout with the specified index.
|
28
28
|
|
29
29
|
Then /^I long press "([^\"]*)"$/ do |text_to_press|
|
@@ -246,7 +246,7 @@ Waits until the text of the translated l10nkey is displayed.
|
|
246
246
|
|
247
247
|
Note: you can assert or press interface elements using [Android's String resources](http://developer.android.com/reference/android/R.string.html) by passing a package in a custom step:
|
248
248
|
|
249
|
-
|
249
|
+
perform_action('press_l10n_element', 'ok', nil, 'android')
|
250
250
|
|
251
251
|
Rotation
|
252
252
|
--------
|
@@ -257,31 +257,3 @@ If you run the test on [LessPainful](https://www.lesspainful.com) they will actu
|
|
257
257
|
Then /^I rotate the device to landscape$/
|
258
258
|
Then /^I rotate the device to portrait$/
|
259
259
|
|
260
|
-
Manual Steps
|
261
|
-
------------
|
262
|
-
|
263
|
-
These steps are useful for allowing mixed manual and automated tests and to be documented
|
264
|
-
and kept together. These steps do nothing when the tests are run automatically but are still
|
265
|
-
documented in Cucumber output formatters such as the HTML report. This allows a
|
266
|
-
manual tester to perform the same test case but with extra manual steps such as manual image verification.
|
267
|
-
|
268
|
-
To manually request a manual tester to compare the screen with a reference image
|
269
|
-
|
270
|
-
Then /^I compare the current screen with the reference image "([^\"]*) manually"$/ do |name|
|
271
|
-
|
272
|
-
For example:
|
273
|
-
|
274
|
-
Then I compare the current screen with the reference image "features/ref1.png" manually
|
275
|
-
|
276
|
-
To manually perform a custom step
|
277
|
-
|
278
|
-
Then /^I manually (.*)$/ do |action|
|
279
|
-
|
280
|
-
For example:
|
281
|
-
|
282
|
-
Then I manually check that the list scrolls smoothly
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
Binary file
|
@@ -49,6 +49,20 @@ module Operations
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def performAction(action, *arguments)
|
52
|
+
puts "Warning: The method performAction is deprecated. Please use perform_action instead."
|
53
|
+
|
54
|
+
perform_action(action, *arguments)
|
55
|
+
end
|
56
|
+
|
57
|
+
def perform_action(action, *arguments)
|
58
|
+
@removed_actions = File.readlines(File.join(File.dirname(__FILE__), 'removed_actions.txt')) unless @removed_actions
|
59
|
+
@removed_actions.map! &:chomp
|
60
|
+
|
61
|
+
if @removed_actions.include?(action)
|
62
|
+
puts "Error: The action '#{action}' was removed in calabash-android x.x.x"
|
63
|
+
puts 'For more information visit: https://github.com/calabash-android/foo/bar'
|
64
|
+
end
|
65
|
+
|
52
66
|
default_device.perform_action(action, *arguments)
|
53
67
|
end
|
54
68
|
|
@@ -134,7 +148,13 @@ module Operations
|
|
134
148
|
converted_args = []
|
135
149
|
args.each do |arg|
|
136
150
|
if arg.is_a?(Hash) and arg.count == 1
|
137
|
-
|
151
|
+
if arg.values.is_a?(Array) && arg.values.count == 1
|
152
|
+
values = arg.values.flatten
|
153
|
+
else
|
154
|
+
values = [arg.values]
|
155
|
+
end
|
156
|
+
|
157
|
+
converted_args << {:method_name => arg.keys.first, :arguments => values}
|
138
158
|
else
|
139
159
|
converted_args << arg
|
140
160
|
end
|
@@ -393,7 +413,7 @@ module Operations
|
|
393
413
|
f.write res
|
394
414
|
end
|
395
415
|
else
|
396
|
-
screenshot_cmd = "java -jar #{File.join(File.dirname(__FILE__), 'lib', 'screenshotTaker.jar')} #{serial} #{path}"
|
416
|
+
screenshot_cmd = "java -jar #{File.join(File.dirname(__FILE__), 'lib', 'screenshotTaker.jar')} #{serial} \"#{path}\""
|
397
417
|
log screenshot_cmd
|
398
418
|
raise "Could not take screenshot" unless system(screenshot_cmd)
|
399
419
|
end
|
@@ -704,50 +724,90 @@ module Operations
|
|
704
724
|
raise(msg)
|
705
725
|
end
|
706
726
|
|
727
|
+
def has_text?(text)
|
728
|
+
!query("* {text CONTAINS[c] '#{text}'}").empty?
|
729
|
+
end
|
730
|
+
|
731
|
+
def assert_text(text, should_find = true)
|
732
|
+
raise "Text \"#{text}\" was #{should_find ? 'not ' : ''}found." if has_text?(text) ^ should_find
|
733
|
+
|
734
|
+
true
|
735
|
+
end
|
736
|
+
|
707
737
|
def double_tap(uiquery, options = {})
|
708
738
|
center_x, center_y = find_coordinate(uiquery)
|
709
739
|
|
710
|
-
|
740
|
+
perform_action("double_tap_coordinate", center_x, center_y)
|
711
741
|
end
|
712
742
|
|
743
|
+
# Performs a "long press" operation on a selected view
|
744
|
+
# Params:
|
745
|
+
# +uiquery+: a uiquery identifying one view
|
746
|
+
# +options[:length]+: the length of the long press in milliseconds (optional)
|
747
|
+
#
|
748
|
+
# Examples:
|
749
|
+
# - long_press("* id:'my_id'")
|
750
|
+
# - long_press("* id:'my_id'", {:length=>5000})
|
713
751
|
def long_press(uiquery, options = {})
|
714
752
|
center_x, center_y = find_coordinate(uiquery)
|
715
|
-
|
716
|
-
|
753
|
+
length = options[:length]
|
754
|
+
perform_action("long_press_coordinate", center_x, center_y, *(length unless length.nil?))
|
717
755
|
end
|
718
756
|
|
719
757
|
def touch(uiquery, options = {})
|
720
758
|
center_x, center_y = find_coordinate(uiquery)
|
721
759
|
|
722
|
-
|
760
|
+
perform_action("touch_coordinate", center_x, center_y)
|
723
761
|
end
|
724
762
|
|
725
763
|
def keyboard_enter_text(text, options = {})
|
726
|
-
|
764
|
+
perform_action('keyboard_enter_text', text)
|
727
765
|
end
|
728
766
|
|
729
767
|
def enter_text(uiquery, text, options = {})
|
730
|
-
|
768
|
+
tap_when_element_exists(uiquery, options)
|
731
769
|
sleep 0.5
|
732
770
|
keyboard_enter_text(text, options)
|
733
771
|
end
|
734
772
|
|
773
|
+
def clear_text(query_string, options={})
|
774
|
+
result = query(query_string, setText: '')
|
775
|
+
|
776
|
+
raise "No elements found. Query: #{query_string}" if result.empty?
|
777
|
+
|
778
|
+
true
|
779
|
+
end
|
780
|
+
|
735
781
|
def find_coordinate(uiquery)
|
736
782
|
raise "Cannot find nil" unless uiquery
|
737
783
|
|
784
|
+
element = execute_uiquery(uiquery)
|
785
|
+
|
786
|
+
raise "No elements found. Query: #{uiquery}" if element.nil?
|
787
|
+
|
788
|
+
center_x = element["rect"]["center_x"]
|
789
|
+
center_y = element["rect"]["center_y"]
|
790
|
+
|
791
|
+
[center_x, center_y]
|
792
|
+
end
|
793
|
+
|
794
|
+
def execute_uiquery(uiquery)
|
738
795
|
if uiquery.instance_of? String
|
739
796
|
elements = query(uiquery)
|
740
|
-
|
741
|
-
|
797
|
+
|
798
|
+
return elements.first unless elements.empty?
|
742
799
|
else
|
743
|
-
|
744
|
-
|
800
|
+
elements = uiquery
|
801
|
+
|
802
|
+
return elements.first if elements.instance_of?(Array)
|
803
|
+
return elements if elements.instance_of?(Hash)
|
745
804
|
end
|
746
805
|
|
747
|
-
|
748
|
-
|
806
|
+
nil
|
807
|
+
end
|
749
808
|
|
750
|
-
|
809
|
+
def step_deprecated
|
810
|
+
puts 'Warning: This predefined step is deprecated.'
|
751
811
|
end
|
752
812
|
|
753
813
|
def http(path, data = {}, options = {})
|
@@ -759,16 +819,52 @@ module Operations
|
|
759
819
|
end
|
760
820
|
|
761
821
|
def set_text(uiquery, txt)
|
762
|
-
|
763
|
-
|
822
|
+
puts "set_text is deprecated. Use enter_text instead"
|
823
|
+
enter_text(uiquery, txt)
|
824
|
+
end
|
825
|
+
|
826
|
+
def press_back_button
|
827
|
+
perform_action('go_back')
|
828
|
+
end
|
829
|
+
|
830
|
+
def press_menu_button
|
831
|
+
perform_action('press_menu')
|
832
|
+
end
|
833
|
+
|
834
|
+
def select_options_menu_item(text, options={})
|
835
|
+
press_menu_button
|
836
|
+
tap_when_element_exists("DropDownListView * marked:'#{text}'", options)
|
837
|
+
end
|
838
|
+
|
839
|
+
def select_context_menu_item(view_uiquery, menu_item_query_string)
|
840
|
+
long_press(view_uiquery)
|
841
|
+
|
842
|
+
container_class = 'com.android.internal.view.menu.ListMenuItemView'
|
843
|
+
wait_for_element_exists(container_class)
|
844
|
+
|
845
|
+
combined_query_string = "#{container_class} descendant #{menu_item_query_string}"
|
846
|
+
touch(combined_query_string)
|
847
|
+
end
|
848
|
+
|
849
|
+
def tap_when_element_exists(query_string, options={})
|
850
|
+
options.merge!({action: lambda {|q| touch(q)}})
|
764
851
|
|
765
|
-
if
|
766
|
-
|
852
|
+
if options[:scroll] == true
|
853
|
+
scroll_to(query_string, options)
|
767
854
|
else
|
768
|
-
|
855
|
+
when_element_exists(query_string, options)
|
769
856
|
end
|
770
857
|
end
|
771
858
|
|
859
|
+
def long_press_when_element_exists(query_string, options={})
|
860
|
+
options.merge!({action: lambda {|q| long_press(q)}})
|
861
|
+
|
862
|
+
if options[:scroll] == true
|
863
|
+
scroll_to(query_string, options)
|
864
|
+
else
|
865
|
+
when_element_exists(query_string, options)
|
866
|
+
end
|
867
|
+
end
|
772
868
|
|
773
869
|
def swipe(dir,options={})
|
774
870
|
ni
|
@@ -782,8 +878,82 @@ module Operations
|
|
782
878
|
ni
|
783
879
|
end
|
784
880
|
|
785
|
-
def
|
786
|
-
|
881
|
+
def scroll_up
|
882
|
+
scroll("android.widget.ScrollView", :up)
|
883
|
+
end
|
884
|
+
|
885
|
+
def scroll_down
|
886
|
+
scroll("android.widget.ScrollView", :down)
|
887
|
+
end
|
888
|
+
|
889
|
+
def scroll(query_string, direction)
|
890
|
+
if direction != :up && direction != :down
|
891
|
+
raise 'Only upwards and downwards scrolling is supported for now'
|
892
|
+
end
|
893
|
+
|
894
|
+
scroll_x = 0
|
895
|
+
scroll_y = 0
|
896
|
+
|
897
|
+
action = lambda do
|
898
|
+
element = query(query_string).first
|
899
|
+
raise "No elements found. Query: #{query_string}" if element.nil?
|
900
|
+
|
901
|
+
width = element['rect']['width']
|
902
|
+
height = element['rect']['height']
|
903
|
+
|
904
|
+
if direction == :up
|
905
|
+
scroll_y = -height/2
|
906
|
+
else
|
907
|
+
scroll_y = height/2
|
908
|
+
end
|
909
|
+
|
910
|
+
query(query_string, {scrollBy: [scroll_x.to_i, scroll_y.to_i]})
|
911
|
+
end
|
912
|
+
|
913
|
+
when_element_exists(query_string, action: action)
|
914
|
+
end
|
915
|
+
|
916
|
+
def scroll_to(query_string, options={})
|
917
|
+
options[:action] ||= lambda {}
|
918
|
+
|
919
|
+
all_query_string = query_string
|
920
|
+
|
921
|
+
unless all_query_string.chomp.downcase.start_with?('all')
|
922
|
+
all_query_string = "all #{all_query_string}"
|
923
|
+
end
|
924
|
+
|
925
|
+
wait_for_element_exists(all_query_string)
|
926
|
+
|
927
|
+
visibility_query_string = all_query_string[4..-1]
|
928
|
+
|
929
|
+
unless query(visibility_query_string).empty?
|
930
|
+
when_element_exists(visibility_query_string, options)
|
931
|
+
return
|
932
|
+
end
|
933
|
+
|
934
|
+
element = query(all_query_string).first
|
935
|
+
raise "No elements found. Query: #{all_query_string}" if element.nil?
|
936
|
+
element_center_y = element['rect']['center_y']
|
937
|
+
|
938
|
+
scroll_view_query_string = "#{all_query_string} parent android.widget.ScrollView index:0"
|
939
|
+
scroll_element = query(scroll_view_query_string).first
|
940
|
+
|
941
|
+
raise "Could not find parent scroll view. Query: #{scroll_view_query_string}" if element.nil?
|
942
|
+
|
943
|
+
scroll_element_y = scroll_element['rect']['y']
|
944
|
+
scroll_element_height = scroll_element['rect']['height']
|
945
|
+
|
946
|
+
if element_center_y > scroll_element_y + scroll_element_height
|
947
|
+
scroll_by_y = element_center_y - (scroll_element_y + scroll_element_height) + 2
|
948
|
+
else
|
949
|
+
scroll_by_y = element_center_y - scroll_element_y - 2
|
950
|
+
end
|
951
|
+
|
952
|
+
result = query(scroll_view_query_string, {scrollBy: [0, scroll_by_y.to_i]}).first
|
953
|
+
raise 'Could not scroll parent view' if result != '<VOID>'
|
954
|
+
|
955
|
+
visibility_query_string = all_query_string[4..-1]
|
956
|
+
when_element_exists(visibility_query_string, options)
|
787
957
|
end
|
788
958
|
|
789
959
|
def scroll_to_row(uiquery,number)
|
@@ -858,7 +1028,13 @@ module Operations
|
|
858
1028
|
end
|
859
1029
|
|
860
1030
|
def backdoor(sel, arg)
|
861
|
-
|
1031
|
+
result = perform_action("backdoor", sel, arg)
|
1032
|
+
if !result["success"]
|
1033
|
+
screenshot_and_raise(result["message"])
|
1034
|
+
end
|
1035
|
+
|
1036
|
+
# for android results are returned in bonusInformation
|
1037
|
+
result["bonusInformation"].first
|
862
1038
|
end
|
863
1039
|
|
864
1040
|
def map(query, method_name, *method_args)
|