Skip to content
Newer
Older
100644 387 lines (294 sloc) 15.4 KB
76fe32d @jonleighton omg
jonleighton authored
1 # Poltergeist - A PhantomJS driver for Capybara #
2
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
3 Version: 0.7.0
76fe32d @jonleighton omg
jonleighton authored
4
7a71cc0 @jonleighton Add travis status image
jonleighton authored
5 [![Build Status](https://secure.travis-ci.org/jonleighton/poltergeist.png)](http://travis-ci.org/jonleighton/poltergeist)
6
76fe32d @jonleighton omg
jonleighton authored
7 Poltergeist is a driver for [Capybara](https://github.com/jnicklas/capybara). It allows you to
8 run your Capybara tests on a headless [WebKit](http://webkit.org) browser,
9 provided by [PhantomJS](http://www.phantomjs.org/).
10
11 ## Installation ##
12
82d0fd0 @pjg Grammar fix in README
pjg authored
13 Add `poltergeist` to your Gemfile, and in your test setup add:
76fe32d @jonleighton omg
jonleighton authored
14
29291fc @jonleighton Update README
jonleighton authored
15 ``` ruby
16 require 'capybara/poltergeist'
17 Capybara.javascript_driver = :poltergeist
18 ```
19
77a789e @jonleighton Add note about transactional tests. Closes #78.
jonleighton authored
20 If you were previously using the `:rack_test` driver, be aware that
21 your app will now run in a separate thread and this can have
22 consequences for transactional tests. [See the Capybara README for more
23 detail](https://github.com/jnicklas/capybara/blob/master/README.md#transactions-and-database-setup).
24
cf37abe @jonleighton Update the README
jonleighton authored
25 ## Installing PhantomJS ##
26
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
27 You need at least PhantomJS 1.6.0, but 1.6.1 is recommended as there some issues with the former.
28 There are *no other external dependencies* (you don't need Qt, or a running X
29 server, etc.)
b3367b4 @jonleighton Add note about PhantomJS 1.6
jonleighton authored
30
96b7af3 @jonleighton update readme
jonleighton authored
31 ### Mac ###
ee1f46c @jonleighton Update the install / CI instructions
jonleighton authored
32
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
33 * *Manual install*: [Download this](http://code.google.com/p/phantomjs/downloads/detail?name=phantomjs-1.6.1-macosx-static.zip&can=2&q=)
34 * *Homebrew*: `brew install phantomjs`
ee1f46c @jonleighton Update the install / CI instructions
jonleighton authored
35
96b7af3 @jonleighton update readme
jonleighton authored
36 ### Linux ###
cf37abe @jonleighton Update the README
jonleighton authored
37
96b7af3 @jonleighton update readme
jonleighton authored
38 * Download the [32
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
39 bit](http://code.google.com/p/phantomjs/downloads/detail?name=phantomjs-1.6.1-linux-i686-dynamic.tar.bz2&can=2&q=)
96b7af3 @jonleighton update readme
jonleighton authored
40 or [64
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
41 bit](http://code.google.com/p/phantomjs/downloads/detail?name=phantomjs-1.6.1-linux-x86_64-dynamic.tar.bz2&can=2&q=)
96b7af3 @jonleighton update readme
jonleighton authored
42 binary.
9712619 Fix typo in filename for Linux binaries
Christian Trabold authored
43 * Extract it: `sudo tar xvjf phantomjs-1.6.1-linux-*-dynamic.tar.bz2 -C /usr/local`
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
44 * Link it: `sudo ln -s /usr/local/phantomjs-1.6.1-linux*/bin/phantomjs /usr/local/bin/phantomjs`
cf37abe @jonleighton Update the README
jonleighton authored
45
96b7af3 @jonleighton update readme
jonleighton authored
46 (Note that you cannot copy the `/usr/local/phantomjs/bin/phantomjs`
47 binary elsewhere on its own as it dynamically links with other files in
48 `/usr/local/phantomjs/lib`.)
cf37abe @jonleighton Update the README
jonleighton authored
49
96b7af3 @jonleighton update readme
jonleighton authored
50 ### Manual compilation ###
cf37abe @jonleighton Update the README
jonleighton authored
51
96b7af3 @jonleighton update readme
jonleighton authored
52 Do this as a last resort if the binaries don't work for you. It will
53 take quite a long time as it has to build WebKit.
54
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
55 * Download [the source tarball](http://code.google.com/p/phantomjs/downloads/detail?name=phantomjs-1.6.1-source.zip&can=2&q=)
96b7af3 @jonleighton update readme
jonleighton authored
56 * Extract and cd in
57 * `./build.sh`
ee1f46c @jonleighton Update the install / CI instructions
jonleighton authored
58
a606a27 @jonleighton tweak readme [ci skip]
jonleighton authored
59 ## Compatibility ##
60
61 Supported: MRI 1.8.7, MRI 1.9.2, MRI 1.9.3, JRuby 1.8, JRuby 1.9.
62
63 Not supported:
64
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
65 * Rubinius
a606a27 @jonleighton tweak readme [ci skip]
jonleighton authored
66 * Windows
67
ff392c3 @jonleighton tweak readme [ci skip]
jonleighton authored
68 Contributions are welcome in order to move 'unsupported'
a606a27 @jonleighton tweak readme [ci skip]
jonleighton authored
69 items into the 'supported' list.
70
ee1f46c @jonleighton Update the install / CI instructions
jonleighton authored
71 ## Running on a CI ##
72
96b7af3 @jonleighton update readme
jonleighton authored
73 There are no special steps to take. You don't need Xvfb or any running X
74 server at all.
cf37abe @jonleighton Update the README
jonleighton authored
75
5d89eb7 @jonleighton some readme tweaks [ci skip]
jonleighton authored
76 Depending on your tests, one thing that you may need is some fonts. If
77 you're getting errors on a CI that don't occur during development then
78 try taking some screenshots - it may well be missing fonts throwing
79 things off kilter. Your distro will have various font packages available
80 to install.
cf37abe @jonleighton Update the README
jonleighton authored
81
76fe32d @jonleighton omg
jonleighton authored
82 ## What's supported? ##
83
2e0332f @jonleighton readme tweaks
jonleighton authored
84 Poltergeist supports all the mandatory features for a Capybara driver,
85 and the following optional features:
86
87 * `page.evaluate_script` and `page.execute_script`
88 * `page.within_frame`
89 * `page.within_window`
90 * `page.status_code`
91 * `page.response_headers`
92 * cookie handling
93 * drag-and-drop
76fe32d @jonleighton omg
jonleighton authored
94
b18225d @jonleighton Add a resize command to allow users to resize the browser window
jonleighton authored
95 There are some additional features:
96
97 ### Taking screenshots ###
98
99 You can grab screenshots of the page at any point by calling
76fe32d @jonleighton omg
jonleighton authored
100 `page.driver.render('/path/to/file.png')` (this works the same way as the PhantomJS
101 render feature, so you can specify other extensions like `.pdf`, `.gif`, etc.)
102
fb497cb @jonleighton Add support for choosing between rendering the whole page or just par…
jonleighton authored
103 By default, only the viewport will be rendered (the part of the page that is in view). To render
104 the entire page, use `page.driver.render('/path/to/file.png', :full => true)`.
105
b18225d @jonleighton Add a resize command to allow users to resize the browser window
jonleighton authored
106 ### Resizing the window ###
107
108 Sometimes the window size is important to how things are rendered. Poltergeist sets the window
109 size to 1024x768 by default, but you can set this yourself with `page.driver.resize(width, height)`.
110
96b7af3 @jonleighton update readme
jonleighton authored
111 ### Remote debugging (experimental) ###
112
113 If you use the `:inspector => true` option (see below), remote debugging
114 will be enabled.
115
116 When this option is enabled, you can insert `page.driver.debug` into
117 your tests to pause the test and launch a browser which gives you the
118 WebKit inspector to view your test run with.
119
5d89eb7 @jonleighton some readme tweaks [ci skip]
jonleighton authored
120 [Read more
121 here](http://jonathanleighton.com/articles/2012/poltergeist-0-6-0/)
122
b99b0db @jonleighton should be h3 [ci skip]
jonleighton authored
123 ### Setting request headers ###
eb484d4 @jonleighton Tweak the HTTP header documentation
jonleighton authored
124
125 Additional HTTP request headers can be set like so:
126
127 ``` ruby
c664c60 @jonleighton Implement cookie manipulation. Closes #12.
jonleighton authored
128 page.driver.headers = { "User-Agent" => "Poltergeist" }
eb484d4 @jonleighton Tweak the HTTP header documentation
jonleighton authored
129 ```
911384a @jonleighton add doc for network traffic feature
jonleighton authored
130
75c63bb @jonleighton Custom HTTP headers apply to all requests. Fixes #149.
jonleighton authored
131 The extra headers will apply to all subsequent HTTP requests (including
132 requests for assets, AJAX, etc). They will be automatically cleared at
133 the end of the test.
eb484d4 @jonleighton Tweak the HTTP header documentation
jonleighton authored
134
911384a @jonleighton add doc for network traffic feature
jonleighton authored
135 ### Inspecting network traffic ###
136
137 You can inspect the network traffic (i.e. what resources have been
138 loaded) on the current page by calling `page.driver.network_traffic`.
139 This returns an array of request objects. A request object has a
140 `response_parts` method containing data about the response chunks.
141
c664c60 @jonleighton Implement cookie manipulation. Closes #12.
jonleighton authored
142 ### Manipulating cookies ###
143
144 The following methods are used to inspect and manipulate cookies:
145
146 * `page.driver.cookies` - a hash of cookies accessible to the current
147 page. The keys are cookie names. The values are `Cookie` objects, with
148 the following methods: `name`, `value`, `domain`, `path`, `secure?`,
149 `httponly?`, `expires`.
150 * `page.driver.set_cookie(name, value, options = {})` - set a cookie.
151 The options hash can take the following keys: `:domain`, `:path`,
152 `:secure`, `:httponly`, `:expires`. `:expires` should be a `Time`
153 object.
154 * `page.driver.remove_cookie(name)` - remove a cookie
155
76fe32d @jonleighton omg
jonleighton authored
156 ## Customization ##
157
158 You can customize the way that Capybara sets up Poltegeist via the following code in your
159 test setup:
160
29291fc @jonleighton Update README
jonleighton authored
161 ``` ruby
162 Capybara.register_driver :poltergeist do |app|
163 Capybara::Poltergeist::Driver.new(app, options)
164 end
165 ```
76fe32d @jonleighton omg
jonleighton authored
166
167 `options` is a hash of options. The following options are supported:
168
29291fc @jonleighton Update README
jonleighton authored
169 * `:phantomjs` (String) - A custom path to the phantomjs executable
170 * `:debug` (Boolean) - When true, debug output is logged to `STDERR`
171 * `:logger` (Object responding to `puts`) - When present, debug output is written to this object
172 * `:timeout` (Numeric) - The number of seconds we'll wait for a response
34af795 @jonleighton Stop using EventMachine for WebSocket server.
jonleighton authored
173 when communicating with PhantomJS. `nil` means wait forever. Default
9f4192e @jonleighton Increase default timeout to 30
jonleighton authored
174 is 30.
96b7af3 @jonleighton update readme
jonleighton authored
175 * `:inspector` (Boolean, String) - See 'Remote Debugging', above.
7d6cde7 @rentalcustard Rename raise_errors -> js_errors
rentalcustard authored
176 * `:js_errors` (Boolean) - When false, Javascript errors do not get re-raised in Ruby.
0db1eb9 @rentalcustard Allow passing desired browser size as an option
rentalcustard authored
177 * `:window_size` (Array) - The dimensions of the browser window in which to test, expressed
178 as a 2-element array, e.g. [1024, 768]. Default: [1024, 768]
97b1aca @jonleighton Make command line options less prominent in readme. It's not a headli…
jonleighton authored
179 * `:phantomjs_options` (Array) - Additional [command line options](http://code.google.com/p/phantomjs/wiki/Interface#Command-line_Options)
180 to be passed to PhantomJS, e.g. `['--load-images=no', '--ignore-ssl-errors=yes']`
78ce1cc @jonleighton Make the port used deterministic
jonleighton authored
181 * `:port` (Fixnum) - The port which should be used to communicate
182 with the PhantomJS process. Default: 44678.
76fe32d @jonleighton omg
jonleighton authored
183
184 ## Bugs ##
185
186 Please file bug reports on Github and include example code to reproduce the problem wherever
cf37abe @jonleighton Update the README
jonleighton authored
187 possible. (Tests are even better.) Please also provide the output with
188 `:debug` turned on, and screenshots if you think it's relevant.
76fe32d @jonleighton omg
jonleighton authored
189
cf37abe @jonleighton Update the README
jonleighton authored
190 ## Hacking ##
191
192 Contributions are very welcome and I will happily give commit access to
193 anyone who does a few good pull requests.
194
195 To get setup, run `bundle install`. You can run the full test suite with
196 `rspec spec/` or `rake`.
197
198 While PhantomJS is capable of compiling and running CoffeeScript code
199 directly, I prefer to compile the code myself and distribute that (it
200 makes debugging easier). Running `rake autocompile` will watch the
201 `.coffee` files for changes, and compile them into
202 `lib/capybara/client/compiled`.
203
8ab5c03 @jonleighton Fix #8
jonleighton authored
204 ## Changes ##
205
5ca05a5 @jonleighton 0.8 is unreleased
jonleighton authored
206 ### 0.8.0 (unreleased) ###
5e8c9b7 @jonleighton Raise obsolete node error when clicking an el with no client rects
jonleighton authored
207
1ef674b @jonleighton Click co-ordinates are shown in the debug log.
jonleighton authored
208 #### Features ####
209
210 * Click co-ordinates are shown in the debug log. You can use this in
211 combination with `page.driver.render` to work out where clicks are
212 actually happening if you are having trouble.
78ce1cc @jonleighton Make the port used deterministic
jonleighton authored
213 * Added `:port` configuration option and made the default port 44678
214 rather than a random available port.
cdf1f17 @jonleighton Support for the `page.response_headers` API
jonleighton authored
215 * Support for Capybara's `page.response_headers` API to retrieve the
216 headers of the last page load.
c664c60 @jonleighton Implement cookie manipulation. Closes #12.
jonleighton authored
217 * Support for cookie manipulation. [Issue #12]
50ffc33 @jonleighton Use native APIs for frame support
jonleighton authored
218 * Frame switching support now uses native PhantomJS APIs. (This might
219 make it work better, but in general it's a badly tested area both in
220 Capybara and Poltergeist.)
2e0332f @jonleighton readme tweaks
jonleighton authored
221 * Support for the Capybara window switching API (`page.within_window`).
78ce1cc @jonleighton Make the port used deterministic
jonleighton authored
222
5e8c9b7 @jonleighton Raise obsolete node error when clicking an el with no client rects
jonleighton authored
223 #### Bug fixes ####
224
225 * Prevent `TypeError: 'undefined' is not an object (evaluating
226 'rect.top')` error when clicking an element with `display: none`.
227 The click will fail, but an obsolete node error will be raised, meaning
228 that Capybara's retry mechanisms will kick in. [Issue #130]
80905e0 @jonleighton Mouse over element before clicking it.
jonleighton authored
229 * Mouse over the element we will click, before clicking it. This
230 enables `:hover` effects etc to trigger before the click happens,
231 which can affect the click in some cases. [Issue #120]
7218290 @jonleighton Don't blow up when `evaluate_script` is called with a cyclic structure.
jonleighton authored
232 * Don't blow up when `evaluate_script` is called with a cyclic
233 structure.
c2712fc @mrdg Just return the text if element is a title
mrdg authored
234 * Fix the text method for title elements, so it doesn't return an
235 empty string.
5165a63 @jonleighton PhantomJS 1.7 compatibility.
jonleighton authored
236 * Fixed problem with cookies not being clearer between tests on
237 PhantomJS 1.7
2cf9bf2 @jonleighton Propagate Javascript errors on page load
jonleighton authored
238 * Fixed Javascript errors during page load causes TimeoutErrors.
239 [Issue #124]
85a459a @jonleighton changelog for 2cf9bf2
jonleighton authored
240 * Ensure the User-Agent header can be set successfully. (Klaus Hartl)
241 [Issue #127]
a30175d @jonleighton Use `el.innerText` for `Node#text`.
jonleighton authored
242 * Use `el.innerText` for `Node#text`. This ensures that e.g. `<br>` is
943398f @jonleighton Revert "Don't strip newlines in `Node#text`"
jonleighton authored
243 returned as a space. It also simplifies the method. [Issue #139]
1ca2314 @jonleighton Fix test triggering PhantomJS crash.
jonleighton authored
244 * Fix status code support when a response redirects to another URL.
245 This was previously tested to ensure it would return the status code
246 of the redirected URL, but the test was falsely broken and the
247 implementation was also broken.
5407400 @jonleighton Fix visiting URLs where only a hashchange occurs
jonleighton authored
248 * Fixed visiting URLs where only a hash change occurs (no HTTP
249 request). [Issue #79]
75c63bb @jonleighton Custom HTTP headers apply to all requests. Fixes #149.
jonleighton authored
250 * Setting `page.driver.headers` now applies the headers to all
251 requests, not just calls to `visit`. (So XHR, asset requests, etc
252 will all receive the headers.) [Issue #149]
253
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
254 ### 0.7.0 ###
fd8441c @rentalcustard Update changelog
rentalcustard authored
255
256 #### Features ####
257
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
258 * Added an option `:js_errors`, allowing poltergeist to continue
fd8441c @rentalcustard Update changelog
rentalcustard authored
259 running after JS errors. (John Griffin & Tom Stuart) [Issue #62] [Issue #69]
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
260 * Added an option `:window_size`, allowing users to specify
0db1eb9 @rentalcustard Allow passing desired browser size as an option
rentalcustard authored
261 dimensions to which the browser window will be resized.
262 (Tom Stuart) [Issue #53]
c042457 @jonleighton Drop Capybara 1.0 support. ~> 1.1 is required.
jonleighton authored
263 * Capybara 1.0 is no longer supported. Capybara ~> 1.1 is required.
6ac4078 support setting http request headers
Sumit Shah authored
264 * Added ability to set arbitrary http request headers
911384a @jonleighton add doc for network traffic feature
jonleighton authored
265 * Inspect network traffic on the page via
266 `page.driver.network_traffic` (Doug McInnes) [Issue #77]
f26f903 @jonleighton bump to 0.7.0
jonleighton authored
267 * Added an option `:phantomjs_options`, allowing users to specify
2a9902d @wynst add phantomjs command-line options
wynst authored
268 additional command-line options passed to phantomjs executable.
269 (wynst) [Issue #97]
3f2ca0d @sobrinho Update changelog about issue #83
sobrinho authored
270 * Scroll element into viewport if needed on click (Gabriel Sobrinho)
271 [Issue #83]
72e5d2d @dnesteryuk merged new version of code for identifying HTTP code of an loaded page
dnesteryuk authored
272 * Added status code support. (Dmitriy Nesteryuk and Jon Leighton) [Issue #37]
fd8441c @rentalcustard Update changelog
rentalcustard authored
273
dc2ce26 @jonleighton Fix #60.
jonleighton authored
274 #### Bug fixes ###
275
276 * Fix issue with `ClickFailed` exception happening with a negative
277 co-ordinate (which should be impossible). (Jon Leighton, Gabriel
278 Sobrinho, Tom Stuart) [Issue #60]
37f9fcd @rentalcustard Fix JSON serialization when Array#toJSON borked
rentalcustard authored
279 * Fix issue with `undefined method map for "[]":String`, which
280 happened when dealing with pages that include JS rewriting
281 Array.prototype.toJSON. (Tom Stuart) [Issue #63]
dc2ce26 @jonleighton Fix #60.
jonleighton authored
282
96b7af3 @jonleighton update readme
jonleighton authored
283 ### 0.6.0 ###
284
285 #### Features ####
286
287 * Updated to PhantomJS 1.5.0, giving us proper support for reporting
288 Javascript exception backtraces.
289
7d74282 @jonleighton bump version
jonleighton authored
290 ### 0.5.0 ###
f55e0ab @jonleighton update README
jonleighton authored
291
292 #### Features ####
293
294 * Detect if clicking an element will fail. If the click will actually
295 hit another element (because that element is in front of the one we
296 want to click), the user will now see an exception explaining what
297 happened and which element would actually be targeted by the click. This
298 should aid debugging. [Issue #25]
299 * Click elements at their middle position rather than the top-left.
300 This is presumed to be more likely to succeed because the top-left
301 may be obscured by overlapping elements, negative margins, etc. [Issue #26]
302 * Add experimental support for using the remote WebKit web inspector.
303 This will only work with PhantomJS 1.5, which is not yet released,
304 so it won't be officially supported by Poltergeist until 1.5 is
305 released. [Issue #31]
9f84f31 @jonleighton Add Driver#quit. Closes #24.
jonleighton authored
306 * Add `page.driver.quit` method. If you spawn additional Capybara
307 sessions, you might want to use this to reap the child phantomjs
308 process. [Issue #24]
0b9d286 @jonleighton Propagate Javascript errors on the page to Ruby. Fixes #27.
jonleighton authored
309 * Errors produced by Javascript on the page will now generate an
310 exception within Ruby. [Issue #27]
05b319b @jonleighton Update README about JRuby support. Closes #20. [ci skip]
jonleighton authored
311 * JRuby support. [Issue #20]
312
f55e0ab @jonleighton update README
jonleighton authored
313 #### Bug fixes ####
314
315 * Fix bug where we could end up interacting with an obsolete element. [Issue #30]
806a204 @jonleighton Raise a better error when phantomjs returns a non-zero exit status. F…
jonleighton authored
316 * Raise an suitable error if PhantomJS returns a non-zero exit status.
317 Previously a version error would be raised, indicating that the
318 PhantomJS version was too old when in fact it did not start at all. [Issue #23]
edf3bae @jonleighton Add test for :timeout option to driver setting the server's timeout. …
jonleighton authored
319 * Ensure the `:timeout` option is actually used. [Issue #36]
a67f814 @jonleighton Node references must include the page id as well. Fixes #39.
jonleighton authored
320 * Nodes need to know which page they are associated with. Before this,
321 if Javascript caused a new page to load, existing node references
322 would be wrong, but wouldn't raise an ObsoleteNode error. [Issue #39]
3edd4e9 @jonleighton add to changelog
jonleighton authored
323 * In some circumstances, we could end up missing an inline element
324 when attempting to click it. This is due to the use of
325 `getBoundingClientRect()`. We're now using `getClientRects()` to
326 address this.
327
fc88a85 @jonleighton Bump version
jonleighton authored
328 ### 0.4.0 ###
48c3b97 @jonleighton Fix element position calculation. Fixes #15.
jonleighton authored
329
330 * Element click position is now calculated using the native
331 `getBoundingClientRect()` method, which will be faster and less
332 buggy.
1938eac @jonleighton Handle window.prompt()
jonleighton authored
333 * Handle `window.confirm()`. Always returns true, which is the same
334 as capybara-webkit. [Issue #10]
335 * Handle `window.prompt()`. Returns the default value, if present, or
336 null.
4f1691a @jonleighton formatting
jonleighton authored
337 * Fix bug with page Javascript page loading causing problems. [Issue #19]
8b5541d @jonleighton Fix #19. (Page load synchronisation problem.)
jonleighton authored
338
48c3b97 @jonleighton Fix element position calculation. Fixes #15.
jonleighton authored
339 ### 0.3.0 ###
8ab5c03 @jonleighton Fix #8
jonleighton authored
340
a4fa4bb @jonleighton Tweak README
jonleighton authored
341 * There was a bad bug to do with clicking elements in a page where the
342 page is smaller than the window. The incorrect position would be
343 calculated, and so the click would happen in the wrong place. This is
344 fixed. [Issue #8]
345 * Poltergeist didn't work in conjunction with the Thin web server,
346 because that server uses Event Machine, and Poltergeist was assuming
347 that it was the only thing in the process using EventMachine.
34af795 @jonleighton Stop using EventMachine for WebSocket server.
jonleighton authored
348
a4fa4bb @jonleighton Tweak README
jonleighton authored
349 To solve this, EventMachine usage has been completely removed, which
350 has the welcome side-effect of being more efficient because we
351 no longer have the overhead of running a mostly-idle event loop.
34af795 @jonleighton Stop using EventMachine for WebSocket server.
jonleighton authored
352
a4fa4bb @jonleighton Tweak README
jonleighton authored
353 [Issue #6]
354 * Added the `:timeout` option to configure the timeout when talking to
355 PhantomJS.
34af795 @jonleighton Stop using EventMachine for WebSocket server.
jonleighton authored
356
48c3b97 @jonleighton Fix element position calculation. Fixes #15.
jonleighton authored
357 ### 0.2.0 ###
8ab5c03 @jonleighton Fix #8
jonleighton authored
358
a4fa4bb @jonleighton Tweak README
jonleighton authored
359 * First version considered 'ready', hopefully fewer problems.
8ab5c03 @jonleighton Fix #8
jonleighton authored
360
48c3b97 @jonleighton Fix element position calculation. Fixes #15.
jonleighton authored
361 ### 0.1.0 ###
8ab5c03 @jonleighton Fix #8
jonleighton authored
362
a4fa4bb @jonleighton Tweak README
jonleighton authored
363 * First version, various problems.
8ab5c03 @jonleighton Fix #8
jonleighton authored
364
76fe32d @jonleighton omg
jonleighton authored
365 ## License ##
366
367 Copyright (c) 2011 Jonathan Leighton
368
369 Permission is hereby granted, free of charge, to any person obtaining
370 a copy of this software and associated documentation files (the
371 "Software"), to deal in the Software without restriction, including
372 without limitation the rights to use, copy, modify, merge, publish,
373 distribute, sublicense, and/or sell copies of the Software, and to
374 permit persons to whom the Software is furnished to do so, subject to
375 the following conditions:
376
377 The above copyright notice and this permission notice shall be
378 included in all copies or substantial portions of the Software.
379
380 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
381 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
382 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
383 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
384 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
385 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
386 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Something went wrong with that request. Please try again.