watirgrid 0.0.2 → 0.0.3b
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 +1 -0
- data/EXAMPLES.rdoc +14 -9
- data/README.rdoc +11 -7
- data/Rakefile +1 -1
- data/examples/simple.rb +14 -7
- data/lib/watirgrid.rb +67 -42
- data/spec/grid_spec.rb +65 -61
- metadata +4 -5
- data/TODO.rdoc +0 -16
data/.gitignore
CHANGED
data/EXAMPLES.rdoc
CHANGED
@@ -91,22 +91,27 @@ Watir has been extended with a Grid class that can be used as follows:
|
|
91
91
|
require 'rubygems'
|
92
92
|
require 'watirgrid'
|
93
93
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
94
|
+
grid = Watir::Grid.new(:ring_server_port => 12358)
|
95
|
+
grid.start(:quantity => 1, :read_all => true, :browser_type => 'ie')
|
96
|
+
threads = []
|
97
|
+
grid.browsers.each do |browser|
|
98
|
+
threads << Thread.new do
|
99
|
+
b = browser[:object].new_browser
|
100
|
+
b.goto("http://www.google.com")
|
101
|
+
b.text_field(:name, 'q').set("watirgrid")
|
102
|
+
b.button(:name, "btnI").click
|
103
|
+
end
|
100
104
|
end
|
105
|
+
threads.each {|thread| thread.join}
|
101
106
|
|
102
107
|
Stepping through this example we first instantiate a browsers object, specifying which ring server port to broadcast on when looking for available providers:
|
103
|
-
|
108
|
+
grid = Watir::Grid.new(:ring_server_port => 12358)
|
104
109
|
|
105
110
|
You may also need to tell the code which host the ring server is on:
|
106
|
-
|
111
|
+
grid = Watir::Grid.new(:ring_server_port => 12358, :ring_server_host => 143.238.105.61)
|
107
112
|
|
108
113
|
Next we start up the grid, specifying the number of browsers we wish to use, and the method of accessing the tuple space:
|
109
|
-
|
114
|
+
grid.start(:quantity => 1, :read_all => true)
|
110
115
|
|
111
116
|
There are two methods for accessing the tuple space.
|
112
117
|
:read_all => true
|
data/README.rdoc
CHANGED
@@ -40,14 +40,18 @@ This should find the recently started Ring Server and register a tuple for the W
|
|
40
40
|
You will now be able to execute commands across remote browsers on your grid network.
|
41
41
|
|
42
42
|
e.g.
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
browsers.each do |browser
|
47
|
-
|
48
|
-
|
49
|
-
|
43
|
+
grid = Watir::Grid.new(:ring_server_port => 12358)
|
44
|
+
grid.start(:quantity => 1, :read_all => true)
|
45
|
+
threads = []
|
46
|
+
grid.browsers.each do |browser|
|
47
|
+
threads << Thread.new do
|
48
|
+
b = browser[:object].new_browser
|
49
|
+
b.goto("http://www.google.com")
|
50
|
+
b.text_field(:name, 'q').set("watirgrid")
|
51
|
+
b.button(:name, "btnI").click
|
52
|
+
end
|
50
53
|
end
|
54
|
+
threads.each {|thread| thread.join}
|
51
55
|
|
52
56
|
You may wish to host the controller and providers on different machines in a real scenario. You can specify things like server hostnames, ports and access control lists for each of the different types of servers. For more help see:
|
53
57
|
$ controller --help
|
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ begin
|
|
11
11
|
gem.homepage = "http://github.com/90kts/watirgrid"
|
12
12
|
gem.authors = ["Tim Koopmans"]
|
13
13
|
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
-
gem.version = "0.0.
|
14
|
+
gem.version = "0.0.3b"
|
15
15
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
16
|
end
|
17
17
|
rescue LoadError
|
data/examples/simple.rb
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require '../lib/watirgrid'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
grid = Watir::Grid.new(:ring_server_port => 12358,
|
5
|
+
:ring_server_host => '192.168.1.101', :loglevel => Logger::DEBUG)
|
6
|
+
grid.start(:quantity => 1, :read_all => true)
|
7
|
+
|
8
|
+
threads = []
|
9
|
+
grid.browsers.each do |browser|
|
10
|
+
threads << Thread.new do
|
11
|
+
b = browser[:object].new_browser
|
12
|
+
b.goto("http://www.google.com")
|
13
|
+
b.text_field(:name, 'q').set("watirgrid")
|
14
|
+
b.button(:name, "btnI").click
|
15
|
+
end
|
16
|
+
end
|
17
|
+
threads.each {|thread| thread.join}
|
data/lib/watirgrid.rb
CHANGED
@@ -23,32 +23,19 @@ module Watir
|
|
23
23
|
@log = Logger.new(logfile, 'daily')
|
24
24
|
@log.level = params[:loglevel] || Logger::ERROR
|
25
25
|
@log.datetime_format = "%Y-%m-%d %H:%M:%S "
|
26
|
+
|
27
|
+
@browsers = []
|
28
|
+
@tuples = []
|
26
29
|
end
|
27
30
|
|
28
31
|
##
|
29
32
|
# Start required services
|
30
|
-
def start(params = {})
|
33
|
+
def start(params = {})
|
31
34
|
start_drb_server
|
32
35
|
find_ring_server
|
33
36
|
get_tuples(params)
|
34
37
|
end
|
35
38
|
|
36
|
-
##
|
37
|
-
# Yield a browser object when iterating over the grid of browsers
|
38
|
-
def each
|
39
|
-
threads = []
|
40
|
-
id = 0
|
41
|
-
@browsers.each do |browser|
|
42
|
-
threads << Thread.new do
|
43
|
-
id += 1
|
44
|
-
@log.debug(browser)
|
45
|
-
# yields a browser object, ID, hostname, architecture, type
|
46
|
-
yield(browser[2].new_browser, id, browser[4],browser[5],browser[6])
|
47
|
-
end
|
48
|
-
end
|
49
|
-
threads.each {|thread| thread.join}
|
50
|
-
end
|
51
|
-
|
52
39
|
##
|
53
40
|
# Return the size (quantity) of browsers started on the grid
|
54
41
|
def size
|
@@ -88,15 +75,37 @@ module Watir
|
|
88
75
|
##
|
89
76
|
# Get all tuple spaces on ringserver
|
90
77
|
def get_tuples(params = {})
|
91
|
-
|
78
|
+
quantity = calculate_quantity(params[:quantity])
|
79
|
+
read_tuples(params[:architecture], params[:browser_type])
|
80
|
+
@log.info("Found #{@tuples.size} tuples.")
|
81
|
+
if @tuples.size > -1 then
|
82
|
+
@tuples[0..quantity].each do |tuple|
|
83
|
+
if params[:hostnames]
|
84
|
+
filter_tuple_by_hostname(tuple, params)
|
85
|
+
else
|
86
|
+
add_tuple_to_browsers(tuple)
|
87
|
+
take_tuple(tuple) if params[:take_all] == true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# Sets the quantity (upper limit of array) of tuples to retrieve
|
95
|
+
# This is because some users prefer not to specify a zero based
|
96
|
+
# index when asking for n browsers
|
97
|
+
def calculate_quantity(quantity)
|
98
|
+
if (quantity.nil? or quantity == 0) then
|
92
99
|
quantity = -1
|
93
100
|
else
|
94
|
-
quantity
|
101
|
+
quantity -= 1
|
95
102
|
end
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
103
|
+
end
|
104
|
+
|
105
|
+
##
|
106
|
+
# Read all tuples filtered by architecture and browser type
|
107
|
+
# then populate the tuples accessor
|
108
|
+
def read_tuples(architecture, browser_type)
|
100
109
|
@tuples = @ring_server.read_all([
|
101
110
|
:name,
|
102
111
|
nil, # watir provider
|
@@ -105,28 +114,44 @@ module Watir
|
|
105
114
|
nil, # hostname
|
106
115
|
architecture,
|
107
116
|
browser_type])
|
117
|
+
end
|
108
118
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
if params[:hostnames][hostname] then
|
117
|
-
@browsers << tuple
|
118
|
-
@ring_server.take(tuple)if params[:take_all] == true
|
119
|
-
end
|
120
|
-
else
|
121
|
-
@browsers << tuple
|
122
|
-
@ring_server.take(tuple)if params[:take_all] == true
|
123
|
-
end
|
124
|
-
end
|
125
|
-
else
|
126
|
-
@browsers
|
119
|
+
##
|
120
|
+
# Filter tuple by hostnames
|
121
|
+
def filter_tuple_by_hostname(tuple, params={})
|
122
|
+
hostname = tuple[4]
|
123
|
+
if (params[:hostnames][hostname]) then
|
124
|
+
add_tuple_to_browsers(tuple)
|
125
|
+
take_tuple(tuple) if params[:take_all] == true
|
127
126
|
end
|
128
|
-
@browsers
|
129
127
|
end
|
128
|
+
|
129
|
+
##
|
130
|
+
# Add a tuple to the browsers accessor
|
131
|
+
def add_tuple_to_browsers(tuple)
|
132
|
+
@browsers << tuple_to_hash(tuple)
|
133
|
+
end
|
134
|
+
|
135
|
+
##
|
136
|
+
# Take a tuple from the tuple space
|
137
|
+
def take_tuple(tuple)
|
138
|
+
@ring_server.take(tuple)
|
139
|
+
end
|
140
|
+
|
141
|
+
##
|
142
|
+
# Convert tuple into a hash for easier handling
|
143
|
+
def tuple_to_hash(tuple)
|
144
|
+
tuple_hash = {}
|
145
|
+
tuple_hash[:name] = tuple[0]
|
146
|
+
tuple_hash[:class] = tuple[1]
|
147
|
+
tuple_hash[:object] = tuple[2]
|
148
|
+
tuple_hash[:description] = tuple[3]
|
149
|
+
tuple_hash[:hostname] = tuple[4]
|
150
|
+
tuple_hash[:architecture] = tuple[5]
|
151
|
+
tuple_hash[:browser_type] = tuple[6]
|
152
|
+
tuple_hash
|
153
|
+
end
|
154
|
+
|
130
155
|
end
|
131
156
|
|
132
157
|
end
|
data/spec/grid_spec.rb
CHANGED
@@ -14,37 +14,37 @@ describe 'WatirGrid' do
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
it 'should return how many
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
it 'should return how many grid are available in the tuplespace' do
|
18
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
19
|
+
grid.start(:read_all => true)
|
20
|
+
grid.size.should == 5
|
21
21
|
end
|
22
22
|
|
23
|
-
it 'should read any 2
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
it 'should read any 2 grid in the tuplespace' do
|
24
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
25
|
+
grid.start(:quantity => 2, :read_all => true)
|
26
|
+
grid.size.should == 2
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'should take any 1 browser in the tuplespace' do
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
31
|
+
grid.start(:quantity => 1, :take_all => true)
|
32
|
+
grid.size.should == 1
|
33
33
|
end
|
34
34
|
|
35
|
-
it 'should take all
|
36
|
-
|
37
|
-
|
38
|
-
|
35
|
+
it 'should take all grid remaining in tuplespace' do
|
36
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
37
|
+
grid.start(:take_all => true)
|
38
|
+
grid.size.should == 4
|
39
39
|
end
|
40
40
|
|
41
|
-
it 'should find no more
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
it 'should find no more grid in the tuplespace' do
|
42
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
43
|
+
grid.start(:read_all => true)
|
44
|
+
grid.size.should == 0
|
45
45
|
end
|
46
46
|
|
47
|
-
it 'should register 4 new
|
47
|
+
it 'should register 4 new grid in the tuplespace' do
|
48
48
|
1.upto(4) do
|
49
49
|
provider = Provider.new(:ring_server_port => 12351,
|
50
50
|
:loglevel => Logger::ERROR, :browser_type => 'safari')
|
@@ -53,82 +53,86 @@ describe 'WatirGrid' do
|
|
53
53
|
end
|
54
54
|
|
55
55
|
it 'should take any 1 browser based on browser type' do
|
56
|
-
|
57
|
-
|
56
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
57
|
+
grid.start(:quantity => 1,
|
58
58
|
:take_all => true, :browser_type => 'safari')
|
59
|
-
|
59
|
+
grid.size.should == 1
|
60
60
|
end
|
61
61
|
|
62
|
-
it 'should fail to find any
|
63
|
-
|
64
|
-
|
62
|
+
it 'should fail to find any grid based on a specific browser type' do
|
63
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
64
|
+
grid.start(:quantity => 1,
|
65
65
|
:take_all => true, :browser_type => 'firefox')
|
66
|
-
|
66
|
+
grid.size.should == 0
|
67
67
|
end
|
68
68
|
|
69
|
-
it 'should fail to find any
|
70
|
-
|
71
|
-
|
69
|
+
it 'should fail to find any grid based on a unknown browser type' do
|
70
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
71
|
+
grid.start(:quantity => 1,
|
72
72
|
:take_all => true, :browser_type => 'penguin')
|
73
|
-
|
73
|
+
grid.size.should == 0
|
74
74
|
end
|
75
75
|
|
76
76
|
it 'should take any 1 browser based on specific architecture type' do
|
77
|
-
|
78
|
-
|
77
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
78
|
+
grid.start(:quantity => 1,
|
79
79
|
:take_all => true, :architecture => 'universal-darwin10.0')
|
80
|
-
|
80
|
+
grid.size.should == 1
|
81
81
|
end
|
82
82
|
|
83
|
-
it 'should fail to find any
|
84
|
-
|
85
|
-
|
83
|
+
it 'should fail to find any grid based on unknown architecture type' do
|
84
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
85
|
+
grid.start(:quantity => 1,
|
86
86
|
:take_all => true, :architecture => 'geos-1992')
|
87
|
-
|
87
|
+
grid.size.should == 0
|
88
88
|
end
|
89
89
|
|
90
90
|
it 'should take any 1 browser based on specific hostname' do
|
91
91
|
hostname = `hostname`.strip
|
92
|
-
|
93
|
-
|
92
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
93
|
+
grid.start(:quantity => 1,
|
94
94
|
:take_all => true,
|
95
95
|
:hostnames => { hostname => "127.0.0.1"}
|
96
96
|
)
|
97
|
-
|
97
|
+
grid.size.should == 1
|
98
98
|
end
|
99
99
|
|
100
|
-
it 'should fail to find any
|
101
|
-
|
102
|
-
|
100
|
+
it 'should fail to find any grid based on unknown hostname' do
|
101
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
102
|
+
grid.start(:quantity => 1,
|
103
103
|
:take_all => true, :hostnames => {
|
104
104
|
"tokyo" => "127.0.0.1"})
|
105
|
-
|
105
|
+
grid.size.should == 0
|
106
106
|
end
|
107
107
|
|
108
108
|
it 'should take the last browser and execute some watir commands' do
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
hostname.should == `hostname`.strip
|
115
|
-
|
116
|
-
|
117
|
-
browser.
|
118
|
-
|
109
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
110
|
+
grid.start(:quantity => 1, :take_all => true)
|
111
|
+
threads = []
|
112
|
+
grid.browsers.each do |browser|
|
113
|
+
threads << Thread.new do
|
114
|
+
browser[:hostname].should == `hostname`.strip
|
115
|
+
browser[:architecture].should == Config::CONFIG['arch']
|
116
|
+
browser[:browser_type].should == 'safari'
|
117
|
+
b = browser[:object].new_browser
|
118
|
+
b.goto("http://www.google.com")
|
119
|
+
b.text_field(:name, 'q').set("watirgrid")
|
120
|
+
b.button(:name, "btnI").click
|
119
121
|
end
|
120
|
-
|
122
|
+
end
|
123
|
+
threads.each {|thread| thread.join}
|
124
|
+
grid.size.should == 1
|
121
125
|
end
|
122
126
|
|
123
|
-
it 'should find no more
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
+
it 'should find no more grid in the tuplespace' do
|
128
|
+
grid = Watir::Grid.new(:ring_server_port => 12351)
|
129
|
+
grid.start(:read_all => true)
|
130
|
+
grid.size.should == 0
|
127
131
|
end
|
128
132
|
|
129
133
|
it 'should register a new browser on a remote provider' do
|
130
134
|
pending('provision of remote registration') do
|
131
|
-
|
135
|
+
grid.size.should == 0
|
132
136
|
end
|
133
137
|
end
|
134
138
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watirgrid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3b
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Koopmans
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-05 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -40,7 +40,6 @@ files:
|
|
40
40
|
- LICENSE
|
41
41
|
- README.rdoc
|
42
42
|
- Rakefile
|
43
|
-
- TODO.rdoc
|
44
43
|
- bin/controller
|
45
44
|
- bin/provider
|
46
45
|
- examples/simple.rb
|
@@ -70,9 +69,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
69
|
version:
|
71
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
71
|
requirements:
|
73
|
-
- - "
|
72
|
+
- - ">"
|
74
73
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
74
|
+
version: 1.3.1
|
76
75
|
version:
|
77
76
|
requirements: []
|
78
77
|
|
data/TODO.rdoc
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
=== Grid
|
2
|
-
- Specify rampup times
|
3
|
-
|
4
|
-
=== Providers
|
5
|
-
- Remote registration of providers
|
6
|
-
- Re-write tuple space during tear down
|
7
|
-
- Response times
|
8
|
-
- Network breakdown times
|
9
|
-
|
10
|
-
=== Protocols
|
11
|
-
- Support for tcp or http?
|
12
|
-
|
13
|
-
=== Tests
|
14
|
-
- How many providers is possible with druby?
|
15
|
-
- Performance comparison proxied objects (DRbUndumped) vs. copied objects
|
16
|
-
|