testautoa 0.4.0.pre19 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +7 -7
- data/bin/calabash-android +1 -8
- data/bin/calabash-android-build.rb +1 -1
- data/bin/calabash-android-console.rb +4 -4
- data/bin/calabash-android-run.rb +10 -2
- data/calabash-android.gemspec +0 -1
- data/irbrc +0 -2
- data/lib/calabash-android/helpers.rb +17 -45
- data/lib/calabash-android/lib/TestServer.apk +0 -0
- data/lib/calabash-android/operations.rb +43 -144
- data/lib/calabash-android/steps/list_steps.rb +1 -1
- data/lib/calabash-android/steps/time_picker_steps.rb +1 -1
- data/lib/calabash-android/version.rb +1 -1
- data/test-server/AndroidManifest.xml +0 -2
- data/test-server/build.xml +0 -1
- data/test-server/instrumentation-backend/.classpath +1 -0
- data/test-server/instrumentation-backend/AndroidManifest.xml +1 -1
- data/test-server/instrumentation-backend/antlr/UIQuery.g +5 -48
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +3 -4
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +1 -7
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +29 -14
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/Swipe.java +5 -11
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/location/FakeGPSLocation.java +10 -13
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +36 -131
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +18 -38
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +16 -38
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +66 -94
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +33 -55
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +31 -53
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +27 -52
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Query.java +24 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +32 -39
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +41 -56
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +25 -50
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +22 -19
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Touch.java +44 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +43 -155
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +12 -19
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +11 -41
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQuery.tokens +10 -0
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +242 -1010
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +98 -406
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryAST.java +1 -1
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTClassName.java +25 -52
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +89 -153
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryDirection.java +2 -12
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +141 -58
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +7 -157
- data/test-server/instrumentation-backend/tests/sh/calaba/instrumentationbackend/query/tests/UIQueryTest.java +134 -0
- metadata +98 -128
- data/lib/calabash-android/lib/unsign.jar +0 -0
- data/lib/calabash-android/wait_helpers.rb +0 -93
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java +0 -95
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/FinishOpenedActivities.java +0 -19
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GetOpenedActivities.java +0 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GoBackToActivity.java +0 -67
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/DragCoordinates.java +0 -28
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/LeftKey.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/RightKey.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/UpKey.java +0 -24
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/version/Version.java +0 -31
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +0 -44
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/CompletedFuture.java +0 -40
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +0 -222
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Operation.java +0 -7
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/PropertyOperation.java +0 -56
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQueryResultVoid.java +0 -22
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/BeginsWithRelation.java +0 -45
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ComparisonOperator.java +0 -54
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ContainsRelation.java +0 -41
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/EndsWithRelation.java +0 -42
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/LikeRelation.java +0 -79
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/PartialFutureList.java +0 -100
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicate.java +0 -147
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicateRelation.java +0 -5
- data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +0 -32
data/Rakefile
CHANGED
@@ -3,19 +3,18 @@ load 'lib/calabash-android/helpers.rb'
|
|
3
3
|
|
4
4
|
def build
|
5
5
|
test_server_template_dir = File.join(File.dirname(__FILE__), 'test-server')
|
6
|
-
|
6
|
+
|
7
7
|
Dir.mktmpdir do |workspace_dir|
|
8
|
-
|
8
|
+
|
9
9
|
@test_server_dir = File.join(workspace_dir, 'test-server')
|
10
10
|
FileUtils.cp_r(test_server_template_dir, workspace_dir)
|
11
|
-
|
11
|
+
|
12
12
|
ant_executable = (is_windows? ? "ant.bat" : "ant")
|
13
13
|
args = [
|
14
14
|
ant_executable,
|
15
|
-
"clean",
|
15
|
+
"clean",
|
16
16
|
"package",
|
17
17
|
"-Dandroid.api.level=16",
|
18
|
-
"-Dversion=#{Calabash::Android::VERSION}",
|
19
18
|
]
|
20
19
|
Dir.chdir(@test_server_dir) do
|
21
20
|
STDOUT.sync = true
|
@@ -29,11 +28,13 @@ def build
|
|
29
28
|
end
|
30
29
|
|
31
30
|
FileUtils.mkdir_p "test_servers" unless File.exist? "test_servers"
|
32
|
-
|
31
|
+
|
33
32
|
FileUtils.cp(File.join(@test_server_dir, "bin", "Test_unsigned.apk"), File.join(File.dirname(__FILE__), 'lib/calabash-android/lib/TestServer.apk'))
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
36
|
+
|
37
|
+
|
37
38
|
task :build do
|
38
39
|
unless File.exists? "test-server/calabash-js/src"
|
39
40
|
puts "calabash-js not found!"
|
@@ -47,5 +48,4 @@ task :build do
|
|
47
48
|
|
48
49
|
end
|
49
50
|
|
50
|
-
|
51
51
|
Bundler::GemHelper.install_tasks
|
data/bin/calabash-android
CHANGED
@@ -1,15 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
|
-
require 'rbconfig'
|
5
4
|
require 'calabash-android/helpers'
|
6
5
|
|
7
|
-
# for ruby 1.9.1 and earlier
|
8
|
-
unless defined? RbConfig.ruby
|
9
|
-
def RbConfig.ruby
|
10
|
-
File.join(RbConfig::CONFIG["bindir"], RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"])
|
11
|
-
end
|
12
|
-
end
|
13
6
|
|
14
7
|
require File.join(File.dirname(__FILE__), "calabash-android-helpers")
|
15
8
|
require File.join(File.dirname(__FILE__), "calabash-android-generate")
|
@@ -69,7 +62,7 @@ elsif cmd == 'console'
|
|
69
62
|
puts "No such file #{ARGV.first}"
|
70
63
|
exit 1
|
71
64
|
end
|
72
|
-
calabash_console
|
65
|
+
calabash_console ARGV.first
|
73
66
|
exit 0
|
74
67
|
elsif cmd == 'setup'
|
75
68
|
calabash_setup
|
@@ -18,7 +18,7 @@ def calabash_build(app)
|
|
18
18
|
FileUtils.cp(unsigned_test_apk, "TestServer.apk")
|
19
19
|
FileUtils.cp(File.join(File.dirname(__FILE__), '..', 'test-server/AndroidManifest.xml'), "AndroidManifest.xml")
|
20
20
|
|
21
|
-
unless system %Q{
|
21
|
+
unless system %Q{ruby -pi.bak -e "gsub(/#targetPackage#/, '#{package_name(app)}')" AndroidManifest.xml}
|
22
22
|
raise "Could not replace package name in manifest"
|
23
23
|
end
|
24
24
|
|
@@ -5,7 +5,9 @@ def calabash_console(app_path = nil)
|
|
5
5
|
ENV["TEST_SERVER_PORT"] = "34777"
|
6
6
|
end
|
7
7
|
|
8
|
-
ENV["IRBRC"]
|
8
|
+
unless ENV["IRBRC"]
|
9
|
+
ENV["IRBRC"] = File.join(File.dirname(__FILE__), '..', 'irbrc')
|
10
|
+
end
|
9
11
|
|
10
12
|
unless ENV["PACKAGE_NAME"]
|
11
13
|
ENV["PACKAGE_NAME"] = package_name(app_path)
|
@@ -23,7 +25,5 @@ def calabash_console(app_path = nil)
|
|
23
25
|
ENV["TEST_APP_PATH"] = test_server_path
|
24
26
|
end
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
system "#{RbConfig.ruby} -S irb"
|
28
|
+
system "irb"
|
29
29
|
end
|
data/bin/calabash-android-run.rb
CHANGED
@@ -13,7 +13,15 @@ def calabash_run(app_path = nil)
|
|
13
13
|
end
|
14
14
|
|
15
15
|
if app_path
|
16
|
-
|
16
|
+
unless File.exist?(test_server_path(app_path))
|
17
|
+
if ARGV.include? "--no-build"
|
18
|
+
puts "No test server found for this combination of app and calabash version. Exiting!"
|
19
|
+
exit 1
|
20
|
+
else
|
21
|
+
puts "No test server found for this combination of app and calabash version. Recreating test server."
|
22
|
+
calabash_build(app_path)
|
23
|
+
end
|
24
|
+
end
|
17
25
|
|
18
26
|
test_server_path = test_server_path(app_path)
|
19
27
|
if ENV["TEST_SERVER_PORT"]
|
@@ -32,7 +40,7 @@ def calabash_run(app_path = nil)
|
|
32
40
|
|
33
41
|
STDOUT.sync = true
|
34
42
|
arguments = ARGV - ["--no-build"]
|
35
|
-
cmd = "
|
43
|
+
cmd = "cucumber #{arguments.join(" ")} #{env}"
|
36
44
|
log cmd
|
37
45
|
exit_code = system(cmd)
|
38
46
|
|
data/calabash-android.gemspec
CHANGED
data/irbrc
CHANGED
@@ -38,27 +38,22 @@ def test_server_path(apk_file_path)
|
|
38
38
|
"test_servers/#{checksum(apk_file_path)}_#{Calabash::Android::VERSION}.apk"
|
39
39
|
end
|
40
40
|
|
41
|
-
|
42
|
-
def build_test_server_if_needed(app_path)
|
43
|
-
unless File.exist?(test_server_path(app_path))
|
44
|
-
if ARGV.include? "--no-build"
|
45
|
-
puts "No test server found for this combination of app and calabash version. Exiting!"
|
46
|
-
exit 1
|
47
|
-
else
|
48
|
-
puts "No test server found for this combination of app and calabash version. Recreating test server."
|
49
|
-
calabash_build(app_path)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
41
|
def resign_apk(app_path)
|
55
42
|
Dir.mktmpdir do |tmp_dir|
|
56
43
|
log "Resign apk"
|
57
44
|
unsigned_path = File.join(tmp_dir, 'unsigned.apk')
|
58
45
|
FileUtils.cp(app_path, unsigned_path)
|
59
46
|
|
60
|
-
|
47
|
+
#Delete META-INF/*
|
48
|
+
to_remove = Zip::ZipFile.foreach(unsigned_path).find_all { |e| /^META-INF\// =~ e.name}.collect &:name
|
61
49
|
|
50
|
+
Zip::ZipFile.open(unsigned_path) do |zip_file|
|
51
|
+
to_remove.each do |x|
|
52
|
+
log "Removing #{x}"
|
53
|
+
zip_file.remove x
|
54
|
+
end
|
55
|
+
zip_file.commit
|
56
|
+
end
|
62
57
|
sign_apk(unsigned_path, app_path)
|
63
58
|
end
|
64
59
|
end
|
@@ -72,7 +67,7 @@ def sign_apk(app_path, dest_path)
|
|
72
67
|
jarsigner_path = "jarsigner"
|
73
68
|
end
|
74
69
|
|
75
|
-
cmd = "#{jarsigner_path} -sigalg MD5withRSA -digestalg SHA1 -signedjar #{dest_path} -storepass #{keystore["keystore_password"]} -keystore #{keystore["keystore_location"]} #{app_path} #{keystore["keystore_alias"]}"
|
70
|
+
cmd = "#{jarsigner_path} -sigalg MD5withRSA -digestalg SHA1 -signedjar #{dest_path} -storepass #{keystore["keystore_password"]} -keystore \"#{File.expand_path keystore["keystore_location"]}\" #{app_path} #{keystore["keystore_alias"]}"
|
76
71
|
log cmd
|
77
72
|
unless system(cmd)
|
78
73
|
puts "jarsigner command: #{cmd}"
|
@@ -82,32 +77,19 @@ end
|
|
82
77
|
|
83
78
|
def read_keystore_info
|
84
79
|
if File.exist? ".calabash_settings"
|
85
|
-
|
86
|
-
keystore["keystore_location"] = '"' + File.expand_path(keystore["keystore_location"]) + '"' if keystore["keystore_location"]
|
87
|
-
keystore
|
80
|
+
JSON.parse(IO.read(".calabash_settings"))
|
88
81
|
else
|
89
82
|
{
|
90
|
-
"keystore_location" =>
|
83
|
+
"keystore_location" => "#{ENV["HOME"]}/.android/debug.keystore",
|
91
84
|
"keystore_password" => "android",
|
92
85
|
"keystore_alias" => "androiddebugkey",
|
93
86
|
}
|
94
87
|
end
|
95
88
|
end
|
96
89
|
|
97
|
-
def keytool_path
|
98
|
-
if is_windows?
|
99
|
-
"\"#{ENV["JAVA_HOME"]}/bin/keytool.exe\""
|
100
|
-
else
|
101
|
-
"keytool"
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
90
|
def fingerprint_from_keystore
|
106
91
|
keystore_info = read_keystore_info
|
107
|
-
|
108
|
-
|
109
|
-
log cmd
|
110
|
-
fingerprints = `#{cmd}`
|
92
|
+
fingerprints = `keytool -v -list -alias #{keystore_info["keystore_alias"]} -keystore #{keystore_info["keystore_location"]} -storepass #{keystore_info["keystore_password"]}`
|
111
93
|
md5_fingerprint = extract_md5_fingerprint(fingerprints)
|
112
94
|
log "MD5 fingerprint for keystore (#{keystore_info["keystore_location"]}): #{md5_fingerprint}"
|
113
95
|
md5_fingerprint
|
@@ -125,9 +107,7 @@ def fingerprint_from_apk(app_path)
|
|
125
107
|
raise "No RSA file found in META-INF. Cannot proceed." if rsa_files.empty?
|
126
108
|
raise "More than one RSA file found in META-INF. Cannot proceed." if rsa_files.length > 1
|
127
109
|
|
128
|
-
|
129
|
-
log cmd
|
130
|
-
fingerprints = `#{cmd}`
|
110
|
+
fingerprints = `keytool -v -printcert -file #{rsa_files.first}`
|
131
111
|
md5_fingerprint = extract_md5_fingerprint(fingerprints)
|
132
112
|
log "MD5 fingerprint for signing cert (#{app_path}): #{md5_fingerprint}"
|
133
113
|
md5_fingerprint
|
@@ -136,17 +116,9 @@ def fingerprint_from_apk(app_path)
|
|
136
116
|
end
|
137
117
|
|
138
118
|
def extract_md5_fingerprint(fingerprints)
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
if fingerprints.encoding.name == "CP850"
|
143
|
-
fingerprints = fingerprints.gsub("\xA0".force_encoding("CP850"),"")
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
m = fingerprints.scan(/MD5\s*:\s*((?:[a-fA-F\d]{2}:){15}[a-fA-F\d]{2})/).flatten
|
148
|
-
raise "No MD5 fingerprint found:\n #{fingerprints}" if m.empty?
|
149
|
-
m.first
|
119
|
+
m = fingerprints.scan(/MD5:\s+((?:[[:xdigit:]][[:xdigit:]]:){15}[[:xdigit:]][[:xdigit:]])/)
|
120
|
+
raise "No MD5 fingerprint found:\n #{fingerprints}" unless m
|
121
|
+
m.last.first
|
150
122
|
end
|
151
123
|
|
152
124
|
def is_windows?
|
Binary file
|
@@ -6,16 +6,13 @@ require 'json'
|
|
6
6
|
require 'socket'
|
7
7
|
require 'timeout'
|
8
8
|
require 'calabash-android/helpers'
|
9
|
-
require 'calabash-android/wait_helpers'
|
10
|
-
require 'calabash-android/version'
|
11
9
|
require 'retriable'
|
12
|
-
require 'cucumber'
|
13
10
|
|
14
11
|
|
15
12
|
module Calabash module Android
|
16
13
|
|
17
14
|
module Operations
|
18
|
-
|
15
|
+
|
19
16
|
|
20
17
|
def log(message)
|
21
18
|
$stdout.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")} - #{message}" if (ARGV.include? "-v" or ARGV.include? "--verbose")
|
@@ -26,13 +23,12 @@ module Operations
|
|
26
23
|
end
|
27
24
|
|
28
25
|
def macro(txt)
|
29
|
-
if self.respond_to
|
26
|
+
if self.respond_to?:step
|
30
27
|
step(txt)
|
31
28
|
else
|
32
29
|
Then(txt)
|
33
30
|
end
|
34
31
|
end
|
35
|
-
|
36
32
|
def default_device
|
37
33
|
unless @default_device
|
38
34
|
@default_device = Device.new(self, ENV["ADB_DEVICE_ARG"], ENV["TEST_SERVER_PORT"], ENV["APP_PATH"], ENV["TEST_APP_PATH"])
|
@@ -40,22 +36,10 @@ module Operations
|
|
40
36
|
@default_device
|
41
37
|
end
|
42
38
|
|
43
|
-
def set_default_device(device)
|
44
|
-
@default_device = device
|
45
|
-
end
|
46
|
-
|
47
39
|
def performAction(action, *arguments)
|
48
40
|
default_device.perform_action(action, *arguments)
|
49
41
|
end
|
50
42
|
|
51
|
-
def reinstall_apps
|
52
|
-
default_device.reinstall_apps
|
53
|
-
end
|
54
|
-
|
55
|
-
def reinstall_test_server
|
56
|
-
default_device.reinstall_test_server
|
57
|
-
end
|
58
|
-
|
59
43
|
def install_app(app_path)
|
60
44
|
default_device.install_app(app_path)
|
61
45
|
end
|
@@ -73,7 +57,7 @@ module Operations
|
|
73
57
|
default_device.clear_app_data
|
74
58
|
end
|
75
59
|
|
76
|
-
def start_test_server_in_background
|
60
|
+
def start_test_server_in_background
|
77
61
|
default_device.start_test_server_in_background()
|
78
62
|
end
|
79
63
|
|
@@ -98,49 +82,32 @@ module Operations
|
|
98
82
|
default_device.set_gps_coordinates(latitude, longitude)
|
99
83
|
end
|
100
84
|
|
101
|
-
def
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
# end
|
113
|
-
# rescue Exception => e
|
114
|
-
# raise e
|
115
|
-
# end
|
116
|
-
# value
|
117
|
-
#end
|
85
|
+
def wait_for(timeout, &block)
|
86
|
+
begin
|
87
|
+
Timeout::timeout(timeout) do
|
88
|
+
until block.call
|
89
|
+
sleep 0.3
|
90
|
+
end
|
91
|
+
end
|
92
|
+
rescue Exception => e
|
93
|
+
raise e
|
94
|
+
end
|
95
|
+
end
|
118
96
|
|
119
97
|
def query(uiquery, *args)
|
120
|
-
|
121
|
-
|
122
|
-
if
|
123
|
-
|
98
|
+
if uiquery.start_with? "webView"
|
99
|
+
uiquery.slice!(0, "webView".length)
|
100
|
+
if uiquery =~ /(css|xpath):\s*(.*)/
|
101
|
+
r = performAction("query", $1, $2)
|
102
|
+
JSON.parse(r["message"])
|
124
103
|
else
|
125
|
-
|
104
|
+
raise "Invalid query #{uiquery}"
|
126
105
|
end
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
uiquery = opts[:query] || "android.widget.ListView"
|
133
|
-
skip_if = opts[:skip_if] || lambda { |i| false }
|
134
|
-
stop_when = opts[:stop_when] || lambda { |i| false }
|
135
|
-
check_element_exists(uiquery)
|
136
|
-
num_items = query(opts[:query], :adapter, :count).first
|
137
|
-
num_items.times do |item|
|
138
|
-
next if skip_if.call(item)
|
139
|
-
break if stop_when.call(item)
|
140
|
-
|
141
|
-
scroll_to_row(opts[:query], item)
|
142
|
-
sleep(opts[:post_scroll]) if opts[:post_scroll] and opts[:post_scroll] > 0
|
143
|
-
yield(item)
|
106
|
+
else
|
107
|
+
arguments = [*args]
|
108
|
+
operation = {"method_name"=>"query", "arguments" => arguments}
|
109
|
+
data = {"query" => uiquery, "operation" => operation}
|
110
|
+
JSON.parse(http("/map",data))
|
144
111
|
end
|
145
112
|
end
|
146
113
|
|
@@ -165,6 +132,10 @@ module Operations
|
|
165
132
|
|
166
133
|
class Device
|
167
134
|
|
135
|
+
def make_default_device
|
136
|
+
@cucumber_world.default_device = self
|
137
|
+
end
|
138
|
+
|
168
139
|
def initialize(cucumber_world, serial, server_port, app_path, test_server_path)
|
169
140
|
@cucumber_world = cucumber_world
|
170
141
|
@serial = serial
|
@@ -180,10 +151,6 @@ module Operations
|
|
180
151
|
def reinstall_apps()
|
181
152
|
uninstall_app(package_name(@app_path))
|
182
153
|
install_app(@app_path)
|
183
|
-
reinstall_test_server()
|
184
|
-
end
|
185
|
-
|
186
|
-
def reinstall_test_server()
|
187
154
|
uninstall_app(package_name(@test_server_path))
|
188
155
|
install_app(@test_server_path)
|
189
156
|
end
|
@@ -197,7 +164,7 @@ module Operations
|
|
197
164
|
succeeded = `#{adb_command} shell pm list packages`.include?("package:#{pn}")
|
198
165
|
|
199
166
|
unless succeeded
|
200
|
-
|
167
|
+
Cucumber.wants_to_quit = true
|
201
168
|
raise "#{pn} did not get installed. Aborting!"
|
202
169
|
end
|
203
170
|
end
|
@@ -344,30 +311,14 @@ module Operations
|
|
344
311
|
raise "Could not clear data" unless system(cmd)
|
345
312
|
end
|
346
313
|
|
347
|
-
def start_test_server_in_background
|
348
|
-
raise "Will not start test server because of previous failures." if
|
314
|
+
def start_test_server_in_background
|
315
|
+
raise "Will not start test server because of previous failures." if Cucumber.wants_to_quit
|
349
316
|
|
350
317
|
if keyguard_enabled?
|
351
318
|
wake_up
|
352
319
|
end
|
353
320
|
|
354
|
-
|
355
|
-
:main_activity => options[:main_activity] || main_activity(@app_path),
|
356
|
-
:debug => options[:debug] || false,
|
357
|
-
:class => options[:class] || "sh.calaba.instrumentationbackend.InstrumentationBackend"}
|
358
|
-
|
359
|
-
cmd_arr = [adb_command, "shell am instrument"]
|
360
|
-
|
361
|
-
env_options.each_pair do |key, val|
|
362
|
-
cmd_arr << "-e"
|
363
|
-
cmd_arr << key.to_s
|
364
|
-
cmd_arr << val.to_s
|
365
|
-
end
|
366
|
-
|
367
|
-
cmd_arr << "sh.calaba.android.test/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner"
|
368
|
-
|
369
|
-
cmd = cmd_arr.join(" ")
|
370
|
-
|
321
|
+
cmd = "#{adb_command} shell am instrument -e target_package #{ENV["PACKAGE_NAME"]} -e main_activity #{ENV["MAIN_ACTIVITY"]} -e class sh.calaba.instrumentationbackend.InstrumentationBackend sh.calaba.android.test/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner"
|
371
322
|
log "Starting test server using:"
|
372
323
|
log cmd
|
373
324
|
raise "Could not execute command to start test server" unless system("#{cmd} 2>&1")
|
@@ -389,37 +340,12 @@ module Operations
|
|
389
340
|
log "Instrumentation backend is ready!"
|
390
341
|
end
|
391
342
|
end
|
392
|
-
rescue Exception => e
|
393
343
|
|
344
|
+
rescue
|
394
345
|
msg = "Unable to make connection to Calabash Test Server at http://127.0.0.1:#{@server_port}/\n"
|
395
346
|
msg << "Please check the logcat output for more info about what happened\n"
|
396
347
|
raise msg
|
397
348
|
end
|
398
|
-
|
399
|
-
log "Checking client-server version match..."
|
400
|
-
response = perform_action('version')
|
401
|
-
unless response['success']
|
402
|
-
msg = ["Unable to obtain Test Server version. "]
|
403
|
-
msg << "Please run 'reinstall_test_server' to make sure you have the correct version"
|
404
|
-
msg_s = msg.join("\n")
|
405
|
-
log(msg_s)
|
406
|
-
raise msg_s
|
407
|
-
end
|
408
|
-
unless response['message'] == Calabash::Android::VERSION
|
409
|
-
|
410
|
-
msg = ["Calabash Client and Test-server version mismatch."]
|
411
|
-
msg << "Client version #{Calabash::Android::VERSION}"
|
412
|
-
msg << "Test-server version #{response['message']}"
|
413
|
-
msg << "Expected Test-server version #{Calabash::Android::VERSION}"
|
414
|
-
msg << "\n\nSolution:\n\n"
|
415
|
-
msg << "Run 'reinstall_test_server' to make sure you have the correct version"
|
416
|
-
msg_s = msg.join("\n")
|
417
|
-
log(msg_s)
|
418
|
-
raise msg_s
|
419
|
-
end
|
420
|
-
log("Client and server versions match. Proceeding...")
|
421
|
-
|
422
|
-
|
423
349
|
end
|
424
350
|
|
425
351
|
def shutdown_test_server
|
@@ -443,15 +369,6 @@ module Operations
|
|
443
369
|
def set_gps_coordinates(latitude, longitude)
|
444
370
|
perform_action('set_gps_coordinates', latitude, longitude)
|
445
371
|
end
|
446
|
-
|
447
|
-
def input_keyevent(keycode)
|
448
|
-
cmd = "#{adb_command} shell input keyevent #{keycode.to_s}"
|
449
|
-
result = `#{cmd}`
|
450
|
-
end
|
451
|
-
|
452
|
-
def press_back_key
|
453
|
-
input_keyevent(4)
|
454
|
-
end
|
455
372
|
end
|
456
373
|
|
457
374
|
|
@@ -462,24 +379,22 @@ module Operations
|
|
462
379
|
|
463
380
|
def screenshot_and_raise(msg)
|
464
381
|
screenshot_embed
|
382
|
+
sleep 5
|
465
383
|
raise(msg)
|
466
384
|
end
|
467
385
|
|
468
386
|
def touch(uiquery,*args)
|
469
|
-
raise "Cannot touch nil" unless uiquery
|
470
|
-
|
471
387
|
if uiquery.instance_of? String
|
472
388
|
elements = query(uiquery, *args)
|
473
|
-
raise "No elements found
|
389
|
+
raise "No elements found" if elements.empty?
|
474
390
|
element = elements.first
|
475
391
|
else
|
476
392
|
element = uiquery
|
477
|
-
element = element.first if element.instance_of?(Array)
|
478
393
|
end
|
479
394
|
|
480
395
|
|
481
|
-
center_x = element["
|
482
|
-
center_y = element["
|
396
|
+
center_x = element["frame"]["x"] + element["frame"]["width"] / 2
|
397
|
+
center_y = element["frame"]["y"] + element["frame"]["height"] / 2
|
483
398
|
performAction("touch_coordinate", center_x, center_y)
|
484
399
|
end
|
485
400
|
|
@@ -521,8 +436,7 @@ module Operations
|
|
521
436
|
end
|
522
437
|
|
523
438
|
def scroll_to_row(uiquery,number)
|
524
|
-
|
525
|
-
puts "TODO:detect end of scroll - use sleep for now"
|
439
|
+
ni
|
526
440
|
end
|
527
441
|
|
528
442
|
def pinch(in_out,options={})
|
@@ -537,16 +451,12 @@ module Operations
|
|
537
451
|
ni
|
538
452
|
end
|
539
453
|
|
540
|
-
def element_does_not_exist(uiquery)
|
541
|
-
query(uiquery).empty?
|
542
|
-
end
|
543
|
-
|
544
454
|
def element_exists(uiquery)
|
545
|
-
|
455
|
+
!query(uiquery).empty?
|
546
456
|
end
|
547
457
|
|
548
458
|
def view_with_mark_exists(expected_mark)
|
549
|
-
element_exists( "
|
459
|
+
element_exists( "view marked:'#{expected_mark}'" )
|
550
460
|
end
|
551
461
|
|
552
462
|
def check_element_exists( query )
|
@@ -595,19 +505,8 @@ module Operations
|
|
595
505
|
ni
|
596
506
|
end
|
597
507
|
|
598
|
-
def map(query, method_name, *method_args)
|
599
|
-
|
600
|
-
:method_name => method_name,
|
601
|
-
:arguments => method_args
|
602
|
-
}
|
603
|
-
res = http("/map",
|
604
|
-
{:query => query, :operation => operation_map})
|
605
|
-
res = JSON.parse(res)
|
606
|
-
if res['outcome'] != 'SUCCESS'
|
607
|
-
screenshot_and_raise "map #{query}, #{method_name} failed because: #{res['reason']}\n#{res['details']}"
|
608
|
-
end
|
609
|
-
|
610
|
-
res['results']
|
508
|
+
def map( query, method_name, *method_args )
|
509
|
+
ni
|
611
510
|
end
|
612
511
|
|
613
512
|
def url_for( verb )
|
@@ -26,7 +26,7 @@ Then /^The "([^\"]*)" for row (\d+) should be "([^\"]*)"$/ do | view_id, row, va
|
|
26
26
|
|
27
27
|
if( response['children'] )
|
28
28
|
found_id = false
|
29
|
-
response['children']
|
29
|
+
response['children'] each do | view |
|
30
30
|
if( view['id'] == view_id )
|
31
31
|
raise "Text is #{view['text']}, expected #{value}" unless( view['text'] == value )
|
32
32
|
found_id = true
|
@@ -4,5 +4,5 @@ Given /^I set the time to "(\d\d:\d\d)" on TimePicker with index "([^\"]*)"$/ do
|
|
4
4
|
end
|
5
5
|
|
6
6
|
Given /^I set the "([^\"]*)" time to "(\d\d:\d\d)"$/ do |content_description, time|
|
7
|
-
performAction('set_time_with_description',
|
7
|
+
performAction('set_time_with_description', time, content_description)
|
8
8
|
end
|
@@ -22,8 +22,6 @@
|
|
22
22
|
|
23
23
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
24
24
|
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
|
25
|
-
<uses-permission android:name="android.permission.ACCESS_COURSE_LOCATION"/>
|
26
|
-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
27
25
|
<uses-permission android:name="android.permission.INTERNET" />
|
28
26
|
|
29
27
|
</manifest>
|
data/test-server/build.xml
CHANGED
@@ -69,7 +69,6 @@
|
|
69
69
|
<copy todir="${staging.dir}/assets">
|
70
70
|
<fileset dir="${calabashjs.dir}"/>
|
71
71
|
</copy>
|
72
|
-
<replace file="${staging.dir}/src/sh/calaba/instrumentationbackend/actions/version/Version.java" token="####VERSION####" value="${version}" failOnNoReplacements="true" />
|
73
72
|
</target>
|
74
73
|
|
75
74
|
|
@@ -3,6 +3,7 @@
|
|
3
3
|
<classpathentry kind="src" path="src"/>
|
4
4
|
<classpathentry kind="src" path="gen"/>
|
5
5
|
<classpathentry kind="src" path="assets"/>
|
6
|
+
<classpathentry kind="src" path="tests"/>
|
6
7
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
7
8
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
|
8
9
|
<classpathentry kind="lib" path="libs/robotium-solo-3.6.jar"/>
|
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
<uses-sdk android:minSdkVersion="6" />
|
8
8
|
|
9
|
-
<application android:label="CalabashTestServer"
|
9
|
+
<application android:label="CalabashTestServer" >
|
10
10
|
<uses-library android:name="android.test.runner" />
|
11
11
|
<uses-library android:name="com.google.android.maps" android:required="false" />
|
12
12
|
</application>
|