webshot 0.0.3 → 0.0.4
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/CONTRIBUTORS +1 -0
- data/README.md +43 -21
- data/lib/webshot/screenshot.rb +57 -30
- data/lib/webshot/version.rb +1 -1
- data/test/webshot_test.rb +4 -3
- data/webshot.gemspec +3 -2
- metadata +23 -6
data/CONTRIBUTORS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Alex Avoyants
|
data/README.md
CHANGED
@@ -19,27 +19,49 @@ Or install it yourself as:
|
|
19
19
|
|
20
20
|
## Usage
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
22
|
+
```rb
|
23
|
+
# Setup Capybara
|
24
|
+
ws = Webshot::Screenshot.instance
|
25
|
+
|
26
|
+
# Capture Google's home page
|
27
|
+
ws.capture "http://www.google.com/", "google.png"
|
28
|
+
|
29
|
+
# Customize thumbnail
|
30
|
+
ws.capture "http://www.google.com/", "google.png", width: 100, height: 90, quality: 85
|
31
|
+
|
32
|
+
# Customize thumbnail generation (MiniMagick)
|
33
|
+
# see: https://github.com/minimagick/minimagick
|
34
|
+
ws.capture("http://www.google.com/", "google.png") do |magick|
|
35
|
+
magick.combine_options do |c|
|
36
|
+
c.thumbnail "100x"
|
37
|
+
c.background "white"
|
38
|
+
c.extent "100x90"
|
39
|
+
c.gravity "north"
|
40
|
+
c.quality 85
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
```
|
45
|
+
|
46
|
+
You can wait some time after visit page before capturing screenshot.
|
47
|
+
|
48
|
+
```rb
|
49
|
+
# Timeout in seconds
|
50
|
+
ws.capture 'http://www.google.com/', 'google.png', timeout: 2
|
51
|
+
|
52
|
+
```
|
53
|
+
|
54
|
+
You can login before capturing screenshot.
|
55
|
+
|
56
|
+
```rb
|
57
|
+
ws.start_session do
|
58
|
+
visit 'https://github.com/login'
|
59
|
+
fill_in 'Username or Email', :with => 'user@example.com'
|
60
|
+
fill_in 'Password', :with => 'password'
|
61
|
+
click_button 'Sign in'
|
62
|
+
end.capture 'https://github.com/username/', 'github.png'
|
63
|
+
|
64
|
+
```
|
43
65
|
|
44
66
|
## Contributing
|
45
67
|
|
data/lib/webshot/screenshot.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
require "singleton"
|
2
|
+
|
1
3
|
module Webshot
|
2
4
|
class Screenshot
|
3
5
|
include Capybara::DSL
|
6
|
+
include Singleton
|
4
7
|
|
5
8
|
def initialize(opts = {})
|
9
|
+
Webshot.capybara_setup!
|
6
10
|
width = opts.fetch(:width, Webshot.width)
|
7
11
|
height = opts.fetch(:height, Webshot.height)
|
8
12
|
user_agent = opts.fetch(:user_agent, Webshot.user_agent)
|
@@ -14,44 +18,67 @@ module Webshot
|
|
14
18
|
}
|
15
19
|
end
|
16
20
|
|
21
|
+
def start_session(&block)
|
22
|
+
Capybara.reset_sessions!
|
23
|
+
Capybara.current_session.instance_eval(&block) if block_given?
|
24
|
+
@session_started = true
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
17
28
|
# Captures a screenshot of +url+ saving it to +path+.
|
18
29
|
def capture(url, path, opts = {})
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
30
|
+
begin
|
31
|
+
# Default settings
|
32
|
+
width = opts.fetch(:width, 120)
|
33
|
+
height = opts.fetch(:height, 90)
|
34
|
+
gravity = opts.fetch(:gravity, "north")
|
35
|
+
quality = opts.fetch(:quality, 85)
|
24
36
|
|
25
|
-
|
26
|
-
|
37
|
+
# Reset session before visiting url
|
38
|
+
Capybara.reset_sessions! unless @session_started
|
39
|
+
@session_started = false
|
27
40
|
|
28
|
-
|
29
|
-
|
41
|
+
# Open page
|
42
|
+
visit url
|
30
43
|
|
31
|
-
|
32
|
-
|
33
|
-
# Save screenshot to file
|
34
|
-
page.driver.save_screenshot(path, :full => true)
|
44
|
+
# Timeout
|
45
|
+
sleep opts[:timeout] if opts[:timeout]
|
35
46
|
|
36
|
-
#
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
47
|
+
# Check response code
|
48
|
+
if page.driver.status_code == 200
|
49
|
+
tmp = Tempfile.new(["webshot", ".png"])
|
50
|
+
tmp.close
|
51
|
+
begin
|
52
|
+
# Save screenshot to file
|
53
|
+
page.driver.save_screenshot(tmp.path, :full => true)
|
54
|
+
|
55
|
+
# Resize screenshot
|
56
|
+
thumb = MiniMagick::Image.open(tmp.path)
|
57
|
+
if block_given?
|
58
|
+
# Customize MiniMagick options
|
59
|
+
yield thumb
|
60
|
+
else
|
61
|
+
thumb.combine_options do |c|
|
62
|
+
c.thumbnail "#{width}x"
|
63
|
+
c.background "white"
|
64
|
+
c.extent "#{width}x#{height}"
|
65
|
+
c.gravity gravity
|
66
|
+
c.quality quality
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Save thumbnail
|
71
|
+
thumb.write path
|
72
|
+
thumb
|
73
|
+
ensure
|
74
|
+
tmp.unlink
|
48
75
|
end
|
76
|
+
else
|
77
|
+
raise WebshotError.new("Could not fetch page: #{url.inspect}, error code: #{page.driver.status_code}")
|
49
78
|
end
|
50
|
-
|
51
|
-
#
|
52
|
-
|
53
|
-
else
|
54
|
-
raise WebshotError.new("Could not fetch page: #{url.inspect}, error code: #{page.driver.status_code}")
|
79
|
+
rescue Capybara::Poltergeist::BrowserError, Capybara::Poltergeist::DeadClient, Capybara::Poltergeist::TimeoutError, Errno::EPIPE => e
|
80
|
+
# TODO: Handle Errno::EPIPE and Errno::ECONNRESET
|
81
|
+
raise WebshotError.new("Capybara error: #{e.message.inspect}")
|
55
82
|
end
|
56
83
|
end
|
57
84
|
end
|
data/lib/webshot/version.rb
CHANGED
data/test/webshot_test.rb
CHANGED
@@ -5,8 +5,8 @@ class WebshotTest < Test::Unit::TestCase
|
|
5
5
|
DATA_DIR = File.expand_path(File.dirname(__FILE__) + "/data")
|
6
6
|
|
7
7
|
def setup
|
8
|
-
|
9
|
-
@webshot = Webshot::Screenshot.
|
8
|
+
FileUtils.mkdir_p(DATA_DIR) unless File.directory?(DATA_DIR)
|
9
|
+
@webshot = Webshot::Screenshot.instance
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_http
|
@@ -46,12 +46,13 @@ class WebshotTest < Test::Unit::TestCase
|
|
46
46
|
File.delete output if File.exists? output
|
47
47
|
|
48
48
|
# Customize MiniMagick options
|
49
|
-
@webshot.capture("http://#{name}/", output) do |thumb|
|
49
|
+
result = @webshot.capture("http://#{name}/", output) do |thumb|
|
50
50
|
thumb.combine_options do |c|
|
51
51
|
c.thumbnail "100x90"
|
52
52
|
end
|
53
53
|
end
|
54
54
|
assert File.exists? output
|
55
|
+
assert result.respond_to? :to_blob
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|
data/webshot.gemspec
CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
|
24
24
|
spec.add_dependency "activesupport"
|
25
|
-
spec.add_dependency "poltergeist", "~> 1.
|
26
|
-
spec.add_dependency "
|
25
|
+
spec.add_dependency "poltergeist", "~> 1.3.0"
|
26
|
+
spec.add_dependency "faye-websocket", "= 0.4.7"
|
27
|
+
spec.add_dependency "mini_magick", "~> 3.6.0"
|
27
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webshot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-02-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
requirements:
|
67
67
|
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 1.
|
69
|
+
version: 1.3.0
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +74,23 @@ dependencies:
|
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
|
-
version: 1.
|
77
|
+
version: 1.3.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: faye-websocket
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - '='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.4.7
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.4.7
|
78
94
|
- !ruby/object:Gem::Dependency
|
79
95
|
name: mini_magick
|
80
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,7 +98,7 @@ dependencies:
|
|
82
98
|
requirements:
|
83
99
|
- - ~>
|
84
100
|
- !ruby/object:Gem::Version
|
85
|
-
version: 3.
|
101
|
+
version: 3.6.0
|
86
102
|
type: :runtime
|
87
103
|
prerelease: false
|
88
104
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,7 +106,7 @@ dependencies:
|
|
90
106
|
requirements:
|
91
107
|
- - ~>
|
92
108
|
- !ruby/object:Gem::Version
|
93
|
-
version: 3.
|
109
|
+
version: 3.6.0
|
94
110
|
description: Captures a web page as a screenshot using Poltergeist, Capybara and PhantomJS
|
95
111
|
email:
|
96
112
|
- vitalie@penguin.ro
|
@@ -99,6 +115,7 @@ extensions: []
|
|
99
115
|
extra_rdoc_files: []
|
100
116
|
files:
|
101
117
|
- .gitignore
|
118
|
+
- CONTRIBUTORS
|
102
119
|
- Gemfile
|
103
120
|
- LICENSE.txt
|
104
121
|
- README.md
|