capybara-envjs 0.1.6 → 0.4.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/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
|