capybara-envjs 0.1.6 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +7 -0
- data/lib/capybara/driver/envjs_driver.rb +69 -67
- data/lib/capybara/envjs/version.rb +5 -0
- data/spec/spec_helper.rb +5 -0
- metadata +46 -41
- data/History.txt +0 -5
- data/Manifest.txt +0 -11
- data/Rakefile +0 -28
data/CHANGELOG.rdoc
CHANGED
@@ -22,18 +22,9 @@ if false # for testing ... but seems okay
|
|
22
22
|
end
|
23
23
|
|
24
24
|
class Capybara::Driver::Envjs < Capybara::Driver::Base
|
25
|
-
class Node < Capybara::Node
|
25
|
+
class Node < Capybara::Driver::Node
|
26
26
|
def text
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def [](name)
|
31
|
-
value = if name.to_sym == :class
|
32
|
-
node.className
|
33
|
-
else
|
34
|
-
node.getAttribute(name.to_s)
|
35
|
-
end
|
36
|
-
return value if value and not value.to_s.empty?
|
27
|
+
native.innerText
|
37
28
|
end
|
38
29
|
|
39
30
|
def [](name)
|
@@ -41,86 +32,73 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
|
|
41
32
|
attr_name == "class" and attr_name = "className"
|
42
33
|
case
|
43
34
|
when 'select' == tag_name && 'value' == attr_name
|
44
|
-
if
|
45
|
-
|
35
|
+
if native['multiple']
|
36
|
+
find(".//option[@selected='selected']").map { |option| option.native[:value] || option.native.innerText }
|
46
37
|
else
|
47
|
-
|
38
|
+
native.value
|
48
39
|
end
|
49
|
-
# when 'input' == tag_name && 'checkbox' == type && 'checked' == attr_name
|
50
|
-
# node[attr_name] == 'checked' ? true : false
|
51
40
|
else
|
52
|
-
|
41
|
+
native[attr_name]
|
53
42
|
end
|
54
43
|
end
|
55
44
|
|
56
45
|
def value
|
57
46
|
if tag_name == 'textarea'
|
58
|
-
|
47
|
+
native.innerText
|
59
48
|
else
|
60
|
-
|
49
|
+
self[:value]
|
61
50
|
end
|
62
51
|
end
|
63
52
|
|
64
53
|
def set(value)
|
65
|
-
case
|
54
|
+
case native.tagName
|
66
55
|
when "TEXTAREA"
|
67
|
-
|
56
|
+
native.innerText = value
|
68
57
|
else
|
69
|
-
case
|
58
|
+
case native.getAttribute("type")
|
70
59
|
when "checkbox", "radio"
|
71
|
-
|
72
|
-
else;
|
60
|
+
native.click if native.checked != value
|
61
|
+
else; native.setAttribute("value",value)
|
73
62
|
end
|
74
63
|
end
|
75
64
|
end
|
76
65
|
|
77
|
-
def
|
78
|
-
|
79
|
-
option_node = all_unfiltered(".//option[text()=#{escaped}]").first || all_unfiltered(".//option[contains(.,#{escaped})]").first
|
80
|
-
option_node.node.selected = true
|
81
|
-
rescue Exception => e
|
82
|
-
options = all_unfiltered(".//option").map { |o| "'#{o.text}'" }.join(', ')
|
83
|
-
raise Capybara::OptionNotFound, "No such option '#{option}' in this select box. Available options: #{options}"
|
66
|
+
def select_option
|
67
|
+
native.selected = true
|
84
68
|
end
|
85
69
|
|
86
|
-
def
|
87
|
-
if !
|
88
|
-
raise Capybara::UnselectNotAllowed, "Cannot unselect option
|
89
|
-
end
|
90
|
-
|
91
|
-
begin
|
92
|
-
escaped = Capybara::XPath.escape(option)
|
93
|
-
option_node = (all_unfiltered(".//option[text()=#{escaped}]") || all_unfiltered(".//option[contains(.,#{escaped})]")).first
|
94
|
-
option_node.node.selected = false
|
95
|
-
rescue Exception => e
|
96
|
-
options = all_unfiltered(".//option").map { |o| "'#{o.text}'" }.join(', ')
|
97
|
-
raise Capybara::OptionNotFound, "No such option '#{option}' in this select box. Available options: #{options}"
|
70
|
+
def unselect_option
|
71
|
+
if !select_node['multiple']
|
72
|
+
raise Capybara::UnselectNotAllowed, "Cannot unselect option from single select box."
|
98
73
|
end
|
74
|
+
native.removeAttribute('selected')
|
99
75
|
end
|
100
76
|
|
101
77
|
def click
|
102
|
-
_event(self,"
|
78
|
+
_event(self,"MouseEvents",'click',true,true, :button => 1)
|
103
79
|
end
|
104
80
|
|
105
81
|
def drag_to(element)
|
106
|
-
|
107
|
-
_event(
|
108
|
-
_event(element,"
|
82
|
+
# distance stuff is arbitrary at this point, to make jquery.ui happy ...
|
83
|
+
_event(self,"MouseEvents",'mousedown',true,true, :button => 1, :pageX => 0, :pageY => 0)
|
84
|
+
_event(element,"MouseEvents",'mousemove',true,true, :button => 1, :pageX => 1, :pageY => 1)
|
85
|
+
_event(element,"MouseEvents",'mousemove',true,true, :button => 1, :pageX => 0, :pageY => 0)
|
86
|
+
_event(element,"MouseEvents",'mouseup',true,true, :button => 1, :pageX => 0, :pageY => 0)
|
109
87
|
end
|
110
88
|
|
111
89
|
def tag_name
|
112
|
-
|
90
|
+
native.tagName.downcase
|
113
91
|
end
|
114
92
|
|
115
93
|
def visible?
|
116
|
-
|
94
|
+
find("./ancestor-or-self::*[contains(@style, 'display:none') or contains(@style, 'display: none')]").empty?
|
117
95
|
end
|
118
96
|
|
119
|
-
def
|
97
|
+
def find(locator)
|
120
98
|
window = @driver.browser["window"]
|
121
99
|
null = @driver.browser["null"]
|
122
100
|
type = window["XPathResult"]["ANY_TYPE"]
|
123
|
-
result_set = window.document.evaluate
|
101
|
+
result_set = window.document.evaluate(locator, native, null, type, null)
|
124
102
|
nodes = []
|
125
103
|
while n = result_set.iterateNext()
|
126
104
|
nodes << Node.new(@driver, n)
|
@@ -135,28 +113,42 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
|
|
135
113
|
|
136
114
|
private
|
137
115
|
|
138
|
-
|
139
|
-
|
116
|
+
# a reference to the select node if this is an option node
|
117
|
+
def select_node
|
118
|
+
find('./ancestor::select').first
|
119
|
+
end
|
120
|
+
|
121
|
+
def _event(target,cls,type,bubbles,cancelable,attributes = {})
|
122
|
+
e = @driver.browser["document"].createEvent(false && cls || ""); # disabled for now
|
140
123
|
e.initEvent(type,bubbles,cancelable);
|
141
|
-
|
124
|
+
attributes.each do |k,v|
|
125
|
+
e[k.to_s] = v
|
126
|
+
end
|
127
|
+
target.native.dispatchEvent(e);
|
142
128
|
end
|
143
129
|
|
144
130
|
end
|
145
131
|
|
146
132
|
attr_reader :app
|
147
|
-
attr_reader :app_host
|
148
133
|
|
149
134
|
def rack_test?
|
150
|
-
|
135
|
+
# p "rt?", app_host, default_url, (app_host == default_url)
|
136
|
+
app_host == default_url
|
151
137
|
end
|
152
138
|
|
153
|
-
def
|
139
|
+
def default_host
|
140
|
+
(Capybara.default_host || "www.example.com")
|
141
|
+
end
|
154
142
|
|
155
|
-
|
156
|
-
|
157
|
-
|
143
|
+
def default_url
|
144
|
+
"http://"+default_host
|
145
|
+
end
|
146
|
+
|
147
|
+
def app_host
|
148
|
+
(ENV["CAPYBARA_APP_HOST"] || Capybara.app_host || default_url)
|
149
|
+
end
|
158
150
|
|
159
|
-
|
151
|
+
def initialize(app)
|
160
152
|
|
161
153
|
if rack_test?
|
162
154
|
require 'rack/test'
|
@@ -165,6 +157,7 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
|
|
165
157
|
alias_method :response, :last_response
|
166
158
|
alias_method :request, :last_request
|
167
159
|
define_method :build_rack_mock_session do
|
160
|
+
# p default_host
|
168
161
|
Rack::MockSession.new(app, default_host)
|
169
162
|
end
|
170
163
|
end
|
@@ -195,22 +188,26 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
|
|
195
188
|
browser.master["connection"] = @connection = proc do |*args|
|
196
189
|
xhr, responseHandler, data = *args
|
197
190
|
url = xhr.url
|
198
|
-
params = data ||
|
191
|
+
params = data || ""
|
199
192
|
method = xhr["method"].downcase.to_sym
|
200
193
|
e = env;
|
201
194
|
if method == :post or method == :put
|
202
195
|
e.merge! "CONTENT_TYPE" => xhr.headers["Content-Type"]
|
203
196
|
end
|
197
|
+
e.merge! "HTTP_ACCEPT" => xhr.headers["Accept"] if xhr.headers["Accept"]
|
204
198
|
if e["CONTENT_TYPE"] =~ %r{^multipart/form-data;}
|
205
199
|
e["CONTENT_LENGTH"] ||= params.length
|
206
200
|
end
|
207
201
|
times = 0
|
208
202
|
begin
|
203
|
+
# p url, app_host
|
209
204
|
if url.index(app_host) == 0
|
210
205
|
url.slice! 0..(app_host.length-1)
|
211
206
|
end
|
212
|
-
#
|
207
|
+
# p url
|
208
|
+
# puts "send #{method} #{url} #{params} #{e}"
|
213
209
|
send method, url, params, e
|
210
|
+
# p "after" #, response
|
214
211
|
while response.status == 302 || response.status == 301
|
215
212
|
if (times += 1) > 5
|
216
213
|
raise Capybara::InfiniteRedirectError, "redirected more than 5 times, check for infinite redirects."
|
@@ -222,7 +219,7 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
|
|
222
219
|
url.slice! 0..(app_host.length-1)
|
223
220
|
end
|
224
221
|
# puts "redirect #{method} #{url} #{params}"
|
225
|
-
send method, url, params,
|
222
|
+
send method, url, params, env
|
226
223
|
end
|
227
224
|
rescue Exception => e
|
228
225
|
# print "got #{e} #{response.inspect}\n"
|
@@ -251,13 +248,14 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
|
|
251
248
|
as_url = URI.parse path
|
252
249
|
base = URI.parse app_host
|
253
250
|
path = (base + as_url).to_s
|
251
|
+
# p path
|
254
252
|
browser["window"].location.href = path
|
255
253
|
end
|
256
254
|
|
257
255
|
def current_url
|
258
256
|
browser["window"].location.href
|
259
257
|
end
|
260
|
-
|
258
|
+
|
261
259
|
def source
|
262
260
|
browser["window"].document.__original_text__
|
263
261
|
end
|
@@ -266,7 +264,7 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
|
|
266
264
|
browser["window"].document.xml
|
267
265
|
end
|
268
266
|
|
269
|
-
def
|
267
|
+
def reset!
|
270
268
|
clear_cookies
|
271
269
|
end
|
272
270
|
|
@@ -323,7 +321,7 @@ class Capybara::Driver::Envjs < Capybara::Driver::Base
|
|
323
321
|
@_browser = Johnson::Runtime.new :size => Integer(ENV["JOHNSON_HEAP_SIZE"] || 0x4000000)
|
324
322
|
@_browser.extend Envjs::Runtime
|
325
323
|
end
|
326
|
-
|
324
|
+
|
327
325
|
@_browser
|
328
326
|
end
|
329
327
|
|
@@ -344,3 +342,7 @@ private
|
|
344
342
|
end
|
345
343
|
|
346
344
|
end
|
345
|
+
|
346
|
+
Capybara.register_driver :envjs do |app|
|
347
|
+
Capybara::Driver::Envjs.new(app)
|
348
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-envjs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 4
|
9
|
+
- 0
|
10
|
+
version: 0.4.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Steven Parkes
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-24 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -24,14 +24,14 @@ dependencies:
|
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
25
|
none: false
|
26
26
|
requirements:
|
27
|
-
- -
|
27
|
+
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
hash:
|
29
|
+
hash: 15
|
30
30
|
segments:
|
31
31
|
- 0
|
32
|
-
-
|
33
|
-
-
|
34
|
-
version: 0.
|
32
|
+
- 4
|
33
|
+
- 0
|
34
|
+
version: 0.4.0
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
@@ -51,19 +51,18 @@ dependencies:
|
|
51
51
|
type: :runtime
|
52
52
|
version_requirements: *id002
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
54
|
+
name: bundler
|
55
55
|
prerelease: false
|
56
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
hash:
|
61
|
+
hash: 15
|
62
62
|
segments:
|
63
|
+
- 1
|
63
64
|
- 0
|
64
|
-
|
65
|
-
- 4
|
66
|
-
version: 0.5.4
|
65
|
+
version: "1.0"
|
67
66
|
type: :development
|
68
67
|
version_requirements: *id003
|
69
68
|
- !ruby/object:Gem::Dependency
|
@@ -72,36 +71,47 @@ dependencies:
|
|
72
71
|
requirement: &id004 !ruby/object:Gem::Requirement
|
73
72
|
none: false
|
74
73
|
requirements:
|
75
|
-
- -
|
74
|
+
- - ~>
|
76
75
|
- !ruby/object:Gem::Version
|
77
|
-
hash:
|
76
|
+
hash: 3
|
78
77
|
segments:
|
79
|
-
-
|
80
|
-
- 3
|
78
|
+
- 2
|
81
79
|
- 0
|
82
|
-
version:
|
80
|
+
version: "2.0"
|
83
81
|
type: :development
|
84
82
|
version_requirements: *id004
|
85
83
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
84
|
+
name: rack-test
|
87
85
|
prerelease: false
|
88
86
|
requirement: &id005 !ruby/object:Gem::Requirement
|
89
87
|
none: false
|
90
88
|
requirements:
|
91
89
|
- - ">="
|
92
90
|
- !ruby/object:Gem::Version
|
93
|
-
hash:
|
91
|
+
hash: 3
|
94
92
|
segments:
|
95
|
-
-
|
96
|
-
-
|
97
|
-
-
|
98
|
-
version:
|
93
|
+
- 0
|
94
|
+
- 5
|
95
|
+
- 4
|
96
|
+
version: 0.5.4
|
99
97
|
type: :development
|
100
98
|
version_requirements: *id005
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: sinatra
|
101
|
+
prerelease: false
|
102
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
103
|
+
none: false
|
104
|
+
requirements:
|
105
|
+
- - ~>
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
hash: 15
|
108
|
+
segments:
|
109
|
+
- 1
|
110
|
+
- 0
|
111
|
+
version: "1.0"
|
112
|
+
type: :development
|
113
|
+
version_requirements: *id006
|
114
|
+
description: capybara-envjs is a Capybara driver for the envjs gem. It is similar to Capybara's rack-test driver in that it runs tests against your rack application directly but fully supports javascript in your application.
|
105
115
|
email:
|
106
116
|
- smparkes@smparkes.net
|
107
117
|
executables: []
|
@@ -109,22 +119,17 @@ executables: []
|
|
109
119
|
extensions: []
|
110
120
|
|
111
121
|
extra_rdoc_files:
|
112
|
-
- History.txt
|
113
|
-
- Manifest.txt
|
114
|
-
- CHANGELOG.rdoc
|
115
122
|
- README.rdoc
|
116
123
|
files:
|
117
|
-
- CHANGELOG.rdoc
|
118
|
-
- History.txt
|
119
|
-
- Manifest.txt
|
120
|
-
- README.rdoc
|
121
|
-
- Rakefile
|
122
124
|
- lib/capybara/driver/envjs_driver.rb
|
123
|
-
- lib/capybara/envjs.rb
|
124
125
|
- lib/capybara/envjs/cucumber.rb
|
126
|
+
- lib/capybara/envjs/version.rb
|
127
|
+
- lib/capybara/envjs.rb
|
125
128
|
- spec/driver/envjs_driver_spec.rb
|
126
129
|
- spec/session/envjs_session_spec.rb
|
127
130
|
- spec/spec_helper.rb
|
131
|
+
- README.rdoc
|
132
|
+
- CHANGELOG.rdoc
|
128
133
|
has_rdoc: true
|
129
134
|
homepage: http://github.com/smparkes/capybara-envjs
|
130
135
|
licenses: []
|
@@ -159,6 +164,6 @@ rubyforge_project: capybara-envjs
|
|
159
164
|
rubygems_version: 1.3.7
|
160
165
|
signing_key:
|
161
166
|
specification_version: 3
|
162
|
-
summary:
|
167
|
+
summary: Capybara driver for envjs
|
163
168
|
test_files: []
|
164
169
|
|
data/History.txt
DELETED
data/Manifest.txt
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
CHANGELOG.rdoc
|
2
|
-
History.txt
|
3
|
-
Manifest.txt
|
4
|
-
README.rdoc
|
5
|
-
Rakefile
|
6
|
-
lib/capybara/driver/envjs_driver.rb
|
7
|
-
lib/capybara/envjs.rb
|
8
|
-
lib/capybara/envjs/cucumber.rb
|
9
|
-
spec/driver/envjs_driver_spec.rb
|
10
|
-
spec/session/envjs_session_spec.rb
|
11
|
-
spec/spec_helper.rb
|
data/Rakefile
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
# -*- Mode: Ruby -*-
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
|
5
|
-
gem 'hoe', '>= 2.5'
|
6
|
-
require 'hoe'
|
7
|
-
|
8
|
-
Hoe.plugin
|
9
|
-
Hoe.plugin :debugging, :doofus, :git
|
10
|
-
Hoe.plugins.delete :rubyforge
|
11
|
-
|
12
|
-
Hoe.spec 'capybara-envjs' do
|
13
|
-
developer 'Steven Parkes', 'smparkes@smparkes.net'
|
14
|
-
self.version = "0.1.6"
|
15
|
-
|
16
|
-
self.readme_file = 'README.rdoc'
|
17
|
-
self.extra_rdoc_files = Dir['*.rdoc']
|
18
|
-
|
19
|
-
self.extra_deps = [
|
20
|
-
['capybara', '>= 0.3.9'],
|
21
|
-
['envjs', '>= 0.3.7']
|
22
|
-
]
|
23
|
-
|
24
|
-
self.extra_dev_deps = [
|
25
|
-
['rack-test', '>= 0.5.4'],
|
26
|
-
['rspec', '>= 1.3.0']
|
27
|
-
]
|
28
|
-
end
|