selenium_shots 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +0 -10
- data/bin/selenium_shots_local_server +4 -42
- data/examples/google.rb +15 -0
- data/lib/selenium_shots/cli/client.rb +1 -6
- data/lib/selenium_shots/cli/command.rb +2 -0
- data/lib/selenium_shots/cli/commands/app.rb +5 -12
- data/lib/selenium_shots/cli/commands/auth.rb +2 -2
- data/lib/selenium_shots/cli/commands/base.rb +8 -9
- data/lib/selenium_shots/cli/commands/help.rb +3 -2
- data/lib/selenium_shots/cli/commands/server.rb +34 -0
- data/lib/selenium_shots/cli/init.rb +2 -2
- data/lib/selenium_shots/test_selenium_shots.rb +29 -5
- data/spec/base.rb +14 -0
- data/spec/commands/app_spec.rb +26 -0
- data/spec/commands/auth_spec.rb +83 -0
- data/spec/commands/base_spec.rb +38 -0
- data/spec/commands/server_spec.rb +22 -0
- metadata +24 -3
data/README.rdoc
CHANGED
@@ -3,16 +3,6 @@
|
|
3
3
|
http://www.seleniumshots.com
|
4
4
|
Selenium Shots is an Integration Testing Service that transparently distributes your integration tests across multiple operating systems with different versions of all major browsers AND captures a screen shot. This eliminates the need to have multiple vm's on your computer or the need for multiple machines on your test to test your web application. Running your tests remotely will dramatically speed up in-browser web testing and leave more time to and create a slide show available to confirm visuals making it easy for you to improve your web application.
|
5
5
|
|
6
|
-
== Note on Patches/Pull Requests
|
7
|
-
|
8
|
-
* Fork the project.
|
9
|
-
* Make your feature addition or bug fix.
|
10
|
-
* Add tests for it. This is important so I don't break it in a
|
11
|
-
future version unintentionally.
|
12
|
-
* Commit, do not mess with rakefile, version, or history.
|
13
|
-
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
14
|
-
* Send me a pull request. Bonus points for topic branches.
|
15
|
-
|
16
6
|
== Copyright
|
17
7
|
|
18
8
|
Copyright (c) 2010 Kyle Ginavan. See LICENSE for details.
|
@@ -3,52 +3,14 @@
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'fileutils'
|
5
5
|
|
6
|
-
|
7
|
-
SELENIUM_SERVER = File.join(GEM_ROOT, 'vendor', 'selenium-server-1.0.2-SNAPSHOT-standalone.jar')
|
6
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib/selenium_shots/cli/')
|
8
7
|
|
9
|
-
|
10
|
-
module SeleniumShots
|
11
|
-
module Server
|
12
|
-
class << self
|
13
|
-
def pid_file
|
14
|
-
'/tmp/selenium_shots.pid'
|
15
|
-
end
|
16
|
-
|
17
|
-
def start_process
|
18
|
-
if File.exists?(pid_file)
|
19
|
-
puts "the selenium shots server is running...."
|
20
|
-
else
|
21
|
-
pipe = IO.popen("java -jar #{SELENIUM_SERVER}")
|
22
|
-
File.open(pid_file, 'w') {|f| f.write(pipe.pid) }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def stop_process
|
27
|
-
if File.exists?(pid_file)
|
28
|
-
process_id = File.open(pid_file,'r').readline
|
29
|
-
Process.kill 9, process_id.to_i
|
30
|
-
FileUtils.rm(pid_file)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
help = <<EOF
|
38
|
-
selenium_shots_local_server {start|stop}
|
39
|
-
EOF
|
8
|
+
require 'init'
|
40
9
|
|
41
10
|
args = ARGV.dup
|
42
11
|
ARGV.clear
|
43
12
|
|
44
|
-
command = args.shift.strip rescue help
|
13
|
+
command = args.shift.strip rescue 'help'
|
45
14
|
|
46
|
-
|
47
|
-
when "start"
|
48
|
-
SeleniumShots::Server.start_process
|
49
|
-
when "stop":
|
50
|
-
SeleniumShots::Server.stop_process
|
51
|
-
else
|
52
|
-
puts help
|
53
|
-
end
|
15
|
+
SeleniumShots::Command.run("server:#{command}", args)
|
54
16
|
|
data/examples/google.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
|
2
|
+
|
3
|
+
class Google < SeleniumShots
|
4
|
+
|
5
|
+
@group = "Google"
|
6
|
+
|
7
|
+
selenium_shot "should search on google" do
|
8
|
+
@name = "selenium shots"
|
9
|
+
browser.open "/"
|
10
|
+
browser.type "q", "Selenium Shots"
|
11
|
+
browser.click "btnG"
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
2
|
+
require 'rest_client'
|
3
3
|
require 'uri'
|
4
4
|
require 'time'
|
5
5
|
|
@@ -12,11 +12,6 @@ class SeleniumShots::Client
|
|
12
12
|
@host = host
|
13
13
|
end
|
14
14
|
|
15
|
-
def list
|
16
|
-
#get list app from selenium_shots
|
17
|
-
[]
|
18
|
-
end
|
19
|
-
|
20
15
|
############
|
21
16
|
def resource(uri)
|
22
17
|
RestClient::Resource.new("http://#{host}", api_key)[uri]
|
@@ -8,6 +8,8 @@ module SeleniumShots
|
|
8
8
|
run_internal(command, args)
|
9
9
|
rescue InvalidCommand
|
10
10
|
display "Unknown command. Run 'selenium_shots help' for usage information."
|
11
|
+
rescue RestClient::Unauthorized
|
12
|
+
display "Authentication failure. For more information you can go to http://www.seleniumshots.com"
|
11
13
|
end
|
12
14
|
|
13
15
|
def run_internal(command, args)
|
@@ -1,23 +1,16 @@
|
|
1
1
|
module SeleniumShots::Command
|
2
2
|
class App < Base
|
3
3
|
def create
|
4
|
-
name
|
4
|
+
name = args.shift.downcase.strip rescue nil
|
5
5
|
if name
|
6
|
-
|
7
|
-
|
6
|
+
selenium_shots_api_key
|
7
|
+
if make_config_file(name, @api_key) == "y"
|
8
|
+
display "Created #{name}\nYou can configurate selenium shots on config/selenium_shots.yml"
|
9
|
+
end
|
8
10
|
else
|
9
11
|
display "You need specify a name for your app. Run 'selenium_shots help' for usage information"
|
10
12
|
end
|
11
13
|
end
|
12
|
-
|
13
|
-
def list
|
14
|
-
list = selenium_shots.list
|
15
|
-
if list.size > 0
|
16
|
-
display list.join("\n")
|
17
|
-
else
|
18
|
-
display "You have no apps."
|
19
|
-
end
|
20
|
-
end
|
21
14
|
end
|
22
15
|
end
|
23
16
|
|
@@ -15,7 +15,7 @@ module SeleniumShots::Command
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def get_api_key_from_host
|
18
|
-
RestClient.post 'http://seleniumshots.heroku.com/selenium_tests/get_api_key', :user_session => { :
|
18
|
+
RestClient.post 'http://seleniumshots.heroku.com/selenium_tests/get_api_key', :user_session => { :email => @api_key_hash[0],
|
19
19
|
:password => @api_key_hash[1]}
|
20
20
|
end
|
21
21
|
|
@@ -49,7 +49,7 @@ module SeleniumShots::Command
|
|
49
49
|
def ask_for_api_key
|
50
50
|
puts "Enter your SeleniumShots Account"
|
51
51
|
|
52
|
-
print "
|
52
|
+
print "Email: "
|
53
53
|
user = ask
|
54
54
|
|
55
55
|
print "Password: "
|
@@ -11,6 +11,10 @@ module SeleniumShots::Command
|
|
11
11
|
@selenium_shots ||= SeleniumShots::Command.run_internal('auth:client', args)
|
12
12
|
end
|
13
13
|
|
14
|
+
def selenium_shots_api_key
|
15
|
+
@api_key ||= SeleniumShots::Command.run_internal('auth:api_key', args)
|
16
|
+
end
|
17
|
+
|
14
18
|
def display(msg, newline=true)
|
15
19
|
newline ? puts(msg) : print(msg)
|
16
20
|
end
|
@@ -38,7 +42,7 @@ module SeleniumShots::Command
|
|
38
42
|
|
39
43
|
def ask_for_config_file
|
40
44
|
if File.exists?(config_file)
|
41
|
-
print "The config
|
45
|
+
print "The file config/selenium_shots.yml exists, do you want overwrite this? (y/n): "
|
42
46
|
ask
|
43
47
|
else
|
44
48
|
"y"
|
@@ -49,15 +53,14 @@ module SeleniumShots::Command
|
|
49
53
|
overwrite_or_create_file = ask_for_config_file
|
50
54
|
if overwrite_or_create_file == "y"
|
51
55
|
config_file_hash = <<EOFILE
|
52
|
-
#remote way
|
53
56
|
api_key: "#{api_key}"
|
54
57
|
mode: "remote" # "local" for run test locally
|
55
58
|
default_browser_url: "http://www.myapp.com"
|
56
59
|
application_name: "#{name}"
|
60
|
+
local_browser: "*firefox3"
|
57
61
|
browsers:
|
58
|
-
- IE8 on XP
|
59
|
-
- Firefox3.6 on XP
|
60
|
-
# - "*firefox3" #browser for local way
|
62
|
+
- IE8 on XP
|
63
|
+
- Firefox3.6 on XP
|
61
64
|
EOFILE
|
62
65
|
File.open(config_file, 'w') do |f|
|
63
66
|
f.puts config_file_hash
|
@@ -66,10 +69,6 @@ EOFILE
|
|
66
69
|
overwrite_or_create_file
|
67
70
|
end
|
68
71
|
|
69
|
-
def inside_rails_app?
|
70
|
-
File.exists?('config/environment.rb')
|
71
|
-
end
|
72
|
-
|
73
72
|
end
|
74
73
|
|
75
74
|
end
|
@@ -8,8 +8,9 @@ module SeleniumShots::Command
|
|
8
8
|
usage = <<EOTXT
|
9
9
|
=== General Commands
|
10
10
|
|
11
|
-
help
|
12
|
-
create [name]
|
11
|
+
help # show this usage
|
12
|
+
create [name] # create file config for your app
|
13
|
+
|
13
14
|
=== Example story:
|
14
15
|
|
15
16
|
rails myapp
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module SeleniumShots::Command
|
2
|
+
class Server < Base
|
3
|
+
|
4
|
+
GEM_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '/../../../../'))
|
5
|
+
SELENIUM_SERVER = File.join(GEM_ROOT, 'vendor', 'selenium-server-1.0.2-SNAPSHOT-standalone.jar')
|
6
|
+
|
7
|
+
def pid_file
|
8
|
+
'/tmp/selenium_shots.pid'
|
9
|
+
end
|
10
|
+
|
11
|
+
def start
|
12
|
+
if File.exists?(pid_file)
|
13
|
+
puts "the selenium shots server is running...."
|
14
|
+
else
|
15
|
+
pipe = IO.popen("java -jar #{SELENIUM_SERVER}")
|
16
|
+
File.open(pid_file, 'w') {|f| f.write(pipe.pid) }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def stop
|
21
|
+
if File.exists?(pid_file)
|
22
|
+
process_id = File.open(pid_file,'r').readline
|
23
|
+
Process.kill 9, process_id.to_i
|
24
|
+
FileUtils.rm(pid_file)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def help
|
29
|
+
puts "selenium_shots_local_server {start|stop}"
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -5,11 +5,9 @@ require 'active_support'
|
|
5
5
|
require 'active_support/test_case'
|
6
6
|
require 'ostruct'
|
7
7
|
|
8
|
-
|
9
8
|
#load config
|
10
9
|
SeleniumConfig = OpenStruct.new(YAML.load_file("#{RAILS_ROOT}/config/selenium_shots.yml"))
|
11
10
|
#
|
12
|
-
ENV["RAILS_ENV"] = "test"
|
13
11
|
|
14
12
|
#activeresource models
|
15
13
|
class SeleniumTest < ActiveResource::Base
|
@@ -37,6 +35,22 @@ class SeleniumShots < ActionController::IntegrationTest
|
|
37
35
|
"/tmp/selenium_shots.pid"
|
38
36
|
end
|
39
37
|
|
38
|
+
def local_browsers
|
39
|
+
["*firefox3", "*iexplore", "*safari"]
|
40
|
+
end
|
41
|
+
|
42
|
+
def selected_browsers
|
43
|
+
if SeleniumConfig.mode == "remote"
|
44
|
+
SeleniumConfig.browsers
|
45
|
+
else
|
46
|
+
if defined?(SeleniumConfig.local_browser)
|
47
|
+
[SeleniumConfig.local_browser]
|
48
|
+
else
|
49
|
+
[local_browsers.first]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
40
54
|
def setup
|
41
55
|
if(not self.class.expected_test_count)
|
42
56
|
self.class.expected_test_count = (self.class.instance_methods.reject{|method| method[0..3] != 'test'}).length
|
@@ -75,14 +89,24 @@ class SeleniumShots < ActionController::IntegrationTest
|
|
75
89
|
end
|
76
90
|
|
77
91
|
def run_in_all_browsers(&block)
|
78
|
-
|
92
|
+
browsers = (@selected_browser || selected_browsers)
|
93
|
+
browsers.each do |browser_spec|
|
79
94
|
begin
|
80
95
|
run_browser(browser_spec, block)
|
81
96
|
@error = nil
|
82
|
-
rescue
|
97
|
+
rescue => error
|
83
98
|
@error = error.message
|
99
|
+
if @error.match(/Failed to start new browser session/) && SeleniumConfig.mode == "local"
|
100
|
+
@tmp_browsers ||= local_browsers
|
101
|
+
@tmp_browsers.delete(browser_spec)
|
102
|
+
@selected_browser = [@tmp_browsers.shift]
|
103
|
+
unless @selected_browser.empty?
|
104
|
+
puts "The browser #{browser_spec} is not available, selenium_shots going to try with #{@selected_browser} browser"
|
105
|
+
run_in_all_browsers(&block)
|
106
|
+
end
|
107
|
+
end
|
84
108
|
end
|
85
|
-
|
109
|
+
assert @error.nil?, "Expected zero failures or errors, but got #{@error}\n"
|
86
110
|
end
|
87
111
|
end
|
88
112
|
|
data/spec/base.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
require File.dirname(__FILE__) + '/../lib/selenium_shots/cli/init'
|
6
|
+
|
7
|
+
%w(app auth base server).each { |c| require c }
|
8
|
+
|
9
|
+
def prepare_command(klass)
|
10
|
+
command = klass.new([])
|
11
|
+
command.stub!(:display)
|
12
|
+
command
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../base'
|
2
|
+
|
3
|
+
module SeleniumShots::Command
|
4
|
+
describe App do
|
5
|
+
before do
|
6
|
+
@cli = prepare_command(App)
|
7
|
+
@auth = prepare_command(Auth)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "creates with a name" do
|
11
|
+
@cli.stub!(:args).and_return([ 'myapp' ])
|
12
|
+
@cli.stub!(:selenium_shots_api_key).and_return("api_key")
|
13
|
+
@cli.should_receive(:make_config_file)
|
14
|
+
@cli.create
|
15
|
+
end
|
16
|
+
|
17
|
+
it "cant creates app without a name" do
|
18
|
+
@cli.stub!(:args).and_return([ nil ])
|
19
|
+
@cli.stub!(:selenium_shots_api_key)
|
20
|
+
@cli.should_not_receive(:make_config_file)
|
21
|
+
@cli.create
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../base'
|
2
|
+
|
3
|
+
module SeleniumShots::Command
|
4
|
+
describe Auth do
|
5
|
+
before do
|
6
|
+
@cli = prepare_command(Auth)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "reads api key from the api keys file" do
|
10
|
+
sandbox = "/tmp/cli_spec_#{Process.pid}"
|
11
|
+
File.open(sandbox, "w") { |f| f.write "api_key" }
|
12
|
+
@cli.stub!(:api_key_file).and_return(sandbox)
|
13
|
+
@cli.read_api_key.should == %w(api_key)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "takes the apikey from the file" do
|
17
|
+
@cli.stub!(:read_api_key).and_return(%w(api_key))
|
18
|
+
@cli.api_key.should == %w(api_key)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "asks for api_key when the file doesn't exist" do
|
22
|
+
sandbox = "/tmp/cli_spec_#{Process.pid}"
|
23
|
+
FileUtils.rm_rf(sandbox)
|
24
|
+
@cli.stub!(:api_key_file).and_return(sandbox)
|
25
|
+
@cli.should_receive(:ask_for_api_key).and_return(['u', 'p'])
|
26
|
+
@cli.should_receive(:save_api_key)
|
27
|
+
@cli.get_api_key.should == [ 'u', 'p' ]
|
28
|
+
end
|
29
|
+
|
30
|
+
it "writes the api_key to a file" do
|
31
|
+
sandbox = "/tmp/cli_spec_#{Process.pid}"
|
32
|
+
FileUtils.rm_rf(sandbox)
|
33
|
+
@cli.stub!(:api_key_file).and_return(sandbox)
|
34
|
+
@cli.stub!(:api_key_hash).and_return(['api_key'])
|
35
|
+
@cli.should_receive(:set_api_key_permissions)
|
36
|
+
@cli.write_api_key
|
37
|
+
File.read(sandbox).should == "api_key\n"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "sets ~/.selenium_shots/api_key to be readable only by the user" do
|
41
|
+
sandbox = "/tmp/cli_spec_#{Process.pid}"
|
42
|
+
FileUtils.rm_rf(sandbox)
|
43
|
+
FileUtils.mkdir_p(sandbox)
|
44
|
+
fname = "#{sandbox}/file"
|
45
|
+
system "touch #{fname}"
|
46
|
+
@cli.stub!(:api_key_file).and_return(fname)
|
47
|
+
@cli.set_api_key_permissions
|
48
|
+
File.stat(sandbox).mode.should == 040700
|
49
|
+
File.stat(fname).mode.should == 0100600
|
50
|
+
end
|
51
|
+
|
52
|
+
it "writes api_key when the account is ok" do
|
53
|
+
@cli.stub!(:api_key)
|
54
|
+
@cli.should_receive(:write_api_key)
|
55
|
+
@cli.should_receive(:get_api_key_from_host).and_return("api_key")
|
56
|
+
@cli.save_api_key
|
57
|
+
end
|
58
|
+
|
59
|
+
it "save_api_key deletes the api_key when the resquest api_key is unauthorized" do
|
60
|
+
@cli.stub!(:write_api_key)
|
61
|
+
@cli.stub!(:retry_login?).and_return(false)
|
62
|
+
@cli.should_receive(:get_api_key_from_host).and_raise(RestClient::Unauthorized)
|
63
|
+
@cli.should_receive(:delete_api_key)
|
64
|
+
lambda { @cli.save_api_key }.should raise_error(RestClient::Unauthorized)
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
it "asks for login again when not authorized, for three times" do
|
69
|
+
@cli.stub!(:read_api_key)
|
70
|
+
@cli.stub!(:write_api_key)
|
71
|
+
@cli.stub!(:delete_api_key)
|
72
|
+
@cli.should_receive(:get_api_key_from_host).exactly(3).times.and_raise(RestClient::Unauthorized)
|
73
|
+
@cli.should_receive(:ask_for_api_key).exactly(4).times
|
74
|
+
lambda { @cli.save_api_key }.should raise_error(RestClient::Unauthorized)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "deletes the api_key file" do
|
78
|
+
FileUtils.should_receive(:rm_f).with(@cli.api_key_file)
|
79
|
+
@cli.delete_api_key
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../base'
|
2
|
+
|
3
|
+
module SeleniumShots::Command
|
4
|
+
describe Base do
|
5
|
+
before do
|
6
|
+
@args = [1, 2]
|
7
|
+
@base = Base.new(@args)
|
8
|
+
@base.stub!(:display)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "initializes the selenium_shots client with the Auth command" do
|
12
|
+
SeleniumShots::Command.should_receive(:run_internal).with('auth:client', @args)
|
13
|
+
@base.selenium_shots
|
14
|
+
end
|
15
|
+
|
16
|
+
it "creates or overwrite the selenium_shots yml file" do
|
17
|
+
sandbox = "/tmp/cli_spec_selenium_shots"
|
18
|
+
@base.stub!(:config_file).and_return(sandbox)
|
19
|
+
@base.should_receive(:ask_for_config_file).and_return("y")
|
20
|
+
@base.make_config_file("myapp", "api_key")
|
21
|
+
File.exists?(sandbox) == true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "not overwrite the selenium_shots yml file" do
|
25
|
+
sandbox = "/tmp/cli_spec_selenium_shots"
|
26
|
+
@base.stub!(:config_file).and_return(sandbox)
|
27
|
+
@base.should_receive(:ask_for_config_file).and_return("n")
|
28
|
+
@base.make_config_file("myapp", "api_key")
|
29
|
+
File.exists?(sandbox) == false
|
30
|
+
end
|
31
|
+
|
32
|
+
it "return the config file name" do
|
33
|
+
@base.config_file.should == 'config/selenium_shots.yml'
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../base'
|
2
|
+
|
3
|
+
module SeleniumShots::Command
|
4
|
+
describe Server do
|
5
|
+
before do
|
6
|
+
@cli = prepare_command(Server)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "run local instance of selenium server" do
|
10
|
+
@cli.start
|
11
|
+
File.exists?("/tmp/selenium_shots.pid") == true
|
12
|
+
end
|
13
|
+
|
14
|
+
it "stop local instance of selenium server" do
|
15
|
+
@cli.stop
|
16
|
+
File.exists?("/tmp/selenium_shots.pid") == false
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 2
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Kyle J. Ginavan
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-04-
|
18
|
+
date: 2010-04-20 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -44,6 +44,20 @@ dependencies:
|
|
44
44
|
version: 1.2.18
|
45
45
|
type: :runtime
|
46
46
|
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rest-client
|
49
|
+
prerelease: false
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
- 8
|
57
|
+
- 2
|
58
|
+
version: 0.8.2
|
59
|
+
type: :runtime
|
60
|
+
version_requirements: *id003
|
47
61
|
description: Selenium Shots is an Integration Testing Service that transparently distributes your integration tests across multiple operating systems with different versions of all major browsers AND captures a screen shot
|
48
62
|
email: kyle@4rockets.com
|
49
63
|
executables:
|
@@ -63,6 +77,7 @@ files:
|
|
63
77
|
- lib/selenium_shots/cli/commands/auth.rb
|
64
78
|
- lib/selenium_shots/cli/commands/base.rb
|
65
79
|
- lib/selenium_shots/cli/commands/help.rb
|
80
|
+
- lib/selenium_shots/cli/commands/server.rb
|
66
81
|
- lib/selenium_shots/cli/init.rb
|
67
82
|
- lib/selenium_shots/test_selenium_shots.rb
|
68
83
|
- vendor/selenium-server-1.0.2-SNAPSHOT-standalone.jar
|
@@ -100,5 +115,11 @@ signing_key:
|
|
100
115
|
specification_version: 3
|
101
116
|
summary: Integration Tests made easy
|
102
117
|
test_files:
|
118
|
+
- spec/base.rb
|
119
|
+
- spec/commands/app_spec.rb
|
120
|
+
- spec/commands/auth_spec.rb
|
121
|
+
- spec/commands/base_spec.rb
|
122
|
+
- spec/commands/server_spec.rb
|
103
123
|
- test/helper.rb
|
104
124
|
- test/test_selenium_shots.rb
|
125
|
+
- examples/google.rb
|