selendroid 0.2.3 → 0.3.0
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/.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
|
-
|