wraith 3.0.4 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/Gemfile +1 -1
- data/lib/wraith/cli.rb +108 -73
- data/lib/wraith/compare_images.rb +4 -2
- data/lib/wraith/crop.rb +3 -1
- data/lib/wraith/folder.rb +6 -4
- data/lib/wraith/gallery.rb +21 -22
- data/lib/wraith/helpers/capture_options.rb +52 -0
- data/lib/wraith/helpers/custom_exceptions.rb +8 -0
- data/lib/wraith/helpers/logger.rb +20 -0
- data/lib/wraith/helpers/save_metadata.rb +31 -0
- data/lib/wraith/{utilities.rb → helpers/utilities.rb} +5 -4
- data/lib/wraith/javascript/_helper.js +0 -2
- data/lib/wraith/javascript/casper.js +26 -16
- data/lib/wraith/javascript/phantom.js +148 -5
- data/lib/wraith/save_images.rb +28 -104
- data/lib/wraith/spider.rb +12 -5
- data/lib/wraith/thumbnails.rb +0 -2
- data/lib/wraith/validate.rb +98 -0
- data/lib/wraith/version.rb +1 -1
- data/lib/wraith/wraith.rb +19 -12
- data/spec/_helpers.rb +4 -10
- data/spec/before_capture_spec.rb +19 -10
- data/spec/config_spec.rb +2 -9
- data/spec/configs/test_config--casper.yaml +1 -5
- data/spec/construct_command_spec.rb +43 -0
- data/spec/gallery_spec.rb +1 -2
- data/spec/js/custom_snap_file.js +26 -16
- data/spec/js/global.js +2 -1
- data/spec/js/path.js +2 -1
- data/spec/resize_reload_spec.rb +4 -8
- data/spec/save_images_spec.rb +3 -2
- data/spec/validate_spec.rb +76 -0
- data/templates/configs/capture.yaml +61 -0
- data/templates/configs/history.yaml +81 -0
- data/templates/configs/spider.yaml +13 -2
- data/templates/javascript/cookies_and_headers--casper.js +16 -0
- data/templates/javascript/cookies_and_headers--phantom.js +26 -0
- data/templates/javascript/disable_javascript--casper.js +11 -0
- data/templates/javascript/disable_javascript--phantom.js +13 -0
- data/templates/javascript/interact--casper.js +11 -0
- data/templates/javascript/interact--phantom.js +17 -0
- data/templates/javascript/wait--casper.js +8 -0
- data/templates/javascript/wait--phantom.js +8 -0
- data/wraith.gemspec +1 -1
- metadata +27 -14
- data/lib/wraith/javascript/_phantom__common.js +0 -120
- data/lib/wraith/javascript/phantom--nojs.js +0 -6
- data/templates/configs/component.yaml +0 -60
- data/templates/configs/multiple_domains.yaml +0 -53
- data/templates/javascript/beforeCapture--casper_example.js +0 -12
- data/templates/javascript/beforeCapture--phantom_example.js +0 -36
data/spec/gallery_spec.rb
CHANGED
data/spec/js/custom_snap_file.js
CHANGED
@@ -39,25 +39,35 @@ casper.start();
|
|
39
39
|
casper.open(url);
|
40
40
|
casper.viewport(dimensions.viewportWidth, dimensions.viewportHeight);
|
41
41
|
casper.then(function() {
|
42
|
-
|
43
|
-
|
42
|
+
var self = this;
|
43
|
+
if (globalBeforeCaptureJS && pathBeforeCaptureJS) {
|
44
|
+
require(globalBeforeCaptureJS)(self, function thenExecuteOtherBeforeCaptureFile() {
|
45
|
+
require(pathBeforeCaptureJS)(self, captureImage);
|
46
|
+
});
|
44
47
|
}
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
48
|
+
else if (globalBeforeCaptureJS) {
|
49
|
+
require(globalBeforeCaptureJS)(self, captureImage);
|
50
|
+
}
|
51
|
+
else if (pathBeforeCaptureJS) {
|
52
|
+
require(pathBeforeCaptureJS)(self, captureImage);
|
53
|
+
}
|
54
|
+
else {
|
55
|
+
captureImage();
|
49
56
|
}
|
50
57
|
});
|
51
|
-
|
52
|
-
|
53
|
-
//
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
return
|
58
|
+
|
59
|
+
function captureImage() {
|
60
|
+
// waits for all images to download before taking screenshots
|
61
|
+
// (broken images are a big cause of Wraith failures!)
|
62
|
+
// Credit: http://reff.it/8m3HYP
|
63
|
+
casper.waitFor(function() {
|
64
|
+
return this.evaluate(function() {
|
65
|
+
var images = document.getElementsByTagName('img');
|
66
|
+
return Array.prototype.every.call(images, function(i) { return i.complete; });
|
67
|
+
});
|
68
|
+
}, function then () {
|
69
|
+
snap.bind(this)();
|
58
70
|
});
|
59
|
-
}
|
60
|
-
snap.bind(this)();
|
61
|
-
});
|
71
|
+
}
|
62
72
|
|
63
73
|
casper.run();
|
data/spec/js/global.js
CHANGED
data/spec/js/path.js
CHANGED
data/spec/resize_reload_spec.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
require "_helpers"
|
2
2
|
|
3
3
|
describe "wraith config" do
|
4
|
-
|
5
4
|
let(:config_name) { get_path_relative_to __FILE__, "./configs/test_config--phantom.yaml" }
|
6
5
|
let(:saving) { Wraith::SaveImages.new(config_name) }
|
7
6
|
|
8
7
|
describe "saving images" do
|
9
|
-
|
10
8
|
it "should pass the width plainly to the CLI when running in inefficient mode" do
|
11
9
|
prepared_width = saving.prepare_widths_for_cli 432
|
12
10
|
expect(prepared_width).to eq 432
|
@@ -14,7 +12,7 @@ describe "wraith config" do
|
|
14
12
|
|
15
13
|
it "should pass an array of widths to CLI when running in efficient mode" do
|
16
14
|
prepared_width = saving.prepare_widths_for_cli [432, 21, 100]
|
17
|
-
expect(prepared_width).to eq "
|
15
|
+
expect(prepared_width).to eq "432,21,100"
|
18
16
|
end
|
19
17
|
|
20
18
|
it "should create fewer jobs when in efficient mode" do
|
@@ -43,13 +41,11 @@ describe "wraith config" do
|
|
43
41
|
expect(efficient_jobs.length).to be 1
|
44
42
|
expect(inefficient_jobs.length).to be 3 # 1 for each screen width
|
45
43
|
|
46
|
-
# [["test", "/mypage", "
|
47
|
-
expect(efficient_jobs[0][2]).to eq "
|
44
|
+
# [["test", "/mypage", "320,464,624", "http://www.bbc.com/mypage", "/test/MULTI__test.png", " ", "false", "false"]]
|
45
|
+
expect(efficient_jobs[0][2]).to eq "320,464,624"
|
48
46
|
|
49
47
|
# [["test", "/mypage", 320, "http://www.bbc.com/mypage", "/test/320__test.png", " ", "false", "false"], ["test", "/mypage", 464, "http://www.bbc.com/mypage", "/test/464__test.png", " ", "false", "false"], ["test", "/mypage", 624, "http://www.bbc.com/mypage", "/test/624__test.png", " ", "false", "false"]]
|
50
48
|
expect(inefficient_jobs[0][2]).to eq 320
|
51
49
|
end
|
52
|
-
|
53
50
|
end
|
54
|
-
|
55
|
-
end
|
51
|
+
end
|
data/spec/save_images_spec.rb
CHANGED
@@ -22,7 +22,8 @@ describe Wraith do
|
|
22
22
|
let(:image_size) { ImageSize.path(test_image1).size }
|
23
23
|
|
24
24
|
it "saves image" do
|
25
|
-
saving.
|
25
|
+
capture_image = saving.construct_command(320, test_url1, test_image1, selector, false, false)
|
26
|
+
`#{capture_image}`
|
26
27
|
expect(image_size[0]).to eq 320
|
27
28
|
end
|
28
29
|
end
|
@@ -51,4 +52,4 @@ describe Wraith do
|
|
51
52
|
expect(File).to exist("shots/thumbnails/test/test_diff.png")
|
52
53
|
end
|
53
54
|
end
|
54
|
-
end
|
55
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "_helpers"
|
2
|
+
|
3
|
+
describe "Wraith config validator" do
|
4
|
+
let(:config) do
|
5
|
+
YAML.load('
|
6
|
+
domains:
|
7
|
+
test: http://www.bbc.com
|
8
|
+
|
9
|
+
browser: "casperjs"
|
10
|
+
')
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "universal, basic validation for all modes" do
|
14
|
+
it "should validate a basic config" do
|
15
|
+
validate = Wraith::Validate.new(config, true).validate
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should complain if the `domains` property is missing" do
|
19
|
+
config['domains'] = nil
|
20
|
+
expect { Wraith::Validate.new(config, true).validate }.to raise_error MissingRequiredPropertyError
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should complain if the `browser` property is missing" do
|
24
|
+
config['browser'] = nil
|
25
|
+
expect { Wraith::Validate.new(config, true).validate }.to raise_error MissingRequiredPropertyError
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "validation specific to capture mode" do
|
30
|
+
it "should complain if fewer than two domains are specified" do
|
31
|
+
expect { Wraith::Validate.new(config, true).validate('capture') }.to raise_error InvalidDomainsError
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should complain if more than two domains are specified" do
|
35
|
+
config['domains'] = YAML.load('
|
36
|
+
test: http://something.bbc.com
|
37
|
+
stage: http://something-else.bbc.com
|
38
|
+
live: http://www.bbc.com
|
39
|
+
')
|
40
|
+
expect { Wraith::Validate.new(config, true).validate('capture') }.to raise_error InvalidDomainsError
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should be happy if exactly two domains are specified" do
|
44
|
+
config['domains'] = YAML.load('
|
45
|
+
test: http://something.bbc.com
|
46
|
+
live: http://www.bbc.com
|
47
|
+
')
|
48
|
+
validate = Wraith::Validate.new(config, true).validate('capture')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "validations specific to history mode" do
|
53
|
+
let(:history_conf) do
|
54
|
+
config.merge(YAML.load('
|
55
|
+
history_dir: "history_shots"
|
56
|
+
'))
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should complain if more than one domain is specified" do
|
60
|
+
history_conf['domains'] = YAML.load('
|
61
|
+
test: http://something.bbc.com
|
62
|
+
live: http://www.bbc.com
|
63
|
+
')
|
64
|
+
expect { Wraith::Validate.new(history_conf, true).validate('history') }.to raise_error InvalidDomainsError
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should complain if no history_dir is specified" do
|
68
|
+
history_conf['history_dir'] = nil
|
69
|
+
expect { Wraith::Validate.new(history_conf, true).validate('history') }.to raise_error MissingRequiredPropertyError
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should be happy if a history_dir and one domain is specified" do
|
73
|
+
validate = Wraith::Validate.new(history_conf, true).validate('history')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
##############################################################
|
2
|
+
##############################################################
|
3
|
+
# This is an example configuration provided by Wraith.
|
4
|
+
# Feel free to amend for your own requirements.
|
5
|
+
# ---
|
6
|
+
# This particular config is intended to demonstrate how
|
7
|
+
# to use Wraith in 'capture' mode, which is best suited to
|
8
|
+
# comparing a test and live version of the same website.
|
9
|
+
#
|
10
|
+
# `wraith capture capture.yaml`
|
11
|
+
#
|
12
|
+
##############################################################
|
13
|
+
##############################################################
|
14
|
+
|
15
|
+
# (required) The engine to run Wraith with. Examples: 'phantomjs', 'casperjs', 'slimerjs'
|
16
|
+
browser: "phantomjs"
|
17
|
+
|
18
|
+
# (required) The domains to take screenshots of.
|
19
|
+
domains:
|
20
|
+
current: "http://www.example.com"
|
21
|
+
new: "http://develop.example.com"
|
22
|
+
|
23
|
+
# (required) The paths to capture. All paths should exist for both of the domains specified above.
|
24
|
+
paths:
|
25
|
+
home: /
|
26
|
+
about: /about
|
27
|
+
contact: /get-in-touch
|
28
|
+
|
29
|
+
# (required) Screen widths (and optional height) to resize the browser to before taking the screenshot.
|
30
|
+
screen_widths:
|
31
|
+
- 320
|
32
|
+
- 600x768
|
33
|
+
- 768
|
34
|
+
- 1024
|
35
|
+
- 1280
|
36
|
+
|
37
|
+
# (optional) JavaScript file to execute before taking screenshot of every path. Default: nil
|
38
|
+
before_capture: 'javascript/disable_javascript--phantom.js'
|
39
|
+
|
40
|
+
# (required) The directory that your screenshots will be stored in
|
41
|
+
directory: 'shots'
|
42
|
+
|
43
|
+
# (required) Amount of fuzz ImageMagick will use when comparing images. A higher fuzz makes the comparison less strict.
|
44
|
+
fuzz: '20%'
|
45
|
+
|
46
|
+
# (optional) The maximum acceptable level of difference (in %) between two images before Wraith reports a failure. Default: 0
|
47
|
+
threshold: 5
|
48
|
+
|
49
|
+
# (optional) Specify the template (and generated thumbnail sizes) for the gallery output.
|
50
|
+
gallery:
|
51
|
+
template: 'slideshow_template' # Examples: 'basic_template' (default), 'slideshow_template'
|
52
|
+
thumb_width: 200
|
53
|
+
thumb_height: 200
|
54
|
+
|
55
|
+
# (optional) Choose which results are displayed in the gallery, and in what order. Default: alphanumeric
|
56
|
+
# Options:
|
57
|
+
# alphanumeric - all paths (with or without a difference) are shown, sorted by path
|
58
|
+
# diffs_first - all paths (with or without a difference) are shown, sorted by difference size (largest first)
|
59
|
+
# diffs_only - only paths with a difference are shown, sorted by difference size (largest first)
|
60
|
+
# Note: different screen widths are always grouped together.
|
61
|
+
mode: diffs_first
|
@@ -0,0 +1,81 @@
|
|
1
|
+
##############################################################
|
2
|
+
##############################################################
|
3
|
+
# This is an example configuration provided by Wraith.
|
4
|
+
# Feel free to amend for your own requirements.
|
5
|
+
# ---
|
6
|
+
# This particular config is intended to demonstrate how
|
7
|
+
# to use Wraith in 'history' mode, which is best suited to
|
8
|
+
# making sure your site's appearance remains consistent over
|
9
|
+
# time.
|
10
|
+
#
|
11
|
+
# `wraith history history.yaml` # generate base screenshots
|
12
|
+
# `wraith latest history.yaml` # take new shots and compare
|
13
|
+
#
|
14
|
+
##############################################################
|
15
|
+
##############################################################
|
16
|
+
|
17
|
+
# (required) The engine to run Wraith with. Examples: 'phantomjs', 'casperjs', 'slimerjs'
|
18
|
+
browser: "casperjs"
|
19
|
+
|
20
|
+
# (required) The domain to take screenshots of.
|
21
|
+
domains:
|
22
|
+
english: "http://www.bbc.co.uk"
|
23
|
+
|
24
|
+
# (required) The paths to capture. This particular config is using casperjs, so we can take screenshots of selectors rather than the entire page.
|
25
|
+
paths:
|
26
|
+
clickable_guide:
|
27
|
+
path: /news/entertainment-arts-27221191
|
28
|
+
selector: '.idt__news' # (optional) selector to take a screenshot of
|
29
|
+
clickable_guide__after_click:
|
30
|
+
path: /news/entertainment-arts-27221191
|
31
|
+
selector: '.idt__news'
|
32
|
+
before_capture: 'javascript/beforeCapture--casper_example.js' # (optional) JavaScript file to execute before taking the screenshot of this path.
|
33
|
+
|
34
|
+
# (optional) JavaScript file to execute before taking screenshot of every path. Default: nil
|
35
|
+
before_capture: 'javascript/wait--casper.js'
|
36
|
+
|
37
|
+
# (required) Screen widths (and optional height) to resize the browser to before taking the screenshot.
|
38
|
+
screen_widths:
|
39
|
+
- 320
|
40
|
+
- 600x768
|
41
|
+
- 768
|
42
|
+
- 1024
|
43
|
+
- 1280
|
44
|
+
|
45
|
+
# (optional) Resize to each screen width (efficient), or reload at each screen width (costly). Default: 'reload'
|
46
|
+
resize_or_reload: 'resize'
|
47
|
+
|
48
|
+
# (required for history mode, otherwise optional) The directory that your base screenshots will be stored in.
|
49
|
+
history_dir: 'shots_base'
|
50
|
+
|
51
|
+
# (required) The directory that your latest screenshots will be stored in
|
52
|
+
directory: 'shots'
|
53
|
+
|
54
|
+
# (required) Amount of fuzz ImageMagick will use when comparing images. A higher fuzz makes the comparison less strict.
|
55
|
+
fuzz: '20%'
|
56
|
+
|
57
|
+
# (optional) The maximum acceptable level of difference (in %) between two images before Wraith reports a failure. Default: 0
|
58
|
+
threshold: 5
|
59
|
+
|
60
|
+
# (optional) Specify the template (and generated thumbnail sizes) for the gallery output.
|
61
|
+
gallery:
|
62
|
+
template: 'slideshow_template' # Examples: 'basic_template' (default), 'slideshow_template'
|
63
|
+
thumb_width: 200
|
64
|
+
thumb_height: 200
|
65
|
+
|
66
|
+
# (optional) Choose which results are displayed in the gallery, and in what order. Default: alphanumeric
|
67
|
+
# Options:
|
68
|
+
# alphanumeric - all paths (with or without a difference) are shown, sorted by path
|
69
|
+
# diffs_first - all paths (with or without a difference) are shown, sorted by difference size (largest first)
|
70
|
+
# diffs_only - only paths with a difference are shown, sorted by difference size (largest first)
|
71
|
+
# Note: different screen widths are always grouped together.
|
72
|
+
mode: diffs_first
|
73
|
+
|
74
|
+
# (optional) Choose to run Wraith in verbose mode, for easier debugging. Default: false
|
75
|
+
verbose: true
|
76
|
+
|
77
|
+
# (optional) Color to highlight the image diff. Default: 'blue'
|
78
|
+
highlight_color: red
|
79
|
+
|
80
|
+
# (optional) Parameters to pass to Phantom/Casper command line. Default: '--ignore-ssl-errors=true --ssl-protocol=tlsv1'
|
81
|
+
phantomjs_options: ''
|
@@ -1,6 +1,17 @@
|
|
1
|
+
##############################################################
|
2
|
+
##############################################################
|
3
|
+
# This is an example configuration provided by Wraith.
|
4
|
+
# Feel free to amend for your own requirements.
|
5
|
+
# ---
|
6
|
+
# This particular config is intended to demonstrate how
|
7
|
+
# to use Wraith in 'spider' mode.
|
8
|
+
##############################################################
|
9
|
+
##############################################################
|
10
|
+
|
11
|
+
|
1
12
|
# Add as many domains as necessary. Key will act as a label
|
2
13
|
domains:
|
3
|
-
my_site:
|
14
|
+
my_site: "http://www.example.com"
|
4
15
|
my_other_site: "http://www.test.example.com"
|
5
16
|
|
6
17
|
# Notice the absence of a `paths` property. When no paths are provided, Wraith defaults to
|
@@ -38,7 +49,7 @@ screen_widths:
|
|
38
49
|
browser: "phantomjs"
|
39
50
|
|
40
51
|
# the directory that your latest screenshots will be stored in
|
41
|
-
directory: '
|
52
|
+
directory: 'shots'
|
42
53
|
|
43
54
|
# choose how results are displayed in the gallery (default is `alphanumeric` if omitted)
|
44
55
|
# Different screen widths are always grouped together.
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// ######################################################
|
2
|
+
// This is an example module provided by Wraith.
|
3
|
+
// Feel free to amend for your own requirements.
|
4
|
+
// ######################################################
|
5
|
+
module.exports = function (casper, ready) {
|
6
|
+
// reload page with headers set
|
7
|
+
casper.open(casper.page.url, {
|
8
|
+
method: 'get',
|
9
|
+
headers: {
|
10
|
+
'SOME-HEADER': 'fish'
|
11
|
+
}
|
12
|
+
});
|
13
|
+
casper.then(function () {
|
14
|
+
setTimeout(ready, 1000);
|
15
|
+
});
|
16
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// ######################################################
|
2
|
+
// This is an example module provided by Wraith.
|
3
|
+
// Feel free to amend for your own requirements.
|
4
|
+
// ######################################################
|
5
|
+
module.exports = function (phantom, ready) {
|
6
|
+
|
7
|
+
page.customHeaders = {
|
8
|
+
'SOME-HEADER': 'fish'
|
9
|
+
};
|
10
|
+
|
11
|
+
phantom.addCookie({
|
12
|
+
'name': 'ckns_policy',
|
13
|
+
'value': '111',
|
14
|
+
'domain': '.bbc.co.uk'
|
15
|
+
});
|
16
|
+
|
17
|
+
phantom.addCookie({
|
18
|
+
'name': 'locserv',
|
19
|
+
'value': '1#l1#i=6691484:n=Oxford+Circus:h=e@w1#i=8:p=London@d1#1=l:2=e:3=e:4=2@n1#r=40',
|
20
|
+
'domain': '.bbc.co.uk'
|
21
|
+
});
|
22
|
+
|
23
|
+
phantom.open(phantom.url, function () {
|
24
|
+
setTimeout(ready, 5000);
|
25
|
+
});
|
26
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
// ######################################################
|
2
|
+
// This is an example module provided by Wraith.
|
3
|
+
// Feel free to amend for your own requirements.
|
4
|
+
// ######################################################
|
5
|
+
module.exports = function (casper, ready) {
|
6
|
+
// disable JavaScript
|
7
|
+
casper.options.pageSettings.javascriptEnabled = false;
|
8
|
+
|
9
|
+
// reload the page without JS enabled
|
10
|
+
casper.thenOpen(casper.page.url);
|
11
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// ######################################################
|
2
|
+
// This is an example module provided by Wraith.
|
3
|
+
// Feel free to amend for your own requirements.
|
4
|
+
// ######################################################
|
5
|
+
module.exports = function (phantom, ready) {
|
6
|
+
// disable JavaScript
|
7
|
+
phantom.settings.javascriptEnabled = false;
|
8
|
+
|
9
|
+
// reload the page without JS enabled
|
10
|
+
phantom.open(phantom.url, function () {
|
11
|
+
setTimeout(ready, 5000);
|
12
|
+
});
|
13
|
+
}
|