poltergeistFork 0.0.1
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.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +425 -0
- data/lib/capybara/poltergeist/browser.rb +426 -0
- data/lib/capybara/poltergeist/client.rb +151 -0
- data/lib/capybara/poltergeist/client/agent.coffee +423 -0
- data/lib/capybara/poltergeist/client/browser.coffee +497 -0
- data/lib/capybara/poltergeist/client/cmd.coffee +17 -0
- data/lib/capybara/poltergeist/client/compiled/agent.js +587 -0
- data/lib/capybara/poltergeist/client/compiled/browser.js +687 -0
- data/lib/capybara/poltergeist/client/compiled/cmd.js +31 -0
- data/lib/capybara/poltergeist/client/compiled/connection.js +25 -0
- data/lib/capybara/poltergeist/client/compiled/main.js +228 -0
- data/lib/capybara/poltergeist/client/compiled/node.js +88 -0
- data/lib/capybara/poltergeist/client/compiled/web_page.js +539 -0
- data/lib/capybara/poltergeist/client/connection.coffee +11 -0
- data/lib/capybara/poltergeist/client/main.coffee +99 -0
- data/lib/capybara/poltergeist/client/node.coffee +70 -0
- data/lib/capybara/poltergeist/client/pre/agent.js +587 -0
- data/lib/capybara/poltergeist/client/pre/browser.js +688 -0
- data/lib/capybara/poltergeist/client/pre/cmd.js +31 -0
- data/lib/capybara/poltergeist/client/pre/connection.js +25 -0
- data/lib/capybara/poltergeist/client/pre/main.js +228 -0
- data/lib/capybara/poltergeist/client/pre/node.js +88 -0
- data/lib/capybara/poltergeist/client/pre/web_page.js +540 -0
- data/lib/capybara/poltergeist/client/web_page.coffee +372 -0
- data/lib/capybara/poltergeist/command.rb +17 -0
- data/lib/capybara/poltergeist/cookie.rb +35 -0
- data/lib/capybara/poltergeist/driver.rb +394 -0
- data/lib/capybara/poltergeist/errors.rb +183 -0
- data/lib/capybara/poltergeist/inspector.rb +46 -0
- data/lib/capybara/poltergeist/json.rb +25 -0
- data/lib/capybara/poltergeist/network_traffic.rb +7 -0
- data/lib/capybara/poltergeist/network_traffic/error.rb +19 -0
- data/lib/capybara/poltergeist/network_traffic/request.rb +27 -0
- data/lib/capybara/poltergeist/network_traffic/response.rb +40 -0
- data/lib/capybara/poltergeist/node.rb +177 -0
- data/lib/capybara/poltergeist/server.rb +36 -0
- data/lib/capybara/poltergeist/utility.rb +9 -0
- data/lib/capybara/poltergeist/version.rb +5 -0
- data/lib/capybara/poltergeist/web_socket_server.rb +107 -0
- data/lib/capybara/poltergeistFork.rb +27 -0
- metadata +268 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
module Capybara::Poltergeist
|
2
|
+
class Server
|
3
|
+
attr_reader :socket, :fixed_port, :timeout
|
4
|
+
|
5
|
+
def initialize(fixed_port = nil, timeout = nil)
|
6
|
+
@fixed_port = fixed_port
|
7
|
+
@timeout = timeout
|
8
|
+
start
|
9
|
+
end
|
10
|
+
|
11
|
+
def port
|
12
|
+
@socket.port
|
13
|
+
end
|
14
|
+
|
15
|
+
def timeout=(sec)
|
16
|
+
@timeout = @socket.timeout = sec
|
17
|
+
end
|
18
|
+
|
19
|
+
def start
|
20
|
+
@socket = WebSocketServer.new(fixed_port, timeout)
|
21
|
+
end
|
22
|
+
|
23
|
+
def stop
|
24
|
+
@socket.close
|
25
|
+
end
|
26
|
+
|
27
|
+
def restart
|
28
|
+
stop
|
29
|
+
start
|
30
|
+
end
|
31
|
+
|
32
|
+
def send(command)
|
33
|
+
@socket.send(command.id, command.message) or raise DeadClient.new(command.message)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'websocket/driver'
|
3
|
+
|
4
|
+
module Capybara::Poltergeist
|
5
|
+
# This is a 'custom' Web Socket server that is designed to be synchronous. What
|
6
|
+
# this means is that it sends a message, and then waits for a response. It does
|
7
|
+
# not expect to receive a message at any other time than right after it has sent
|
8
|
+
# a message. So it is basically operating a request/response cycle (which is not
|
9
|
+
# how Web Sockets are usually used, but it's what we want here, as we want to
|
10
|
+
# send a message to PhantomJS and then wait for it to respond).
|
11
|
+
class WebSocketServer
|
12
|
+
# How much to try to read from the socket at once (it's kinda arbitrary because we
|
13
|
+
# just keep reading until we've received a full frame)
|
14
|
+
RECV_SIZE = 1024
|
15
|
+
|
16
|
+
# How many seconds to try to bind to the port for before failing
|
17
|
+
BIND_TIMEOUT = 5
|
18
|
+
|
19
|
+
HOST = '127.0.0.1'
|
20
|
+
|
21
|
+
attr_reader :port, :driver, :socket, :server
|
22
|
+
attr_accessor :timeout
|
23
|
+
|
24
|
+
def initialize(port = nil, timeout = nil)
|
25
|
+
@timeout = timeout
|
26
|
+
@server = start_server(port)
|
27
|
+
@receive_mutex = Mutex.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def start_server(port)
|
31
|
+
time = Time.now
|
32
|
+
|
33
|
+
begin
|
34
|
+
TCPServer.open(HOST, port || 0).tap do |server|
|
35
|
+
@port = server.addr[1]
|
36
|
+
end
|
37
|
+
rescue Errno::EADDRINUSE
|
38
|
+
if (Time.now - time) < BIND_TIMEOUT
|
39
|
+
sleep(0.01)
|
40
|
+
retry
|
41
|
+
else
|
42
|
+
raise
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def connected?
|
48
|
+
!socket.nil?
|
49
|
+
end
|
50
|
+
|
51
|
+
# Accept a client on the TCP server socket, then receive its initial HTTP request
|
52
|
+
# and use that to initialize a Web Socket.
|
53
|
+
def accept
|
54
|
+
@socket = server.accept
|
55
|
+
@messages = {}
|
56
|
+
|
57
|
+
@driver = ::WebSocket::Driver.server(self)
|
58
|
+
@driver.on(:connect) { |event| @driver.start }
|
59
|
+
@driver.on(:message) do |event|
|
60
|
+
command_id = JSON.load(event.data)['command_id']
|
61
|
+
@messages[command_id] = event.data
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def write(data)
|
66
|
+
@socket.write(data)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Block until the next message is available from the Web Socket.
|
70
|
+
# Raises Errno::EWOULDBLOCK if timeout is reached.
|
71
|
+
def receive(cmd_id)
|
72
|
+
start = Time.now
|
73
|
+
|
74
|
+
until @messages.has_key?(cmd_id)
|
75
|
+
raise Errno::EWOULDBLOCK if (Time.now - start) >= timeout
|
76
|
+
if @receive_mutex.try_lock
|
77
|
+
begin
|
78
|
+
IO.select([socket], [], [], timeout) or raise Errno::EWOULDBLOCK
|
79
|
+
data = socket.recv(RECV_SIZE)
|
80
|
+
break if data.empty?
|
81
|
+
driver.parse(data)
|
82
|
+
ensure
|
83
|
+
@receive_mutex.unlock
|
84
|
+
end
|
85
|
+
else
|
86
|
+
sleep(0.05)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
@messages.delete(cmd_id)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Send a message and block until there is a response
|
93
|
+
def send(cmd_id, message)
|
94
|
+
accept unless connected?
|
95
|
+
driver.text(message)
|
96
|
+
receive(cmd_id)
|
97
|
+
rescue Errno::EWOULDBLOCK
|
98
|
+
raise TimeoutError.new(message)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Closing sockets separately as `close_read`, `close_write`
|
102
|
+
# causes IO mistakes on JRuby, using just `close` fixes that.
|
103
|
+
def close
|
104
|
+
[server, socket].compact.each(&:close)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
if RUBY_VERSION < "1.9.2"
|
2
|
+
raise "This version of Capybara/Poltergeist does not support Ruby versions " \
|
3
|
+
"less than 1.9.2."
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'capybara'
|
7
|
+
|
8
|
+
module Capybara
|
9
|
+
module Poltergeist
|
10
|
+
require 'capybara/poltergeist/utility'
|
11
|
+
require 'capybara/poltergeist/driver'
|
12
|
+
require 'capybara/poltergeist/browser'
|
13
|
+
require 'capybara/poltergeist/node'
|
14
|
+
require 'capybara/poltergeist/server'
|
15
|
+
require 'capybara/poltergeist/web_socket_server'
|
16
|
+
require 'capybara/poltergeist/client'
|
17
|
+
require 'capybara/poltergeist/inspector'
|
18
|
+
require 'capybara/poltergeist/json'
|
19
|
+
require 'capybara/poltergeist/network_traffic'
|
20
|
+
require 'capybara/poltergeist/errors'
|
21
|
+
require 'capybara/poltergeist/cookie'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Capybara.register_driver :poltergeist do |app|
|
26
|
+
Capybara::Poltergeist::Driver.new(app)
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,268 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: poltergeistFork
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- vianull
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-01-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: capybara
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: websocket-driver
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.2.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.2.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: multi_json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: cliver
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.3.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.3.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: launchy
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 3.4.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 3.4.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-core
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "!="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.4.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "!="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.4.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sinatra
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '10.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '10.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: image_size
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '1.0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '1.0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: pdf-reader
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 1.3.3
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: 1.3.3
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: coffee-script
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '2.2'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '2.2'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: guard-coffeescript
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 2.0.0
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 2.0.0
|
195
|
+
description: Poltergeist is a driver for Capybara that allows you to run your tests
|
196
|
+
on a headless WebKit browser, provided by PhantomJS.
|
197
|
+
email:
|
198
|
+
- vianull@outlook.com
|
199
|
+
executables: []
|
200
|
+
extensions: []
|
201
|
+
extra_rdoc_files: []
|
202
|
+
files:
|
203
|
+
- LICENSE
|
204
|
+
- README.md
|
205
|
+
- lib/capybara/poltergeist/browser.rb
|
206
|
+
- lib/capybara/poltergeist/client.rb
|
207
|
+
- lib/capybara/poltergeist/client/agent.coffee
|
208
|
+
- lib/capybara/poltergeist/client/browser.coffee
|
209
|
+
- lib/capybara/poltergeist/client/cmd.coffee
|
210
|
+
- lib/capybara/poltergeist/client/compiled/agent.js
|
211
|
+
- lib/capybara/poltergeist/client/compiled/browser.js
|
212
|
+
- lib/capybara/poltergeist/client/compiled/cmd.js
|
213
|
+
- lib/capybara/poltergeist/client/compiled/connection.js
|
214
|
+
- lib/capybara/poltergeist/client/compiled/main.js
|
215
|
+
- lib/capybara/poltergeist/client/compiled/node.js
|
216
|
+
- lib/capybara/poltergeist/client/compiled/web_page.js
|
217
|
+
- lib/capybara/poltergeist/client/connection.coffee
|
218
|
+
- lib/capybara/poltergeist/client/main.coffee
|
219
|
+
- lib/capybara/poltergeist/client/node.coffee
|
220
|
+
- lib/capybara/poltergeist/client/pre/agent.js
|
221
|
+
- lib/capybara/poltergeist/client/pre/browser.js
|
222
|
+
- lib/capybara/poltergeist/client/pre/cmd.js
|
223
|
+
- lib/capybara/poltergeist/client/pre/connection.js
|
224
|
+
- lib/capybara/poltergeist/client/pre/main.js
|
225
|
+
- lib/capybara/poltergeist/client/pre/node.js
|
226
|
+
- lib/capybara/poltergeist/client/pre/web_page.js
|
227
|
+
- lib/capybara/poltergeist/client/web_page.coffee
|
228
|
+
- lib/capybara/poltergeist/command.rb
|
229
|
+
- lib/capybara/poltergeist/cookie.rb
|
230
|
+
- lib/capybara/poltergeist/driver.rb
|
231
|
+
- lib/capybara/poltergeist/errors.rb
|
232
|
+
- lib/capybara/poltergeist/inspector.rb
|
233
|
+
- lib/capybara/poltergeist/json.rb
|
234
|
+
- lib/capybara/poltergeist/network_traffic.rb
|
235
|
+
- lib/capybara/poltergeist/network_traffic/error.rb
|
236
|
+
- lib/capybara/poltergeist/network_traffic/request.rb
|
237
|
+
- lib/capybara/poltergeist/network_traffic/response.rb
|
238
|
+
- lib/capybara/poltergeist/node.rb
|
239
|
+
- lib/capybara/poltergeist/server.rb
|
240
|
+
- lib/capybara/poltergeist/utility.rb
|
241
|
+
- lib/capybara/poltergeist/version.rb
|
242
|
+
- lib/capybara/poltergeist/web_socket_server.rb
|
243
|
+
- lib/capybara/poltergeistFork.rb
|
244
|
+
homepage:
|
245
|
+
licenses:
|
246
|
+
- MIT
|
247
|
+
metadata: {}
|
248
|
+
post_install_message:
|
249
|
+
rdoc_options: []
|
250
|
+
require_paths:
|
251
|
+
- lib
|
252
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
253
|
+
requirements:
|
254
|
+
- - ">="
|
255
|
+
- !ruby/object:Gem::Version
|
256
|
+
version: 1.9.3
|
257
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
258
|
+
requirements:
|
259
|
+
- - ">="
|
260
|
+
- !ruby/object:Gem::Version
|
261
|
+
version: '0'
|
262
|
+
requirements: []
|
263
|
+
rubyforge_project:
|
264
|
+
rubygems_version: 2.4.3
|
265
|
+
signing_key:
|
266
|
+
specification_version: 4
|
267
|
+
summary: PhantomJS driver for Capybara,fork from poltergeist
|
268
|
+
test_files: []
|