Add support for choosing between rendering the whole page or just part of it.

This commit is contained in:
Jon Leighton 2011-10-31 23:04:02 +00:00
parent b18225d716
commit fb497cb328
13 changed files with 140 additions and 25 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/Gemfile.lock
/spec/support/custom_phantomjs_called
/ci/Gemfile.*.lock
/spec/tmp

View File

@ -34,6 +34,9 @@ You can grab screenshots of the page at any point by calling
`page.driver.render('/path/to/file.png')` (this works the same way as the PhantomJS
render feature, so you can specify other extensions like `.pdf`, `.gif`, etc.)
By default, only the viewport will be rendered (the part of the page that is in view). To render
the entire page, use `page.driver.render('/path/to/file.png', :full => true)`.
### Resizing the window ###
Sometimes the window size is important to how things are rendered. Poltergeist sets the window

View File

@ -101,8 +101,8 @@ module Capybara::Poltergeist
command 'reset'
end
def render(path)
command 'render', path
def render(path, options = {})
command 'render', path, !!options[:full]
end
def resize(width, height)

View File

@ -120,12 +120,23 @@ class Poltergeist.Browser
this.resetPage()
@owner.sendResponse(true)
render: (path) ->
render: (path, full) ->
if full
@page.setClipRect({})
else
scroll = @page.scrollPosition()
size = @page.viewportSize()
@page.setClipRect(
left: scroll.left, top: scroll.top,
width: size.width, height: size.height
)
@page.render(path)
@owner.sendResponse(true)
resize: (width, height) ->
@page.setViewportSize(width, height)
@page.setViewportSize(width: width, height: height)
@owner.sendResponse(true)
exit: ->

View File

@ -112,12 +112,28 @@ Poltergeist.Browser = (function() {
this.resetPage();
return this.owner.sendResponse(true);
};
Browser.prototype.render = function(path) {
Browser.prototype.render = function(path, full) {
var scroll, size;
if (full) {
this.page.setClipRect({});
} else {
scroll = this.page.scrollPosition();
size = this.page.viewportSize();
this.page.setClipRect({
left: scroll.left,
top: scroll.top,
width: size.width,
height: size.height
});
}
this.page.render(path);
return this.owner.sendResponse(true);
};
Browser.prototype.resize = function(width, height) {
this.page.setViewportSize(width, height);
this.page.setViewportSize({
width: width,
height: height
});
return this.owner.sendResponse(true);
};
Browser.prototype.exit = function() {

View File

@ -9,7 +9,10 @@ Poltergeist.WebPage = (function() {
this["native"] = require('webpage').create();
this.nodes = {};
this._source = "";
this.setViewportSize(1024, 768);
this.setViewportSize({
width: 1024,
height: 768
});
_ref = WebPage.CALLBACKS;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
callback = _ref[_i];
@ -75,11 +78,8 @@ Poltergeist.WebPage = (function() {
WebPage.prototype.viewportSize = function() {
return this["native"].viewportSize;
};
WebPage.prototype.setViewportSize = function(width, height) {
return this["native"].viewportSize = {
width: width,
height: height
};
WebPage.prototype.setViewportSize = function(size) {
return this["native"].viewportSize = size;
};
WebPage.prototype.scrollPosition = function() {
return this["native"].scrollPosition;
@ -87,6 +87,12 @@ Poltergeist.WebPage = (function() {
WebPage.prototype.setScrollPosition = function(pos) {
return this["native"].scrollPosition = pos;
};
WebPage.prototype.clipRect = function() {
return this["native"].clipRect;
};
WebPage.prototype.setClipRect = function(rect) {
return this["native"].clipRect = rect;
};
WebPage.prototype.viewport = function() {
var scroll, size;
scroll = this.scrollPosition();

View File

@ -9,7 +9,7 @@ class Poltergeist.WebPage
@nodes = {}
@_source = ""
this.setViewportSize(1024, 768)
this.setViewportSize(width: 1024, height: 768)
for callback in WebPage.CALLBACKS
this.bindCallback(callback)
@ -55,8 +55,8 @@ class Poltergeist.WebPage
viewportSize: ->
@native.viewportSize
setViewportSize: (width, height) ->
@native.viewportSize = { width: width, height: height }
setViewportSize: (size) ->
@native.viewportSize = size
scrollPosition: ->
@native.scrollPosition
@ -64,6 +64,12 @@ class Poltergeist.WebPage
setScrollPosition: (pos) ->
@native.scrollPosition = pos
clipRect: ->
@native.clipRect
setClipRect: (rect) ->
@native.clipRect = rect
viewport: ->
scroll = this.scrollPosition()
size = this.viewportSize()

View File

@ -64,8 +64,8 @@ module Capybara::Poltergeist
browser.reset
end
def render(path)
browser.render(path)
def render(path, options = {})
browser.render(path, options)
end
def resize(width, height)

View File

@ -19,9 +19,10 @@ Gem::Specification.new do |s|
s.add_dependency "json", "~> 1.6"
s.add_dependency "sfl", "~> 2.0"
s.add_development_dependency 'rspec', '~> 2.7.0'
s.add_development_dependency 'sinatra', '~> 1.0'
s.add_development_dependency 'rake', '~> 0.9.2'
s.add_development_dependency 'rspec', '~> 2.7.0'
s.add_development_dependency 'sinatra', '~> 1.0'
s.add_development_dependency 'rake', '~> 0.9.2'
s.add_development_dependency 'image_size', '~> 1.0'
s.files = Dir.glob("{lib}/**/*") + %w(LICENSE README.md CHANGELOG.md)
s.require_path = 'lib'

View File

@ -1,5 +1,6 @@
require 'spec_helper'
require 'capybara/spec/driver'
require 'image_size'
module Capybara::Poltergeist
describe Driver do
@ -14,8 +15,8 @@ module Capybara::Poltergeist
it_should_behave_like "driver with cookies support"
it 'should support a custom phantomjs path' do
file = File.expand_path('../../support/custom_phantomjs_called', __FILE__)
path = File.expand_path('../../support/custom_phantomjs', __FILE__)
file = POLTERGEIST_ROOT + '/spec/support/custom_phantomjs_called'
path = POLTERGEIST_ROOT + '/spec/support/custom_phantomjs'
FileUtils.rm_f file
@ -46,9 +47,39 @@ module Capybara::Poltergeist
end
it 'should allow the viewport to be resized' do
begin
@driver.visit('/')
@driver.resize(200, 400)
@driver.evaluate_script('[window.innerWidth, window.innerHeight]').should == [200, 400]
ensure
@driver.resize(1024, 768)
end
end
it 'should support rendering the page' do
file = POLTERGEIST_ROOT + '/spec/tmp/screenshot.png'
FileUtils.rm_f file
@driver.visit('/')
@driver.resize(200, 400)
@driver.evaluate_script('[window.innerWidth, window.innerHeight]').should == [200, 400]
@driver.render(file)
File.exist?(file).should == true
end
it 'should support rendering the whole of a page that goes outside the viewport' do
file = POLTERGEIST_ROOT + '/spec/tmp/screenshot.png'
@driver.visit('/poltergeist/long_page')
@driver.render(file)
File.open(file, 'rb') do |f|
ImageSize.new(f.read).size.should ==
@driver.evaluate_script('[window.innerWidth, window.innerHeight]')
end
@driver.render(file, :full => true)
File.open(file, 'rb') do |f|
ImageSize.new(f.read).size.should ==
@driver.evaluate_script('[document.documentElement.clientWidth, document.documentElement.clientHeight]')
end
end
end
end

View File

@ -1,4 +1,5 @@
$:.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
POLTERGEIST_ROOT = File.expand_path('../..', __FILE__)
$:.unshift(POLTERGEIST_ROOT + '/lib')
require 'bundler/setup'

View File

@ -0,0 +1,39 @@
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin lacus odio, dapibus id bibendum in, rhoncus sed dolor. In quis nulla at diam euismod suscipit vitae vitae sapien. Nam viverra hendrerit augue a accumsan. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Fusce fermentum tortor at neque malesuada sodales. Nunc quis augue a quam venenatis pharetra sit amet et risus. Nulla pharetra enim a leo varius scelerisque aliquam urna vestibulum. Sed felis eros, iaculis convallis fermentum ac, condimentum ac lacus. Sed turpis magna, tristique eu faucibus non, faucibus vitae elit. Morbi venenatis adipiscing aliquam.</p>
<p>Etiam pharetra tellus eget lorem gravida sollicitudin. Curabitur malesuada pellentesque velit eu ullamcorper. In metus neque, lobortis at viverra nec, porta ac metus. Duis convallis dolor sed neque accumsan rhoncus varius elit aliquet. Sed iaculis bibendum vehicula. Duis vestibulum suscipit consequat. In mattis porttitor enim vitae sollicitudin. Phasellus condimentum dictum turpis, ac viverra neque placerat ut. Suspendisse ac arcu sed enim molestie placerat eget scelerisque quam.</p>
<p>Suspendisse nec nunc libero, sed gravida eros. Sed congue tellus eu purus ornare a rhoncus nisl adipiscing. Quisque pharetra est sit amet lectus vulputate imperdiet. In nec libero at tellus accumsan tristique eget eget odio. Nulla tempus, tortor at hendrerit fermentum, augue erat adipiscing dui, a lobortis risus massa non metus. Vestibulum non justo nisi, et vulputate elit. Etiam pellentesque sagittis tellus, vel tincidunt lacus consectetur vel.</p>
<p>Aliquam nibh metus, tincidunt a sodales vitae, accumsan sed ligula. Vivamus et ornare leo. Donec laoreet rhoncus ligula a suscipit. Nulla est sapien, varius varius adipiscing aliquet, tincidunt nec est. Donec dictum adipiscing ipsum, ac semper orci tristique at. Pellentesque suscipit odio ac enim pretium at dictum felis pharetra. Nam eget arcu arcu.</p>
<p>Nulla tincidunt ante vel dui imperdiet et mattis quam dictum. Pellentesque tempus, sem eu volutpat iaculis, diam urna aliquam felis, sit amet cursus ligula sem eget felis. Nullam aliquam dictum elit eu aliquam. Phasellus malesuada, quam id sodales tincidunt, magna nisl rutrum enim, sit amet varius mi elit eu tellus. Nullam venenatis, ligula eget hendrerit tincidunt, magna ligula aliquam nulla, a ullamcorper eros purus eu odio. Nunc sollicitudin porta lobortis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam euismod scelerisque porta. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc nec dui orci, ut fermentum ligula. Mauris gravida, urna ut scelerisque eleifend, lectus nisi sodales justo, dapibus egestas dui odio ut enim. Fusce a diam in felis tristique blandit. Morbi malesuada vulputate ipsum, sed ornare nisl ultricies fermentum. Mauris in enim non nulla tincidunt sollicitudin eget eget felis.</p>
<p>Ut malesuada varius facilisis. Fusce pharetra posuere felis a laoreet. Vivamus hendrerit risus quis eros mattis feugiat. Quisque magna sapien, pulvinar nec eleifend ac, luctus id mi. Nunc a libero mauris, vitae venenatis ante. Vestibulum eu venenatis sapien. Praesent lobortis pretium metus, id laoreet sapien tincidunt nec. Nunc condimentum nisl in nunc pharetra suscipit. Donec auctor sollicitudin nunc, nec bibendum velit tristique in. Vivamus erat velit, porttitor ut venenatis eu, hendrerit vitae nulla. Aenean tellus magna, sagittis nec rutrum at, faucibus eu lorem. Mauris malesuada eleifend convallis.</p>
<p>Vestibulum dignissim sapien eget arcu faucibus quis aliquet nulla rutrum. Ut ante velit, hendrerit a varius a, feugiat sed neque. Proin non neque lacinia nisi commodo varius. Nam laoreet suscipit ultrices. Suspendisse potenti. Sed ultrices posuere metus vitae viverra. Suspendisse suscipit tortor et nunc vehicula vitae venenatis leo dictum. Integer velit diam, pharetra vitae egestas eu, volutpat vestibulum nunc. Praesent odio metus, cursus nec posuere nec, tempor a sem. Integer ut est magna, eget blandit nisl. Cras at ipsum quis ante pharetra laoreet. Phasellus varius, ligula pretium pellentesque tempor, dolor mi porta tellus, ac consequat lacus ipsum id purus. Cras a cursus lorem. Nullam risus odio, auctor in vulputate ut, placerat vitae velit. Donec pulvinar scelerisque varius.</p>
<p>Etiam in luctus massa. Quisque adipiscing enim eu lacus aliquam vitae interdum magna malesuada. Integer dignissim ante nec elit laoreet fringilla. Morbi eu tortor feugiat dui iaculis luctus sit amet et orci. Suspendisse potenti. Aliquam pellentesque, tellus eu varius suscipit, velit eros feugiat purus, eget tincidunt nunc massa vitae sapien. Cras pellentesque tristique suscipit. Maecenas vel lorem est, non condimentum felis. In mi massa, commodo et mollis ac, aliquam in risus. Morbi malesuada aliquam malesuada. Suspendisse hendrerit mi quis nisi lacinia venenatis. Pellentesque quis dignissim ante. Suspendisse dignissim fringilla tristique. Sed eleifend tempus erat ac lacinia. Pellentesque placerat tellus sagittis velit dapibus adipiscing interdum tellus pellentesque.</p>
<p>Ut quis scelerisque tortor. Donec ultricies convallis arcu sed fringilla. Quisque sed mauris sem, at convallis dui. Curabitur non erat ipsum. Proin dignissim, nisl non faucibus pulvinar, nulla lacus consectetur turpis, eu vestibulum lectus ipsum rhoncus nulla. Quisque ut diam quis nibh malesuada accumsan eu non elit. Cras in lectus id odio dignissim elementum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eget nibh arcu, at commodo lorem. Proin ac lobortis turpis. Fusce a risus dui. Vestibulum pellentesque lacinia elit, non dictum lectus luctus sit amet.</p>
<p>Curabitur dictum ligula et tellus luctus eget pharetra nisi lobortis. Donec eu varius libero. Curabitur lorem magna, semper at porta sed, iaculis nec lacus. In pretium erat eu ipsum dapibus pharetra. In gravida aliquet urna eget bibendum. Sed varius mi eu est sagittis vel tempor elit venenatis. Pellentesque fringilla ultricies enim sed aliquam. Nulla mattis semper erat, non rhoncus libero condimentum vel. Suspendisse eget eros commodo est malesuada accumsan. Aliquam ultricies consectetur justo, at volutpat libero pellentesque eu. Aliquam non justo id sapien mattis viverra. Morbi semper rutrum nunc dignissim blandit. Cras felis lorem, volutpat ac gravida sed, lobortis id mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam tincidunt tortor ac metus elementum dapibus vel nec nisl. Etiam at nibh nec nisi luctus bibendum vitae vel diam.</p>
<p>Praesent placerat nisi nec nulla ullamcorper facilisis. Nunc quis porta erat. Pellentesque et diam eu tellus aliquet porttitor a ut lorem. Nulla facilisi. Pellentesque elementum imperdiet tempus. Morbi vulputate tempor orci, quis tempor nibh pellentesque vitae. Phasellus varius ultrices diam ut faucibus. In adipiscing condimentum commodo. Sed ultrices nulla quis libero pharetra malesuada. Integer tempus volutpat sapien, elementum luctus enim bibendum non.</p>
<p>Sed eu quam id ligula sodales venenatis a ac leo. Fusce luctus mattis lorem, in commodo leo dictum non. Curabitur sit amet erat ut libero cursus convallis at eget mi. Nam nec turpis sit amet ligula malesuada aliquet quis id turpis. Curabitur blandit libero sed ipsum convallis semper tincidunt quam ultrices. Nulla vel neque elit, eu ornare urna. Curabitur vulputate suscipit sem quis molestie. Vestibulum nulla ipsum, porttitor varius facilisis in, laoreet in odio. Cras nec enim eget nulla mollis laoreet. Maecenas pulvinar imperdiet ante, at tristique erat luctus sit amet. Nullam convallis ornare ante in feugiat. Cras id ipsum ut dolor malesuada rutrum sit amet ut lacus. Cras nec lectus pretium lectus egestas mattis ut in ipsum.</p>
<p>Proin vitae massa massa, non molestie nibh. Aliquam erat volutpat. Cras in sapien purus, eget pharetra diam. Donec dignissim dictum consequat. Suspendisse varius, urna ut porta imperdiet, mauris elit egestas nibh, tempor aliquam turpis nulla ac leo. Suspendisse potenti. Vestibulum mi lorem, facilisis ultricies accumsan nec, mattis at velit. Etiam urna erat, commodo at blandit nec, eleifend nec nibh.</p>
<p>Donec semper felis ac nulla aliquam pulvinar. Vivamus convallis ante eget lectus mollis vitae tempor purus euismod. Praesent suscipit metus et elit egestas egestas. Donec varius fringilla mauris, ut fringilla nulla feugiat consectetur. Aenean cursus pharetra condimentum. In vestibulum, metus vel dictum aliquam, nunc lectus tempor justo, nec fermentum nulla diam eu urna. Duis ac urna neque. Nulla facilisi. Suspendisse potenti. Aenean justo diam, laoreet ut euismod id, ultricies interdum massa. Etiam adipiscing velit sed mauris ornare aliquet blandit tellus iaculis. Aliquam elementum sollicitudin euismod.</p>
<p>Aenean blandit lectus non augue placerat sed gravida tellus interdum. Duis vel nibh ante, nec rhoncus lorem. Sed a leo orci. Etiam a placerat orci. Aenean sit amet felis et lorem tincidunt consequat. Nulla commodo scelerisque malesuada. In ullamcorper porttitor facilisis.</p>
<p>Nunc congue libero vel risus dignissim posuere id ut augue. Sed sit amet metus euismod arcu porttitor ultrices. Sed et erat a elit rhoncus tincidunt. Suspendisse potenti. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque scelerisque gravida erat, sed luctus odio ultricies et. Proin imperdiet molestie leo vitae molestie. Phasellus blandit, nisi at ullamcorper vulputate, neque eros aliquam nisi, vel facilisis dui orci non lorem. Fusce malesuada lacus fringilla massa sollicitudin scelerisque. Donec rutrum lacus id mauris scelerisque dignissim. Vivamus elementum nulla sit amet ante porttitor in porttitor ipsum laoreet. Vestibulum commodo dolor id velit dictum a mollis magna hendrerit. Nunc ac neque sapien.</p>
<p>Nam gravida vulputate purus, nec mattis ligula congue id. Curabitur viverra magna mi. Phasellus id justo ut eros tempus placerat ut eget nisi. Aenean lectus est, aliquet eget egestas non, pellentesque vel risus. Fusce quam velit, pharetra vitae dictum at, ornare quis nisl. Duis tempor adipiscing massa, nec venenatis nulla viverra sed. Donec placerat orci in est ultricies sollicitudin vel in enim. In hac habitasse platea dictumst. Mauris et magna sapien, eget dictum nisl. Nunc id eros dui, non commodo justo. Aliquam venenatis ornare risus, ut venenatis sem imperdiet sed. Donec a odio lacus, quis fringilla neque.</p>
<p>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin gravida tempor dolor, vestibulum ornare felis consequat quis. Sed suscipit diam convallis lacus egestas at ultricies nisl fermentum. Vestibulum sodales, lectus sed molestie bibendum, tellus elit luctus arcu, sit amet malesuada felis massa ac tellus. Fusce massa arcu, aliquam quis accumsan ut, ullamcorper at odio. Aenean scelerisque, lacus venenatis tincidunt commodo, urna elit mollis velit, a lacinia dui quam et turpis. Etiam ut tortor eget ipsum facilisis fermentum. Curabitur at neque sit amet nisl fringilla pulvinar eget quis elit. Quisque id magna et diam suscipit facilisis. Sed consequat volutpat lacinia.</p>
<p>Praesent viverra, augue vel vestibulum gravida, diam mauris sodales massa, eget cursus nisi sem in libero. Sed convallis molestie pellentesque. Ut vel ipsum massa, sit amet cursus quam. Nullam dapibus, elit eu lobortis malesuada, tellus ante consectetur diam, eget dignissim mi ante in nisl. Mauris egestas bibendum laoreet. Morbi tincidunt feugiat magna, et rutrum lectus laoreet eget. Ut ac tortor ante. In odio tortor, rhoncus a rhoncus sed, viverra ultrices metus. Quisque mollis massa velit, cursus auctor ligula. Quisque egestas arcu erat.</p>
<p>Phasellus blandit velit non dolor bibendum eleifend. In lobortis metus vel lorem auctor fermentum nec pulvinar nisl. Vestibulum urna mauris, malesuada quis viverra sit amet, convallis vel arcu. Mauris quis tortor ipsum, ac cursus erat. Cras laoreet accumsan elit, sed convallis nibh scelerisque vel. Praesent nec nunc dolor, et rutrum sem. Integer sagittis imperdiet arcu, et dictum nisl mattis eget. In sapien tellus, eleifend ut accumsan id, aliquam quis risus. Cras viverra neque et augue fringilla eu malesuada felis tincidunt. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer a magna non tellus fringilla gravida sed quis justo. Cras pulvinar ultricies tincidunt. Nullam hendrerit risus id massa feugiat iaculis. Duis rhoncus ipsum dolor, ut semper dolor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. </p>

0
spec/tmp/.gitkeep Normal file
View File