selendroid 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/selendroid +35 -4
- data/irbrc +2 -1
- data/lib/selendroid/commands.rb +39 -0
- data/lib/selendroid/selendroid_builder.rb +73 -11
- data/lib/selendroid/selendroid_driver.rb +33 -16
- data/lib/selendroid/version.rb +1 -1
- data/lib/troido/README.md +6 -0
- data/lib/troido/re-sign.jar +0 -0
- data/selendroid-prebuild/selendroid-server.apk +0 -0
- data/selendroid.gemspec +1 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14c9a302e098b43e724d3a8da6cdec5f1031f09d
|
4
|
+
data.tar.gz: 1f607d7aacbbfab0e272e34fa7cdee3dbe8fc480
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c958e755785e94a6a0a8c25e5cf89088be2e36d8525116436bee62601a6f097e2fb820ae122c4801715b33b8eb4c383de81005a8908ec862831baa8a6adf9be
|
7
|
+
data.tar.gz: 52f7b559fa48d33c40c5586dc5c92c4f83f91c83e4916c120f7d2c898624a6ecd4e6a52edad9cc2a7b20f648cd64a5cd73c008fbd9dec09479882319cb76dead
|
data/bin/selendroid
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'selendroid/selendroid_builder'
|
5
|
+
require 'selendroid/selendroid_driver'
|
5
6
|
require 'rbconfig'
|
6
7
|
|
7
8
|
# for ruby 1.9.1 and earlier
|
@@ -19,12 +20,21 @@ def print_comamndline_help
|
|
19
20
|
Prints more detailed help information.
|
20
21
|
build <apk>
|
21
22
|
Builds the selendroid-server for the given apk.
|
23
|
+
build-and-start <apk>
|
24
|
+
Builds the selendroid-server for the given apk and starts the
|
25
|
+
selendroid server. The app will be resigned with the debug
|
26
|
+
certificate and will be installed on the first available An-
|
27
|
+
droid device.
|
28
|
+
start <apk>
|
29
|
+
Starts the selendroid server on the first available Android device.
|
30
|
+
Commamd expects that the apps are already installed on the device.
|
22
31
|
shell
|
23
|
-
Starts the selendroid-server on the device (apps must be already
|
24
|
-
|
32
|
+
Starts the selendroid-server on the device (apps must be already in-
|
33
|
+
stalled) and opens an irb shell with an active WebDriver session.
|
25
34
|
version
|
26
35
|
prints the gem version
|
27
|
-
To find help, please visit the official selendroid wiki:
|
36
|
+
To find help, please visit the official selendroid wiki:
|
37
|
+
http://goo.gl/z30pj
|
28
38
|
EOF
|
29
39
|
end
|
30
40
|
|
@@ -56,11 +66,32 @@ elsif cmd == 'shell'
|
|
56
66
|
exit 0
|
57
67
|
elsif cmd == 'build'
|
58
68
|
raise_if_android_home_not_set
|
59
|
-
puts "Please specify the app you want to build a selendroid-server for" if (ARGV.empty? or not is_apk_file?(ARGV.first))
|
69
|
+
puts "Please specify the app you want to build a selendroid-server for!" if (ARGV.empty? or not is_apk_file?(ARGV.first))
|
60
70
|
while not ARGV.empty? and is_apk_file?(ARGV.first)
|
61
71
|
rebuild_selendroid(relative_to_full_path(ARGV.shift))
|
62
72
|
end
|
63
73
|
exit 0
|
74
|
+
elsif cmd=='build-and-start'
|
75
|
+
raise_if_android_home_not_set
|
76
|
+
puts "Please specify the app you want to automate!" if (ARGV.empty? or not is_apk_file?(ARGV.first))
|
77
|
+
while not ARGV.empty? and is_apk_file?(ARGV.first)
|
78
|
+
app_apk_under_test = relative_to_full_path(ARGV.shift)
|
79
|
+
prepare_device(app_apk_under_test)
|
80
|
+
main_activity = get_app_main_activity(app_apk_under_test)
|
81
|
+
start_selendroid_server(main_activity)
|
82
|
+
wait_for_selendroid_server
|
83
|
+
end
|
84
|
+
exit 0
|
85
|
+
elsif cmd=='start'
|
86
|
+
raise_if_android_home_not_set
|
87
|
+
puts "Please specify the app you want to automate!" if (ARGV.empty? or not is_apk_file?(ARGV.first))
|
88
|
+
while not ARGV.empty? and is_apk_file?(ARGV.first)
|
89
|
+
app_apk_under_test = relative_to_full_path(ARGV.shift)
|
90
|
+
main_activity = get_app_main_activity(app_apk_under_test)
|
91
|
+
start_selendroid_server(main_activity)
|
92
|
+
wait_for_selendroid_server
|
93
|
+
end
|
94
|
+
exit 0
|
64
95
|
elsif cmd == 'version'
|
65
96
|
puts Selendroid::VERSION
|
66
97
|
exit 0
|
data/irbrc
CHANGED
@@ -17,7 +17,8 @@ IRB.conf[:SAVE_HISTORY] = 50
|
|
17
17
|
IRB.conf[:HISTORY_FILE] = ".irb-history"
|
18
18
|
|
19
19
|
require 'selendroid/selendroid_driver'
|
20
|
-
start_selendroid_server
|
20
|
+
start_selendroid_server(nil)
|
21
|
+
wait_for_selendroid_server
|
21
22
|
start_selendroid_client
|
22
23
|
puts "#################### Selendroid shell ###################".green
|
23
24
|
puts "Selendroid inspector: http://localhost:8090/inspector".green
|
@@ -0,0 +1,39 @@
|
|
1
|
+
def log(message)
|
2
|
+
$stdout.puts "#{Time.now.strftime("%Y-%m-%d %H:%M:%S")} - #{message}".green
|
3
|
+
end
|
4
|
+
|
5
|
+
def adb_command
|
6
|
+
if is_windows?
|
7
|
+
"#{ENV["ANDROID_HOME"]}\\platform-tools\\adb.exe"
|
8
|
+
else
|
9
|
+
"#{ENV["ANDROID_HOME"]}/platform-tools/adb"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def is_windows?
|
14
|
+
(RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
|
15
|
+
end
|
16
|
+
|
17
|
+
def aapt_command
|
18
|
+
if is_windows?
|
19
|
+
"#{ENV["ANDROID_HOME"]}\\platform-tools\\aapt.exe"
|
20
|
+
else
|
21
|
+
"#{ENV["ANDROID_HOME"]}/platform-tools/aapt"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def java_command
|
26
|
+
if is_windows?
|
27
|
+
"#{ENV["JAVA_HOME"]}\\bin\\java.exe"
|
28
|
+
else
|
29
|
+
"#{ENV["JAVA_HOME"]}/bin/java"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def jarsigner_command
|
34
|
+
if is_windows?
|
35
|
+
"#{ENV["JAVA_HOME"]}\\bin\\jarsigner.exe"
|
36
|
+
else
|
37
|
+
"#{ENV["JAVA_HOME"]}/bin/jarsigner"
|
38
|
+
end
|
39
|
+
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require "selendroid/version"
|
2
|
+
require "selendroid/commands"
|
2
3
|
require 'zip/zip'
|
3
4
|
require 'tempfile'
|
5
|
+
require 'colorize'
|
4
6
|
|
5
7
|
def rebuild_selendroid(app)
|
6
|
-
aut_base_package =
|
7
|
-
|
8
|
-
puts "Building selendroid-server for package #{aut_base_package.dump}"
|
8
|
+
aut_base_package = get_app_base_package(app)
|
9
|
+
log "Building selendroid-server for package #{aut_base_package.dump}".green
|
9
10
|
|
10
11
|
test_server_file_name = selendroid_server_path(aut_base_package)
|
11
12
|
FileUtils.mkdir_p File.dirname(test_server_file_name) unless File.exist? File.dirname(test_server_file_name)
|
@@ -39,23 +40,84 @@ def rebuild_selendroid(app)
|
|
39
40
|
raise "Could not sign test server"
|
40
41
|
end
|
41
42
|
end
|
42
|
-
|
43
|
+
log "Done signing the test server. Moved it to #{test_server_file_name}".green
|
44
|
+
test_server_file_name
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_app_base_package(app)
|
48
|
+
cmd = "#{aapt_command} dump badging '#{app}' | grep package | cut -d '=' -f2-|awk '{ print $1}' | tr -d \"'\""
|
49
|
+
app_base_package = %x[ #{cmd}]
|
50
|
+
app_base_package = app_base_package.tr("\n","")
|
51
|
+
app_base_package
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_app_main_activity(app)
|
55
|
+
cmd ="#{aapt_command} dump badging '#{app}' | grep launchable-activity | cut -d '=' -f2-|awk '{ print $1}' | tr -d \"'\""
|
56
|
+
app_main_activity = %x[ #{cmd} ]
|
57
|
+
app_main_activity = app_main_activity.tr("\n","")
|
58
|
+
app_main_activity
|
59
|
+
end
|
60
|
+
|
61
|
+
def is_app_installed_on_device(app_base_package, device_arg)
|
62
|
+
cmd = "#{adb_command} -s #{device_arg} shell pm list packages #{app_base_package}"
|
63
|
+
package_name = %x[ #{cmd}]
|
64
|
+
if package_name.nil? || package_name.empty?
|
65
|
+
return false
|
66
|
+
else
|
67
|
+
return true
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def get_first_android_device
|
72
|
+
cmd = "#{adb_command} devices | head -2 | tail -1 | awk '{ print $1}'"
|
73
|
+
device = %x[ #{cmd}]
|
74
|
+
device = device.tr("\n","")
|
75
|
+
puts "device '#{device}'"
|
76
|
+
if device.nil? || device.empty?
|
77
|
+
raise "No running Android device was found. Is the device plugged in or the emulator started?"
|
78
|
+
end
|
79
|
+
device
|
80
|
+
end
|
81
|
+
|
82
|
+
def prepare_device(app)
|
83
|
+
device_serial = get_first_android_device
|
84
|
+
log "Using first Android device with serial: #{device_serial}".green
|
85
|
+
if is_app_installed_on_device("org.openqa.selndroid",device_serial)
|
86
|
+
uninstall_cmd = "#{adb_command} -s #{device_serial} uninstall org.openqa.selendroid"
|
87
|
+
%x[ #{uninstall_cmd}]
|
88
|
+
end
|
89
|
+
selendroid_file_name = rebuild_selendroid(app)
|
90
|
+
install_cmd = "#{adb_command} -s #{device_serial} install #{File.expand_path(selendroid_file_name)}"
|
91
|
+
%x[ #{install_cmd}]
|
92
|
+
log "The selendroid server has been rebuild and installed on the device.".green
|
93
|
+
|
94
|
+
aut_base_package = get_app_base_package(app)
|
95
|
+
aut_main_activity = get_app_main_activity(app)
|
96
|
+
if is_app_installed_on_device(aut_base_package,device_serial)
|
97
|
+
uninstall_cmd = "#{adb_command} -s #{device_serial} uninstall #{aut_base_package}"
|
98
|
+
%x[ #{uninstall_cmd}]
|
99
|
+
end
|
100
|
+
resigned_apk = "#{app.chomp('.apk')}-debug.apk"
|
101
|
+
resign_apk(app,resigned_apk)
|
102
|
+
install_cmd = "#{adb_command} -s #{device_serial} install #{resigned_apk}"
|
103
|
+
%x[ #{install_cmd}]
|
104
|
+
log "The app has been resigned #{File.basename(resigned_apk)} and installed on the device.".green
|
43
105
|
end
|
44
106
|
|
45
107
|
def is_windows?
|
46
108
|
(RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
|
47
109
|
end
|
48
110
|
|
111
|
+
def resign_apk(app_path, dest_path)
|
112
|
+
troido_jar = File.join(File.dirname(__FILE__), '..','..', 'lib/troido/re-sign.jar')
|
113
|
+
cmd = "#{java_command} -cp #{troido_jar} de.troido.resigner.main.Main #{File.expand_path(app_path)} #{File.expand_path(dest_path)}"
|
114
|
+
resign_output= %x[ #{cmd}]
|
115
|
+
end
|
116
|
+
|
49
117
|
def sign_apk(app_path, dest_path)
|
50
|
-
if is_windows?
|
51
|
-
jarsigner_path = "\"#{ENV["JAVA_HOME"]}/bin/jarsigner.exe\""
|
52
|
-
else
|
53
|
-
jarsigner_path = "jarsigner"
|
54
|
-
end
|
55
118
|
|
56
|
-
cmd = "#{
|
119
|
+
cmd = "#{jarsigner_command} -sigalg MD5withRSA -digestalg SHA1 -signedjar #{dest_path} -storepass android -keystore ~/.android/debug.keystore #{app_path} androiddebugkey"
|
57
120
|
unless system(cmd)
|
58
|
-
puts "jarsigner command: #{cmd}"
|
59
121
|
raise "Could not sign app (#{app_path}"
|
60
122
|
end
|
61
123
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
+
require "selendroid/commands"
|
1
2
|
require 'selenium-webdriver'
|
2
3
|
require 'json'
|
3
4
|
require 'colorize'
|
5
|
+
require 'retriable'
|
6
|
+
require "net/http"
|
7
|
+
require 'uri'
|
4
8
|
|
5
9
|
include Selenium::WebDriver::DriverExtensions::HasInputDevices
|
6
10
|
include Selenium::WebDriver::DriverExtensions::HasTouchScreen
|
@@ -64,26 +68,39 @@ def helpme
|
|
64
68
|
|
65
69
|
end
|
66
70
|
|
67
|
-
def start_selendroid_server
|
68
|
-
|
71
|
+
def start_selendroid_server(activity)
|
72
|
+
main_activity = nil
|
73
|
+
if activity.nil?
|
74
|
+
main_activity = ENV["MAIN_ACTIVITY"]
|
75
|
+
else
|
76
|
+
main_activity =activity
|
77
|
+
end
|
78
|
+
log "Starting selendroid-server with main activity: #{main_activity}"
|
79
|
+
selendroid_server_start_cmd = "#{adb_command} shell am instrument -e main_activity '#{main_activity}' org.openqa.selendroid/org.openqa.selendroid.ServerInstrumentation"
|
69
80
|
`#{selendroid_server_start_cmd}`
|
70
|
-
|
81
|
+
unless ENV["SELENDROID_SERVER_PORT"]
|
82
|
+
ENV["SELENDROID_SERVER_PORT"] = "8080"
|
83
|
+
end
|
71
84
|
forward_cmd = "#{adb_command} forward tcp:#{ENV["SELENDROID_SERVER_PORT"]} tcp:8080"
|
72
85
|
`#{forward_cmd}`
|
73
86
|
end
|
74
87
|
|
75
|
-
def
|
76
|
-
|
77
|
-
|
88
|
+
def wait_for_selendroid_server
|
89
|
+
unless ENV["SELENDROID_SERVER_PORT"]
|
90
|
+
ENV["SELENDROID_SERVER_PORT"] = "8080"
|
91
|
+
end
|
92
|
+
retriable :tries => 5, :interval => 3 do
|
93
|
+
url = URI.parse("http://localhost:#{ENV["SELENDROID_SERVER_PORT"]}/wd/hub/status")
|
94
|
+
the_request = Net::HTTP::Get.new("#{url.path}")
|
78
95
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
else
|
83
|
-
%Q("#{ENV["ANDROID_HOME"]}/platform-tools/adb")
|
84
|
-
end
|
85
|
-
end
|
96
|
+
the_response = Net::HTTP.start(url.host, url.port) { |http|
|
97
|
+
http.request(the_request)
|
98
|
+
}
|
86
99
|
|
87
|
-
|
88
|
-
|
89
|
-
end
|
100
|
+
raise "Response was not 200, response was #{the_response.code}" if the_response.code != "200"
|
101
|
+
log "Selendroid server is started.".green
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
|
data/lib/selendroid/version.rb
CHANGED
@@ -0,0 +1,6 @@
|
|
1
|
+
The re-sign tool is created by troido.de and is published under
|
2
|
+
the apache 2.0 licence:
|
3
|
+
|
4
|
+
* Source code: https://github.com/troido/resign
|
5
|
+
* Jar download: http://www.troido.de/en/downloadslsmallgsoftware-a-driverslsmallg/files-download/1_0f7c0da1d4814335bd4142b87385e2ac
|
6
|
+
|
Binary file
|
Binary file
|
data/selendroid.gemspec
CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
gem.add_dependency( "rubyzip")
|
19
19
|
gem.add_dependency( "colorize")
|
20
|
+
gem.add_dependency( "retriable")
|
20
21
|
gem.add_dependency( "awesome_print")
|
21
22
|
gem.add_dependency( "selenium-webdriver")
|
22
23
|
gem.add_dependency( "json")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selendroid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Dary
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: retriable
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: awesome_print
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,9 +112,12 @@ files:
|
|
98
112
|
- bin/selendroid-shell.rb
|
99
113
|
- irbrc
|
100
114
|
- lib/selendroid.rb
|
115
|
+
- lib/selendroid/commands.rb
|
101
116
|
- lib/selendroid/selendroid_builder.rb
|
102
117
|
- lib/selendroid/selendroid_driver.rb
|
103
118
|
- lib/selendroid/version.rb
|
119
|
+
- lib/troido/README.md
|
120
|
+
- lib/troido/re-sign.jar
|
104
121
|
- selendroid-prebuild/AndroidManifest.xml
|
105
122
|
- selendroid-prebuild/selendroid-server.apk
|
106
123
|
- selendroid.gemspec
|