lineup 0.5.2 → 0.6.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/bin/lineup +17 -9
- data/lib/controller/browser.rb +34 -8
- data/lib/lineup.rb +33 -2
- data/lib/lineup/version.rb +2 -2
- data/tests/rspec/lineup_spec.rb +142 -9
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f3e24b0859c6f0c12ecf146e1564082f7f8a6a3
|
4
|
+
data.tar.gz: 08743eb9f69f2bd4b820c02a3799bd22e358acb5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 259f123498f086d61fb790aec5b791d0a99b273f3eb7ee34aa3989b9a654c7cfe6b01f6bff25495f4227bff1c4104183fc92b468695474d1ecb51f15b540bf4b
|
7
|
+
data.tar.gz: 93f0f59e0ea444937fd85d0d9338be16bbfdb712186a4f69a1c8b2248a5b0a8c157c47c923be86931490b31bcc1b67814188ff44c4467d669f8f2c0cf5f37154
|
data/bin/lineup
CHANGED
@@ -4,20 +4,28 @@ require '../lib/lineup'
|
|
4
4
|
|
5
5
|
puts("This is an example. And a benchmark.")
|
6
6
|
|
7
|
-
lineup = Lineup::Screenshot.new('https://
|
8
|
-
lineup.
|
9
|
-
lineup.
|
7
|
+
lineup = Lineup::Screenshot.new('https://prelive.otto.de')
|
8
|
+
lineup.urls("/,multimedia,moebel,damenmode,mittesten")
|
9
|
+
lineup.cookies([{"name"=>"trackingDisabled","value"=>"true","secure"=>false,"path"=>"/","domain"=>".otto.de"},
|
10
|
+
{"name"=>"survey","value"=>"1","secure"=>false,"path"=>"/","domain"=>".otto.de"}])
|
11
|
+
lineup.localStorage(["us_customerServiceWidget"=>"{'customerServiceWidgetNotificationHidden':{'value':true,'timestamp':1467723066080}}"])
|
12
|
+
lineup.resolutions("600,800,1200")
|
13
|
+
lineup.use_phantomjs false
|
14
|
+
lineup.wait_for_asynchron_pages(2)
|
15
|
+
|
16
|
+
puts("Taking base screenshots")
|
10
17
|
start = Time.now
|
11
|
-
puts("Taking screenshots")
|
12
18
|
lineup.record_screenshot('base')
|
13
19
|
screenshots = Time.now
|
14
|
-
|
15
|
-
|
16
|
-
|
20
|
+
|
21
|
+
puts("Taking new screenshots")
|
22
|
+
lineup.record_screenshot('new')
|
23
|
+
screenshots2 = Time.now
|
24
|
+
|
17
25
|
puts("Starting comparison")
|
18
|
-
lineup.compare('base', '
|
26
|
+
lineup.compare('base', 'new')
|
19
27
|
lineup.save_json(".")
|
20
|
-
compare = Time.now
|
28
|
+
compare = Time.now
|
21
29
|
|
22
30
|
s_t = screenshots - start
|
23
31
|
puts("Screenshots first run took #{s_t} seconds")
|
data/lib/controller/browser.rb
CHANGED
@@ -7,7 +7,7 @@ require_relative '../helper'
|
|
7
7
|
|
8
8
|
class Browser
|
9
9
|
|
10
|
-
def initialize(baseurl, urls, resolutions, path, headless, wait, cookies = [])
|
10
|
+
def initialize(baseurl, urls, resolutions, path, headless, wait, cookies = [], localStorage = [])
|
11
11
|
@absolute_image_path = path
|
12
12
|
FileUtils.mkdir_p @absolute_image_path
|
13
13
|
@baseurl = baseurl
|
@@ -15,7 +15,18 @@ class Browser
|
|
15
15
|
@resolutions = resolutions
|
16
16
|
@headless = headless
|
17
17
|
@wait = wait
|
18
|
-
|
18
|
+
|
19
|
+
if cookies
|
20
|
+
@cookies = cookies
|
21
|
+
else
|
22
|
+
@cookies = []
|
23
|
+
end
|
24
|
+
|
25
|
+
if localStorage
|
26
|
+
@localStorage = localStorage
|
27
|
+
else
|
28
|
+
@localStorage = []
|
29
|
+
end
|
19
30
|
end
|
20
31
|
|
21
32
|
def record(version)
|
@@ -53,14 +64,29 @@ class Browser
|
|
53
64
|
@browser.driver.manage.window.resize_to(width, 1000)
|
54
65
|
|
55
66
|
url = Helper.url(@baseurl, url)
|
56
|
-
|
57
|
-
if @cookies.any?
|
58
|
-
|
59
|
-
@cookies.each do |cookie|
|
60
|
-
@browser.cookies.add(cookie[:name], cookie[:value], domain: cookie[:domain], path: cookie[:path], expires: Time.now + 7200, secure: cookie[:secure])
|
61
|
-
end
|
67
|
+
|
68
|
+
if @cookies.any? || @localStorage.any?
|
69
|
+
# load url first before setting cookies and/or localStorage values
|
62
70
|
@browser.goto url
|
71
|
+
|
72
|
+
if @cookies.any?
|
73
|
+
@browser.cookies.clear
|
74
|
+
@cookies.each do |cookie|
|
75
|
+
@browser.cookies.add(cookie[:name], cookie[:value], domain: cookie[:domain], path: cookie[:path], expires: Time.now + 7200, secure: cookie[:secure])
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
if @localStorage.any?
|
80
|
+
@localStorage.each do |keyValue|
|
81
|
+
# Generate javascript for localStorage.setItem, escaping single quotes in key and value
|
82
|
+
stmt = "localStorage.setItem('" + keyValue.keys.first.gsub("'", "\\\\'") + "','" + keyValue.values.first.gsub("'", "\\\\'") + "')";
|
83
|
+
@browser.execute_script(stmt)
|
84
|
+
end
|
85
|
+
end
|
63
86
|
end
|
87
|
+
|
88
|
+
@browser.goto url
|
89
|
+
|
64
90
|
sleep @wait if @wait
|
65
91
|
@browser.screenshot.save( File.expand_path(filename))
|
66
92
|
end
|
data/lib/lineup.rb
CHANGED
@@ -230,6 +230,36 @@ module Lineup
|
|
230
230
|
end
|
231
231
|
|
232
232
|
|
233
|
+
def localStorage(localStorage)
|
234
|
+
|
235
|
+
# a hash for localStorage Key Value pair can be set here. this is optional.
|
236
|
+
#
|
237
|
+
# e.g {'key': 'value'}
|
238
|
+
#
|
239
|
+
# if it is not nil it has to be an array:
|
240
|
+
|
241
|
+
@localStorage = []
|
242
|
+
if localStorage
|
243
|
+
localStorage.each do |keyValue|
|
244
|
+
# generate :symbol => "value" hash map from "symbol" => "value"
|
245
|
+
#keyValue = keyValue.inject({}) { |element, (symbol, value)| element[symbol.to_sym] = value; element }
|
246
|
+
|
247
|
+
#Validation
|
248
|
+
(raise "LocalStorage Key Value pair must be a hash of format
|
249
|
+
{'key'=>'value'}
|
250
|
+
" unless keyValue.is_a? Hash)
|
251
|
+
|
252
|
+
raise "LocalStorage Key Value pair must have exactly one key" unless (keyValue.keys.length) == 1
|
253
|
+
raise "LocalStorage Key Value pair must have exactly one value" unless (keyValue.values.length) == 1
|
254
|
+
raise "LocalStorage Key Value pair must have a string as key" unless (keyValue.keys.first).is_a? String
|
255
|
+
raise "LocalStorage Key Value pair must have a string as value" unless (keyValue.values.first).is_a? String
|
256
|
+
|
257
|
+
@localStorage.push(keyValue)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
262
|
+
|
233
263
|
def wait_for_asynchron_pages(wait)
|
234
264
|
|
235
265
|
# if required a wait time in seconds can be set. This may be needed, if after pageload some
|
@@ -265,6 +295,7 @@ module Lineup
|
|
265
295
|
wait_for_asynchron_pages(configuration["wait_for_asynchron_pages"])
|
266
296
|
cookie_for_experiment(configuration["cookie_for_experiment"])
|
267
297
|
cookies(configuration["cookies"])
|
298
|
+
localStorage(configuration["localStorage"])
|
268
299
|
|
269
300
|
if @cookies
|
270
301
|
cookies_merged= @cookies.inject([]) { |a, element| a << element.dup }
|
@@ -278,7 +309,7 @@ module Lineup
|
|
278
309
|
# the method calls set the variables for the parameters, we return an array with all of them.
|
279
310
|
# for the example above it is:
|
280
311
|
# [["/multimedia", "/sport"], [600, 800, 1200], "~/images/", true, "#/images/diff"]
|
281
|
-
[@urls, @resolutions, @screenshots_path, @headless, @difference_path, @wait_for_asynchron_pages, cookies_merged]
|
312
|
+
[@urls, @resolutions, @screenshots_path, @headless, @difference_path, @wait_for_asynchron_pages, cookies_merged, @localStorage]
|
282
313
|
end
|
283
314
|
|
284
315
|
|
@@ -303,7 +334,7 @@ module Lineup
|
|
303
334
|
cookies_merged.push(@cookie_for_experiment)
|
304
335
|
end
|
305
336
|
|
306
|
-
browser = Browser.new(@baseurl, @urls, @resolutions, @screenshots_path, @headless, @wait_for_asynchron_pages, cookies_merged)
|
337
|
+
browser = Browser.new(@baseurl, @urls, @resolutions, @screenshots_path, @headless, @wait_for_asynchron_pages, cookies_merged, @localStorage)
|
307
338
|
# the only argument missing is if this is the "base" or "new" screenshot, this can be
|
308
339
|
# passed as an argument. The value does not need to be "base" or "new", but can be anything
|
309
340
|
browser.record(version)
|
data/lib/lineup/version.rb
CHANGED
data/tests/rspec/lineup_spec.rb
CHANGED
@@ -6,21 +6,68 @@ require_relative '../../lib/lineup'
|
|
6
6
|
|
7
7
|
describe '#screeshot_recorder' do
|
8
8
|
|
9
|
-
BASE_URL = 'https://www.google.de
|
9
|
+
BASE_URL = 'https://www.google.de'
|
10
10
|
SCREENSHOTS = "#{Dir.pwd}/screenshots/"
|
11
11
|
|
12
12
|
after(:each) { FileUtils.rmtree SCREENSHOTS }
|
13
13
|
|
14
|
+
it 'loads minimum configuration from a json file' do
|
15
|
+
# Given
|
16
|
+
file = "#{Dir.pwd}/test_configuration.json"
|
17
|
+
FileUtils.rm file if (File.exists? file)
|
18
|
+
json = '{"urls":"page1",
|
19
|
+
"resolutions": "13",
|
20
|
+
"filepath_for_images":"screenshots/path",
|
21
|
+
"use_phantomjs":true,
|
22
|
+
"difference_path":"screenshots/path/difference",
|
23
|
+
"wait_for_asynchron_pages":5
|
24
|
+
}'
|
25
|
+
save_json(json, file)
|
26
|
+
|
27
|
+
# When
|
28
|
+
lineup = Lineup::Screenshot.new(BASE_URL)
|
29
|
+
|
30
|
+
# Then
|
31
|
+
expect(
|
32
|
+
lineup.load_json_config(file)
|
33
|
+
).to eq([['page1'], [13], 'screenshots/path', true, 'screenshots/path/difference', 5, [], []])
|
34
|
+
|
35
|
+
# cleanup:
|
36
|
+
FileUtils.rm file if (File.exists? file)
|
37
|
+
end
|
38
|
+
|
14
39
|
it 'loads all configuration from a json file' do
|
15
40
|
# Given
|
16
41
|
file = "#{Dir.pwd}/test_configuration.json"
|
17
42
|
FileUtils.rm file if (File.exists? file)
|
18
43
|
json = '{"urls":"page1, page2",
|
19
44
|
"resolutions":"13,42",
|
20
|
-
"filepath_for_images":"
|
45
|
+
"filepath_for_images":"screenshots/path",
|
21
46
|
"use_phantomjs":true,
|
22
|
-
"difference_path":"
|
23
|
-
"wait_for_asynchron_pages":5
|
47
|
+
"difference_path":"screenshots/path/difference",
|
48
|
+
"wait_for_asynchron_pages":5,
|
49
|
+
"cookie_for_experiment":{
|
50
|
+
"name":"cookie1",
|
51
|
+
"value":"11111",
|
52
|
+
"domain":".google.de",
|
53
|
+
"path":"/",
|
54
|
+
"secure":false
|
55
|
+
},
|
56
|
+
"cookies" : [{
|
57
|
+
"name":"cookie2",
|
58
|
+
"value":"22222",
|
59
|
+
"domain":".google.de",
|
60
|
+
"path":"/",
|
61
|
+
"secure":false
|
62
|
+
},
|
63
|
+
{
|
64
|
+
"name":"cookie3",
|
65
|
+
"value":"33333",
|
66
|
+
"domain":".google.de",
|
67
|
+
"path":"/",
|
68
|
+
"secure":false
|
69
|
+
}],
|
70
|
+
"localStorage":[{"myKey1":"myValue1"},{"myKey2":"myValue2"}]
|
24
71
|
}'
|
25
72
|
save_json(json, file)
|
26
73
|
|
@@ -30,7 +77,11 @@ describe '#screeshot_recorder' do
|
|
30
77
|
# Then
|
31
78
|
expect(
|
32
79
|
lineup.load_json_config(file)
|
33
|
-
).to eq([['page1', 'page2'], [13,42], '
|
80
|
+
).to eq([['page1', 'page2'], [13,42], 'screenshots/path', true, 'screenshots/path/difference', 5,
|
81
|
+
[{:name=>"cookie2", :value=>"22222", :domain=>".google.de", :path=>"/", :secure=>false},
|
82
|
+
{:name=>"cookie3", :value=>"33333", :domain=>".google.de", :path=>"/", :secure=>false},
|
83
|
+
{:name=>"cookie1", :value=>"11111", :domain=>".google.de", :path=>"/", :secure=>false}],
|
84
|
+
[{"myKey1"=>"myValue1"}, {"myKey2"=>"myValue2"}]])
|
34
85
|
|
35
86
|
# cleanup:
|
36
87
|
FileUtils.rm file if (File.exists? file)
|
@@ -58,7 +109,30 @@ describe '#screeshot_recorder' do
|
|
58
109
|
|
59
110
|
end
|
60
111
|
|
61
|
-
it '
|
112
|
+
it 'opens a URL and takes mobile/tablet/desktop screenshots using firefox' do
|
113
|
+
# Given
|
114
|
+
lineup = Lineup::Screenshot.new(BASE_URL)
|
115
|
+
lineup.use_phantomjs false
|
116
|
+
|
117
|
+
# When
|
118
|
+
lineup.record_screenshot('base')
|
119
|
+
|
120
|
+
# Then
|
121
|
+
expect(
|
122
|
+
File.exist? ("#{Dir.pwd}/screenshots/frontpage_640_base.png")
|
123
|
+
).to be(true)
|
124
|
+
# And
|
125
|
+
expect(
|
126
|
+
File.exist? ("#{Dir.pwd}/screenshots/frontpage_800_base.png")
|
127
|
+
).to be(true)
|
128
|
+
# And
|
129
|
+
expect(
|
130
|
+
File.exist? ("#{Dir.pwd}/screenshots/frontpage_1180_base.png")
|
131
|
+
).to be(true)
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'takes a screenshot at desired resolution' do
|
62
136
|
# Given
|
63
137
|
width = '700'
|
64
138
|
lineup = Lineup::Screenshot.new(BASE_URL)
|
@@ -99,7 +173,7 @@ describe '#screeshot_recorder' do
|
|
99
173
|
|
100
174
|
end
|
101
175
|
|
102
|
-
it 'raises and exception if
|
176
|
+
it 'raises and exception if parameters are changed after the base screenshot' do
|
103
177
|
# Given
|
104
178
|
lineup = Lineup::Screenshot.new(BASE_URL)
|
105
179
|
lineup.urls('/')
|
@@ -144,11 +218,12 @@ describe '#screeshot_recorder' do
|
|
144
218
|
# Given
|
145
219
|
file = "#{Dir.pwd}/test_configuration.json"
|
146
220
|
FileUtils.rm file if (File.exists? file)
|
221
|
+
|
147
222
|
json = '{"urls":"page1, page2",
|
148
223
|
"resolutions":"13,42",
|
149
|
-
"filepath_for_images":"
|
224
|
+
"filepath_for_images":"screenshots/path",
|
150
225
|
"use_phantomjs":true,
|
151
|
-
"difference_path":"
|
226
|
+
"difference_path":"screenshots/path/difference",
|
152
227
|
"wait_for_asynchron_pages":5,
|
153
228
|
"cookie_for_experiment":{
|
154
229
|
"name":"CONSENT",
|
@@ -188,6 +263,64 @@ describe '#screeshot_recorder' do
|
|
188
263
|
|
189
264
|
# cleanup:
|
190
265
|
FileUtils.rm file if (File.exists? file)
|
266
|
+
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'takes a screenshot when loading a json config and setting local storage key value pair containing single quotes' do
|
270
|
+
# Given
|
271
|
+
file = "#{Dir.pwd}/test_configuration.json"
|
272
|
+
FileUtils.rm file if (File.exists? file)
|
273
|
+
|
274
|
+
json = '{"urls":"page1",
|
275
|
+
"resolutions":"200",
|
276
|
+
"filepath_for_images":"screenshots/path",
|
277
|
+
"use_phantomjs":true,
|
278
|
+
"difference_path":"screenshots/path/difference",
|
279
|
+
"wait_for_asynchron_pages":5,
|
280
|
+
"localStorage":[{"{\'mySpecialKey\'}":"{\'customerServiceWidgetNotificationHidden\':{\'value\':true,\'timestamp\':1467723066092}}"}]
|
281
|
+
}'
|
282
|
+
save_json(json, file)
|
283
|
+
lineup = Lineup::Screenshot.new(BASE_URL)
|
284
|
+
lineup.load_json_config(file)
|
285
|
+
|
286
|
+
lineup.record_screenshot('base')
|
287
|
+
# expect: no exception
|
288
|
+
|
289
|
+
# cleanup:
|
290
|
+
FileUtils.rm file if (File.exists? file)
|
291
|
+
|
292
|
+
end
|
293
|
+
|
294
|
+
it 'compares a base and a new screenshot when loading a json config and setting local storage key value pairs' do
|
295
|
+
# Given
|
296
|
+
file = "#{Dir.pwd}/test_configuration.json"
|
297
|
+
FileUtils.rm file if (File.exists? file)
|
298
|
+
|
299
|
+
json = '{"urls":"page1",
|
300
|
+
"resolutions":"200",
|
301
|
+
"filepath_for_images":"screenshots/path",
|
302
|
+
"use_phantomjs":true,
|
303
|
+
"difference_path":"screenshots/path/difference",
|
304
|
+
"wait_for_asynchron_pages":5,
|
305
|
+
"localStorage":[{"us_customerServiceWidget":"{\'customerServiceWidgetNotificationHidden\':{\'value\':true,\'timestamp\':1467723066092}}"},{"myKey2":"myValue2"}]
|
306
|
+
}'
|
307
|
+
save_json(json, file)
|
308
|
+
lineup = Lineup::Screenshot.new(BASE_URL)
|
309
|
+
lineup.load_json_config(file)
|
310
|
+
|
311
|
+
lineup.record_screenshot('base')
|
312
|
+
lineup.record_screenshot('new')
|
313
|
+
|
314
|
+
expect(
|
315
|
+
# When
|
316
|
+
lineup.compare('base', 'new')
|
317
|
+
|
318
|
+
# Then
|
319
|
+
).to eq([])
|
320
|
+
|
321
|
+
# cleanup:
|
322
|
+
FileUtils.rm file if (File.exists? file)
|
323
|
+
|
191
324
|
end
|
192
325
|
|
193
326
|
it 'compares a base and a new screenshot and returns the difference if the images are NOT the same as json log' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lineup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Finn
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-07-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -180,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
180
|
version: '0'
|
181
181
|
requirements: []
|
182
182
|
rubyforge_project:
|
183
|
-
rubygems_version: 2.
|
183
|
+
rubygems_version: 2.5.1
|
184
184
|
signing_key:
|
185
185
|
specification_version: 4
|
186
186
|
summary: lineup will help you in your automated design regression testing
|