selendroid 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -2
- data/LICENSE.txt +1 -3
- data/README.md +4 -7
- data/bin/selendroid +18 -8
- data/lib/selendroid/commands.rb +17 -9
- data/lib/selendroid/selendroid_builder.rb +45 -16
- data/lib/selendroid/selendroid_driver.rb +4 -4
- data/lib/selendroid/version.rb +1 -1
- data/selendroid-prebuild/AndroidManifest.xml +1 -1
- data/selendroid-prebuild/selendroid-server.apk +0 -0
- data/selendroid.gemspec +3 -1
- metadata +2 -3
- data/bin/selendroid-shell.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41fa062891d9e2bf72e3b4a3197293dae252d7e6
|
4
|
+
data.tar.gz: d6b9698f140dadeb70f9ed9c2a4c7d57a29d4156
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49a06488d8cc4696d0ea31d3edccc26eade1b64236125458423aedb3b252d4240c1cda6be219fd1e54b52d23df98e5223db2d40d05b13f2e501c53a307081b90
|
7
|
+
data.tar.gz: 13d08c92b0d7ed1869eea75d5a169be6e3330314d57683f9385e628510382fe3b1d62a094646227086e985e80d1203dc8b3006ecaa159d4519c6e96af4c12fd8
|
data/.gitignore
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -24,6 +24,7 @@ Now you will find your customized selendroid-server. To run the server:
|
|
24
24
|
|
25
25
|
A sample test looks like:
|
26
26
|
|
27
|
+
```java
|
27
28
|
driver = new AndroidDriver(new URL("http://localhost:8080/wd/hub"), getDefaultCapabilities());
|
28
29
|
driver.findElement(By.id("startUserRegistration")).click();
|
29
30
|
|
@@ -36,14 +37,10 @@ A sample test looks like:
|
|
36
37
|
nameInput.sendKeys(user.getName());
|
37
38
|
takeScreenShot("User data entered.");
|
38
39
|
driver.findElement(By.id("btnRegisterUser")).click();
|
40
|
+
```
|
39
41
|
|
40
|
-
|
42
|
+
## You want more details?
|
41
43
|
|
42
|
-
|
43
|
-
-------------
|
44
|
-
|
45
|
-
Please keep in mind that this project is in very early stages. Help is appreciated. Reach us out in the issues or via email.
|
46
|
-
|
47
|
-
You can track the current progress on the following [link](https://github.com/DominikDary/selendroid/wiki/JSON-Wire-Protocol)
|
44
|
+
Please have a look at the [wiki](https://github.com/DominikDary/selendroid/wiki/).
|
48
45
|
|
49
46
|
|
data/bin/selendroid
CHANGED
@@ -28,7 +28,7 @@ def print_comamndline_help
|
|
28
28
|
start <apk>
|
29
29
|
Starts the selendroid server on the first available Android device.
|
30
30
|
Commamd expects that the apps are already installed on the device.
|
31
|
-
shell
|
31
|
+
shell <apk>
|
32
32
|
Starts the selendroid-server on the device (apps must be already in-
|
33
33
|
stalled) and opens an irb shell with an active WebDriver session.
|
34
34
|
version
|
@@ -47,12 +47,11 @@ def relative_to_full_path(file_path)
|
|
47
47
|
File.expand_path(file_path)
|
48
48
|
end
|
49
49
|
|
50
|
-
def
|
50
|
+
def raise_if_android_and_java_home_not_set
|
51
51
|
raise "Please set the ANDROID_HOME environment variable" unless ENV["ANDROID_HOME"]
|
52
|
+
raise "Please set the JAVA_HOME environment variable" unless ENV["JAVA_HOME"]
|
52
53
|
end
|
53
54
|
|
54
|
-
require File.join(File.dirname(__FILE__), "selendroid-shell")
|
55
|
-
|
56
55
|
if (ARGV.length == 0)
|
57
56
|
print_comamndline_help
|
58
57
|
exit 0
|
@@ -62,17 +61,28 @@ if cmd == 'help'
|
|
62
61
|
print_comamndline_help
|
63
62
|
exit 0
|
64
63
|
elsif cmd == 'shell'
|
65
|
-
|
64
|
+
raise_if_android_and_java_home_not_set
|
65
|
+
puts "Please specify the app you want to automate!" if (ARGV.empty? or not is_apk_file?(ARGV.first))
|
66
|
+
unless ENV["SELENDROID_SERVER_PORT"]
|
67
|
+
ENV["SELENDROID_SERVER_PORT"] = "8080"
|
68
|
+
end
|
69
|
+
while not ARGV.empty? and is_apk_file?(ARGV.first)
|
70
|
+
ENV["MAIN_ACTIVITY"] = get_app_main_activity(relative_to_full_path(ARGV.shift))
|
71
|
+
ENV["IRBRC"] = File.join(File.dirname(__FILE__), '..', 'irbrc')
|
72
|
+
|
73
|
+
system "#{RbConfig.ruby} -S irb"
|
74
|
+
end
|
75
|
+
|
66
76
|
exit 0
|
67
77
|
elsif cmd == 'build'
|
68
|
-
|
78
|
+
raise_if_android_and_java_home_not_set
|
69
79
|
puts "Please specify the app you want to build a selendroid-server for!" if (ARGV.empty? or not is_apk_file?(ARGV.first))
|
70
80
|
while not ARGV.empty? and is_apk_file?(ARGV.first)
|
71
81
|
rebuild_selendroid(relative_to_full_path(ARGV.shift))
|
72
82
|
end
|
73
83
|
exit 0
|
74
84
|
elsif cmd=='build-and-start'
|
75
|
-
|
85
|
+
raise_if_android_and_java_home_not_set
|
76
86
|
puts "Please specify the app you want to automate!" if (ARGV.empty? or not is_apk_file?(ARGV.first))
|
77
87
|
while not ARGV.empty? and is_apk_file?(ARGV.first)
|
78
88
|
app_apk_under_test = relative_to_full_path(ARGV.shift)
|
@@ -83,7 +93,7 @@ elsif cmd=='build-and-start'
|
|
83
93
|
end
|
84
94
|
exit 0
|
85
95
|
elsif cmd=='start'
|
86
|
-
|
96
|
+
raise_if_android_and_java_home_not_set
|
87
97
|
puts "Please specify the app you want to automate!" if (ARGV.empty? or not is_apk_file?(ARGV.first))
|
88
98
|
while not ARGV.empty? and is_apk_file?(ARGV.first)
|
89
99
|
app_apk_under_test = relative_to_full_path(ARGV.shift)
|
data/lib/selendroid/commands.rb
CHANGED
@@ -4,9 +4,9 @@ end
|
|
4
4
|
|
5
5
|
def adb_command
|
6
6
|
if is_windows?
|
7
|
-
"#{ENV["ANDROID_HOME"]}
|
7
|
+
"\"#{ENV["ANDROID_HOME"]}/platform-tools/adb.exe\""
|
8
8
|
else
|
9
|
-
"#{ENV["ANDROID_HOME"]}/platform-tools/adb"
|
9
|
+
"\"#{ENV["ANDROID_HOME"]}/platform-tools/adb\""
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -16,24 +16,32 @@ end
|
|
16
16
|
|
17
17
|
def aapt_command
|
18
18
|
if is_windows?
|
19
|
-
"#{ENV["ANDROID_HOME"]}
|
19
|
+
"\"#{ENV["ANDROID_HOME"]}/platform-tools/aapt.exe\""
|
20
20
|
else
|
21
|
-
"#{ENV["ANDROID_HOME"]}/platform-tools/aapt"
|
21
|
+
"\"#{ENV["ANDROID_HOME"]}/platform-tools/aapt\""
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
def java_command
|
26
26
|
if is_windows?
|
27
|
-
"#{ENV["JAVA_HOME"]}
|
27
|
+
"\"#{ENV["JAVA_HOME"]}/bin/java.exe\""
|
28
28
|
else
|
29
|
-
"#{ENV["JAVA_HOME"]}/bin/java"
|
29
|
+
"\"#{ENV["JAVA_HOME"]}/bin/java\""
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
def jarsigner_command
|
34
34
|
if is_windows?
|
35
|
-
"#{ENV["JAVA_HOME"]}
|
35
|
+
"\"#{ENV["JAVA_HOME"]}/bin/jarsigner.exe\""
|
36
36
|
else
|
37
|
-
"#{ENV["JAVA_HOME"]}/bin/jarsigner"
|
37
|
+
"\"#{ENV["JAVA_HOME"]}/bin/jarsigner\""
|
38
38
|
end
|
39
|
-
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def keytool_command
|
42
|
+
if is_windows?
|
43
|
+
"\"#{ENV["JAVA_HOME"]}/bin/keytool.exe\""
|
44
|
+
else
|
45
|
+
"\"#{ENV["JAVA_HOME"]}/bin/keytool\""
|
46
|
+
end
|
47
|
+
end
|
@@ -6,7 +6,7 @@ require 'colorize'
|
|
6
6
|
|
7
7
|
def rebuild_selendroid(app)
|
8
8
|
aut_base_package = get_app_base_package(app)
|
9
|
-
log "Building selendroid-server for package #{aut_base_package
|
9
|
+
log "Building selendroid-server for package #{aut_base_package}".green
|
10
10
|
|
11
11
|
test_server_file_name = selendroid_server_path(aut_base_package)
|
12
12
|
FileUtils.mkdir_p File.dirname(test_server_file_name) unless File.exist? File.dirname(test_server_file_name)
|
@@ -45,17 +45,29 @@ def rebuild_selendroid(app)
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def get_app_base_package(app)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
default_cmd = "#{aapt_command} dump badging #{app} "
|
49
|
+
windows_cmd = "#{default_cmd} | findSTR package "
|
50
|
+
x_cmd = "#{default_cmd} | grep package "
|
51
|
+
if is_windows?
|
52
|
+
manifest_package = %x[#{windows_cmd} ]
|
53
|
+
else
|
54
|
+
manifest_package = %x[ #{x_cmd} ]
|
55
|
+
end
|
56
|
+
|
57
|
+
manifest_package.match(/name=['"]([^'"]+)['"]/)[1]
|
52
58
|
end
|
53
59
|
|
54
60
|
def get_app_main_activity(app)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
61
|
+
default_cmd = "#{aapt_command} dump badging #{app} "
|
62
|
+
windows_cmd = "#{default_cmd} | findSTR launchable-activity "
|
63
|
+
x_cmd = "#{default_cmd} | grep launchable-activity "
|
64
|
+
if is_windows?
|
65
|
+
manifest_activity = %x[ #{windows_cmd}]
|
66
|
+
else
|
67
|
+
manifest_activity = %x[ #{x_cmd}]
|
68
|
+
end
|
69
|
+
|
70
|
+
manifest_activity.match(/name=['"]([^'"]+)['"]/)[1]
|
59
71
|
end
|
60
72
|
|
61
73
|
def is_app_installed_on_device(app_base_package, device_arg)
|
@@ -69,14 +81,25 @@ def is_app_installed_on_device(app_base_package, device_arg)
|
|
69
81
|
end
|
70
82
|
|
71
83
|
def get_first_android_device
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
84
|
+
windows_cmd = "#{adb_command} devices | more +1"
|
85
|
+
x_cmd = "#{adb_command} devices | head -2 | tail -1 "
|
86
|
+
|
87
|
+
if is_windows?
|
88
|
+
device = %x[ #{windows_cmd}]
|
89
|
+
else
|
90
|
+
device = %x[ #{x_cmd}]
|
91
|
+
end
|
92
|
+
message_no_device = "No running Android device was found. Is the device plugged in or the emulator started?"
|
93
|
+
if device.nil? || device.empty?
|
94
|
+
raise message_no_device
|
95
|
+
end
|
96
|
+
|
97
|
+
device = device.split[0]
|
76
98
|
if device.nil? || device.empty?
|
77
|
-
raise
|
99
|
+
raise message_no_device
|
78
100
|
end
|
79
|
-
|
101
|
+
|
102
|
+
device.tr("\n","")
|
80
103
|
end
|
81
104
|
|
82
105
|
def prepare_device(app)
|
@@ -93,6 +116,7 @@ def prepare_device(app)
|
|
93
116
|
|
94
117
|
aut_base_package = get_app_base_package(app)
|
95
118
|
aut_main_activity = get_app_main_activity(app)
|
119
|
+
|
96
120
|
if is_app_installed_on_device(aut_base_package,device_serial)
|
97
121
|
uninstall_cmd = "#{adb_command} -s #{device_serial} uninstall #{aut_base_package}"
|
98
122
|
%x[ #{uninstall_cmd}]
|
@@ -115,8 +139,13 @@ def resign_apk(app_path, dest_path)
|
|
115
139
|
end
|
116
140
|
|
117
141
|
def sign_apk(app_path, dest_path)
|
142
|
+
if !File.file?( Dir.home+"/.android/debug.keystore")
|
143
|
+
log "keystore missing - creating one"
|
144
|
+
cmd= "#{keytool_command} -genkey -v -keystore #{Dir.home}/.android/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname \"CN=Android Debug,O=Android,C=US\" -storetype JKS -sigalg MD5withRSA -keyalg RSA"
|
145
|
+
system(cmd)
|
146
|
+
end
|
118
147
|
|
119
|
-
cmd = "#{jarsigner_command} -sigalg MD5withRSA -digestalg SHA1 -signedjar #{dest_path} -storepass android -keystore
|
148
|
+
cmd = "#{jarsigner_command} -sigalg MD5withRSA -digestalg SHA1 -signedjar #{dest_path} -storepass android -keystore #{Dir.home}/.android/debug.keystore #{app_path} androiddebugkey"
|
120
149
|
unless system(cmd)
|
121
150
|
raise "Could not sign app (#{app_path}"
|
122
151
|
end
|
@@ -77,20 +77,20 @@ def start_selendroid_server(activity)
|
|
77
77
|
main_activity =activity
|
78
78
|
end
|
79
79
|
log "Starting selendroid-server with main activity: #{main_activity}"
|
80
|
-
selendroid_server_start_cmd = "#{adb_command} shell am instrument -e main_activity '#{main_activity}' org.openqa.selendroid
|
81
|
-
|
80
|
+
selendroid_server_start_cmd = "#{adb_command} shell am instrument -e main_activity '#{main_activity}' org.openqa.selendroid/.ServerInstrumentation"
|
81
|
+
system(selendroid_server_start_cmd)
|
82
82
|
unless ENV["SELENDROID_SERVER_PORT"]
|
83
83
|
ENV["SELENDROID_SERVER_PORT"] = "8080"
|
84
84
|
end
|
85
85
|
forward_cmd = "#{adb_command} forward tcp:#{ENV["SELENDROID_SERVER_PORT"]} tcp:8080"
|
86
|
-
|
86
|
+
system(forward_cmd)
|
87
87
|
end
|
88
88
|
|
89
89
|
def wait_for_selendroid_server
|
90
90
|
unless ENV["SELENDROID_SERVER_PORT"]
|
91
91
|
ENV["SELENDROID_SERVER_PORT"] = "8080"
|
92
92
|
end
|
93
|
-
retriable :tries =>
|
93
|
+
retriable :tries => 10, :interval => 3 do
|
94
94
|
url = URI.parse("http://localhost:#{ENV["SELENDROID_SERVER_PORT"]}/wd/hub/status")
|
95
95
|
the_request = Net::HTTP::Get.new("#{url.path}")
|
96
96
|
|
data/lib/selendroid/version.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
3
3
|
package="org.openqa.selendroid"
|
4
4
|
android:versionCode="1"
|
5
|
-
android:versionName="0.
|
5
|
+
android:versionName="0.3.0" >
|
6
6
|
<uses-sdk android:minSdkVersion="10" />
|
7
7
|
|
8
8
|
<instrumentation android:name="org.openqa.selendroid.ServerInstrumentation" android:targetPackage="org.openqa.selendroid.testapp" />
|
Binary file
|
data/selendroid.gemspec
CHANGED
@@ -11,8 +11,10 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.homepage = "http://dominikdary.github.com/selendroid/"
|
12
12
|
gem.description = %q{"Selenium for Android Apps" (Test automate native or hybrid Android apps with Selendroid.)}
|
13
13
|
gem.summary = %q{Utility so simplify usage of the selendroid-server.}
|
14
|
+
ignores = File.readlines('.gitignore').grep(/\S+/).map {|s| s.chomp }
|
15
|
+
dotfiles = [ '.gitignore']
|
16
|
+
gem.files = (Dir["**/*"].reject { |f| File.directory?(f) || ignores.any? { |i| File.fnmatch(i, f) } } + dotfiles+ Dir["selendroid-prebuild"]).sort
|
14
17
|
|
15
|
-
gem.files = `git ls-files`.split("\n") + Dir["selendroid-prebuild"]
|
16
18
|
gem.executables = "selendroid"
|
17
19
|
gem.require_paths = ["lib"]
|
18
20
|
gem.add_dependency( "rubyzip")
|
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.
|
4
|
+
version: 0.3.0
|
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-
|
11
|
+
date: 2013-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -109,7 +109,6 @@ files:
|
|
109
109
|
- README.md
|
110
110
|
- Rakefile
|
111
111
|
- bin/selendroid
|
112
|
-
- bin/selendroid-shell.rb
|
113
112
|
- irbrc
|
114
113
|
- lib/selendroid.rb
|
115
114
|
- lib/selendroid/commands.rb
|
data/bin/selendroid-shell.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'selendroid/selendroid_driver'
|
2
|
-
|
3
|
-
def selendroid_shell
|
4
|
-
unless ENV["SELENDROID_SERVER_PORT"]
|
5
|
-
ENV["SELENDROID_SERVER_PORT"] = "8080"
|
6
|
-
end
|
7
|
-
|
8
|
-
unless ENV["MAIN_ACTIVITY"]
|
9
|
-
ENV["MAIN_ACTIVITY"] = "org.openqa.selendroid.testapp.HomeScreenActivity"
|
10
|
-
end
|
11
|
-
ENV["IRBRC"] = File.join(File.dirname(__FILE__), '..', 'irbrc')
|
12
|
-
|
13
|
-
system "#{RbConfig.ruby} -S irb"
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
|