wraith 3.0.4 → 3.1.0
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 +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
|
+
}
|