selendroid 0.1.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.
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ selendroid-test-app-0.1-SNAPSHOT.apk
10
+ selendroid-server-0.0.1.apk
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in selendroid.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,15 @@
1
+ Copyright (c) 2013 Dary, Dominik
2
+
3
+ Apache License 2.0
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,48 @@
1
+ Selendroid
2
+ ==========
3
+
4
+ Selendroid is an attempt to implement the Selenium JSON Wire Protocol for Android native and hybrid apps.
5
+
6
+ Getting started
7
+ ---------------
8
+
9
+ Selendroid is based on the Android instrumentation framework, so therefor only testing one specific app is supported.
10
+ Selendroid-server in combination with the application under test (aut) must be installed on the device in order to be able to run automated end-to-end tests.
11
+
12
+ To write and run tests with selendroid, first a customized selendroid-server for your aut must be created. To simplify this process I have created a Ruby gem:
13
+
14
+ sudo gem install selendroid
15
+ selendroid build pathToYour.apk
16
+
17
+ Now you will find your customized selendroid-server. To run the server:
18
+
19
+ # start the selendroid server:
20
+ adb shell am instrument -e main_activity 'org.openqa.selendroid.testapp.HomeScreenActivity' org.openqa.selendroid.server/org.openqa.selendroid.server.ServerInstrumentation
21
+ # activate port forwarding.
22
+ adb forward tcp:8080 tcp:8080
23
+
24
+ A sample test looks like:
25
+
26
+ driver = new AndroidDriver(new URL("http://localhost:8080/wd/hub"), getDefaultCapabilities());
27
+ driver.findElement(By.id("startUserRegistration")).click();
28
+
29
+ WebDriverWait wait = new WebDriverWait(driver, 5);
30
+ WebElement inputUsername =
31
+ wait.until(ExpectedConditions.presenceOfElementLocated(By.id("inputUsername")));
32
+ inputUsername.sendKeys(user.getUsername());
33
+ Assert.assertEquals(nameInput.getText(), "Mr. Burns");
34
+ nameInput.clear();
35
+ nameInput.sendKeys(user.getName());
36
+ takeScreenShot("User data entered.");
37
+ driver.findElement(By.id("btnRegisterUser")).click();
38
+
39
+ More details about selendroid can be found in the [wiki](https://github.com/DominikDary/selendroid/wiki/).
40
+
41
+ Current state
42
+ -------------
43
+
44
+ Please keep in mind that this project is in very early stages. Help is appreciated. Reach us out in the issues or via email.
45
+
46
+ You can track the current progress on the following [link](https://github.com/DominikDary/selendroid/wiki/JSON-Wire-Protocol)
47
+
48
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/selendroid ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'fileutils'
4
+ require 'selendroid/selendroid_builder'
5
+ require 'rbconfig'
6
+
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
+
14
+ def print_comamndline_help
15
+ puts <<EOF
16
+ Usage: selendroid <command-name> [parameters]
17
+ <command-name> can be one of
18
+ help
19
+ Prints more detailed help information.
20
+ build <apk>
21
+ Builds the selendroid-server for the given apk.
22
+ To find help, please visit the official selendroid wiki: http://goo.gl/z30pj
23
+ EOF
24
+ end
25
+
26
+
27
+ def is_apk_file?(file_path)
28
+ file_path.end_with? ".apk" and File.exist? file_path
29
+ end
30
+
31
+ def relative_to_full_path(file_path)
32
+ File.expand_path(file_path)
33
+ end
34
+
35
+ def raise_if_android_home_not_set
36
+ raise "Please set the ANDROID_HOME environment variable" unless ENV["ANDROID_HOME"]
37
+ end
38
+
39
+ if (ARGV.length == 0)
40
+ print_comamndline_help
41
+ exit 0
42
+ end
43
+ cmd = ARGV.shift
44
+ if cmd == 'help'
45
+ print_comamndline_help
46
+ exit 0
47
+ elsif cmd == 'build'
48
+ raise_if_android_home_not_set
49
+ puts "Please specify the app you want to build a selendroid-server for" if (ARGV.empty? or not is_apk_file?(ARGV.first))
50
+ while not ARGV.empty? and is_apk_file?(ARGV.first)
51
+ rebuild_selendroid(relative_to_full_path(ARGV.shift))
52
+ end
53
+ exit 0
54
+ else
55
+ print_comamndline_help
56
+ exit 0
57
+ end
58
+
59
+
data/lib/selendroid.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Selendroid
2
+ # Your code goes here...
3
+ end
@@ -0,0 +1,64 @@
1
+ require "selendroid/version"
2
+ require 'zip/zip'
3
+ require 'tempfile'
4
+
5
+ def rebuild_selendroid(app)
6
+ aut_base_package = %x[ aapt dump badging '#{app}' | grep package | cut -d '=' -f2-|awk '{ print $1}' | tr -d "'" ]
7
+ puts "Building selendroid-server for package #{aut_base_package}"
8
+
9
+ test_server_file_name = selendroid_server_path(aut_base_package)
10
+ FileUtils.mkdir_p File.dirname(test_server_file_name) unless File.exist? File.dirname(test_server_file_name)
11
+
12
+ unsigned_test_apk = File.join(File.dirname(__FILE__), '..','..', 'selendroid-prebuild/selendroid-server.apk')
13
+ android_platform = Dir["#{ENV["ANDROID_HOME"].gsub("\\", "/")}/platforms/android-*"].last
14
+ raise "No Android SDK found in #{ENV["ANDROID_HOME"].gsub("\\", "/")}/platforms/" unless android_platform
15
+ Dir.mktmpdir do |workspace_dir|
16
+ Dir.chdir(workspace_dir) do
17
+ FileUtils.cp(unsigned_test_apk, "TestServer.apk")
18
+ FileUtils.cp(File.join(File.dirname(__FILE__), '..','..', 'selendroid-prebuild/AndroidManifest.xml'), "AndroidManifest.xml")
19
+
20
+ unless system %Q{"#{RbConfig.ruby}" -pi.bak -e "gsub(/#targetPackage#/, '#{aut_base_package}')" AndroidManifest.xml}
21
+ raise "Could not replace package name in manifest"
22
+ end
23
+
24
+ unless system %Q{"#{ENV["ANDROID_HOME"]}/platform-tools/aapt" package -M AndroidManifest.xml -I "#{android_platform}/android.jar" -F dummy.apk}
25
+ raise "Could not create dummy.apk"
26
+ end
27
+
28
+ Zip::ZipFile.new("dummy.apk").extract("AndroidManifest.xml","customAndroidManifest.xml")
29
+ Zip::ZipFile.open("TestServer.apk") do |zip_file|
30
+ zip_file.add("AndroidManifest.xml", "customAndroidManifest.xml")
31
+ end
32
+ end
33
+ sign_apk("#{workspace_dir}/TestServer.apk", test_server_file_name)
34
+ begin
35
+
36
+ rescue Exception => e
37
+ puts e
38
+ raise "Could not sign test server"
39
+ end
40
+ end
41
+ puts "Done signing the test server. Moved it to #{test_server_file_name}"
42
+ end
43
+
44
+ def is_windows?
45
+ (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
46
+ end
47
+
48
+ def sign_apk(app_path, dest_path)
49
+ if is_windows?
50
+ jarsigner_path = "\"#{ENV["JAVA_HOME"]}/bin/jarsigner.exe\""
51
+ else
52
+ jarsigner_path = "jarsigner"
53
+ end
54
+
55
+ cmd = "#{jarsigner_path} -sigalg MD5withRSA -digestalg SHA1 -signedjar #{dest_path} -storepass android -keystore ~/.android/debug.keystore #{app_path} androiddebugkey"
56
+ unless system(cmd)
57
+ puts "jarsigner command: #{cmd}"
58
+ raise "Could not sign app (#{app_path}"
59
+ end
60
+ end
61
+
62
+ def selendroid_server_path(base_package)
63
+ "selendroid-server-#{Selendroid::VERSION}.apk"
64
+ end
@@ -0,0 +1,3 @@
1
+ module Selendroid
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
+ package="org.openqa.selendroid"
4
+ android:versionCode="1"
5
+ android:versionName="0.1" >
6
+ <uses-sdk android:minSdkVersion="16" />
7
+
8
+ <instrumentation
9
+ android:name="org.openqa.selendroid.ServerInstrumentation"
10
+ android:targetPackage="org.openqa.selendroid.testapp" />
11
+
12
+ <uses-permission android:name="android.permission.INTERNET" />
13
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
14
+ <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
15
+ <uses-permission android:name="android.permission.INJECT_EVENTS" />
16
+
17
+ <application
18
+ android:label="Selendroid" >
19
+ <uses-library android:name="android.test.runner" />
20
+ </application>
21
+
22
+ </manifest>
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'selendroid/version'
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = "selendroid"
7
+ gem.platform = Gem::Platform::RUBY
8
+ gem.version = Selendroid::VERSION
9
+ gem.authors = ["Dominik Dary"]
10
+ gem.email = ["ddary@acm.org"]
11
+ gem.homepage = "http://github.com/DominikDary/"
12
+ gem.description = %q{Helper to create the selendroid-server}
13
+ gem.summary = %q{Selendroid Project}
14
+
15
+ gem.files = `git ls-files`.split("\n") + Dir["selendroid-prebuild"]
16
+ gem.executables = "selendroid"
17
+ gem.require_paths = ["lib"]
18
+ gem.add_dependency( "rubyzip")
19
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: selendroid
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Dominik Dary
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2013-02-20 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rubyzip
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ description: Helper to create the selendroid-server
33
+ email:
34
+ - ddary@acm.org
35
+ executables:
36
+ - selendroid
37
+ extensions: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ files:
42
+ - .gitignore
43
+ - Gemfile
44
+ - LICENSE.txt
45
+ - README.md
46
+ - Rakefile
47
+ - bin/selendroid
48
+ - lib/selendroid.rb
49
+ - lib/selendroid/selendroid_builder.rb
50
+ - lib/selendroid/version.rb
51
+ - selendroid-prebuild/AndroidManifest.xml
52
+ - selendroid-prebuild/selendroid-server.apk
53
+ - selendroid.gemspec
54
+ has_rdoc: true
55
+ homepage: http://github.com/DominikDary/
56
+ licenses: []
57
+
58
+ post_install_message:
59
+ rdoc_options: []
60
+
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ requirements: []
78
+
79
+ rubyforge_project:
80
+ rubygems_version: 1.3.6
81
+ signing_key:
82
+ specification_version: 3
83
+ summary: Selendroid Project
84
+ test_files: []
85
+