@applitools/screenshoter 3.3.3 → 3.3.7

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.
Files changed (86) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/package.json +28 -16
  3. package/src/find-image-pattern.js +14 -8
  4. package/src/image.js +38 -23
  5. package/src/scroller.js +8 -3
  6. package/src/take-screenshot.js +2 -0
  7. package/src/take-viewport-screenshot.js +20 -10
  8. package/.bongo/dry-run/package-lock.json +0 -73
  9. package/.bongo/dry-run/package.json +0 -5
  10. package/.bongo/dry-run.tgz +0 -0
  11. package/.eslintrc +0 -39
  12. package/docker-compose.yaml +0 -29
  13. package/test/e2e/android.spec.js +0 -334
  14. package/test/e2e/external.spec.js +0 -155
  15. package/test/e2e/ios.spec.js +0 -339
  16. package/test/e2e/web-ios.spec.js +0 -107
  17. package/test/e2e/web.spec.js +0 -334
  18. package/test/fixtures/android/app-fully-non-scrollable.png +0 -0
  19. package/test/fixtures/android/app-fully-recycler.png +0 -0
  20. package/test/fixtures/android/app-fully-scroll-statusbar.png +0 -0
  21. package/test/fixtures/android/app-fully-scroll.png +0 -0
  22. package/test/fixtures/android/app-statusbar.png +0 -0
  23. package/test/fixtures/android/app.png +0 -0
  24. package/test/fixtures/android/element.png +0 -0
  25. package/test/fixtures/android/region.png +0 -0
  26. package/test/fixtures/android/x-app-fully-collapsing.png +0 -0
  27. package/test/fixtures/android/x-app-fully-recycler.png +0 -0
  28. package/test/fixtures/android/x-element-fully.png +0 -0
  29. package/test/fixtures/external/agl.png +0 -0
  30. package/test/fixtures/image/house.cropped-rect.png +0 -0
  31. package/test/fixtures/image/house.cropped-region.png +0 -0
  32. package/test/fixtures/image/house.framed-higher-wider.png +0 -0
  33. package/test/fixtures/image/house.framed-higher.png +0 -0
  34. package/test/fixtures/image/house.framed-shorter-thinner.png +0 -0
  35. package/test/fixtures/image/house.framed-wider.png +0 -0
  36. package/test/fixtures/image/house.png +0 -0
  37. package/test/fixtures/image/house.rotated.png +0 -0
  38. package/test/fixtures/image/house.scaled.png +0 -0
  39. package/test/fixtures/image/house.stitched.png +0 -0
  40. package/test/fixtures/ios/app-fully-collapsing.png +0 -0
  41. package/test/fixtures/ios/app-fully-collection.png +0 -0
  42. package/test/fixtures/ios/app-fully-overlapped-statusbar.png +0 -0
  43. package/test/fixtures/ios/app-fully-overlapped.png +0 -0
  44. package/test/fixtures/ios/app-fully-scroll-statusbar.png +0 -0
  45. package/test/fixtures/ios/app-fully-scroll.png +0 -0
  46. package/test/fixtures/ios/app-fully-superview.png +0 -0
  47. package/test/fixtures/ios/app-fully-table.png +0 -0
  48. package/test/fixtures/ios/app-statusbar.png +0 -0
  49. package/test/fixtures/ios/app.png +0 -0
  50. package/test/fixtures/ios/element-fully.png +0 -0
  51. package/test/fixtures/ios/element.png +0 -0
  52. package/test/fixtures/ios/region.png +0 -0
  53. package/test/fixtures/ios/webview-fully.png +0 -0
  54. package/test/fixtures/ios/webview.png +0 -0
  55. package/test/fixtures/pattern/iPad_5th_landscape.png +0 -0
  56. package/test/fixtures/pattern/iPad_5th_portrait.png +0 -0
  57. package/test/fixtures/pattern/iPad_9th_landscape.png +0 -0
  58. package/test/fixtures/pattern/iPad_9th_portrait.png +0 -0
  59. package/test/fixtures/pattern/iPhone_11_landscape.png +0 -0
  60. package/test/fixtures/pattern/iPhone_11_portrait.png +0 -0
  61. package/test/fixtures/pattern/iPhone_13_landscape.png +0 -0
  62. package/test/fixtures/pattern/iPhone_13_portrait.png +0 -0
  63. package/test/fixtures/pattern/iPhone_SE_landscape.png +0 -0
  64. package/test/fixtures/pattern/iPhone_SE_portrait.png +0 -0
  65. package/test/fixtures/pattern/iPhone_XS_portrait_nomarker.png +0 -0
  66. package/test/fixtures/pattern/iPhone_XS_portrait_noviewport.png +0 -0
  67. package/test/fixtures/web/element-fully.png +0 -0
  68. package/test/fixtures/web/element.png +0 -0
  69. package/test/fixtures/web/frame-fully.png +0 -0
  70. package/test/fixtures/web/frame.png +0 -0
  71. package/test/fixtures/web/inner-element-fully.png +0 -0
  72. package/test/fixtures/web/inner-element.png +0 -0
  73. package/test/fixtures/web/inner-frame-fully.png +0 -0
  74. package/test/fixtures/web/inner-frame.png +0 -0
  75. package/test/fixtures/web/inner-region-fully.png +0 -0
  76. package/test/fixtures/web/inner-region.png +0 -0
  77. package/test/fixtures/web/page-fully.png +0 -0
  78. package/test/fixtures/web/page.png +0 -0
  79. package/test/fixtures/web/region-fully.png +0 -0
  80. package/test/fixtures/web/region.png +0 -0
  81. package/test/fixtures/web-ios/page-fully-landscape.png +0 -0
  82. package/test/fixtures/web-ios/page-fully.png +0 -0
  83. package/test/fixtures/web-ios/page-landscape.png +0 -0
  84. package/test/fixtures/web-ios/page.png +0 -0
  85. package/test/it/find-pattern.spec.js +0 -33
  86. package/test/it/image.spec.js +0 -146
@@ -1,339 +0,0 @@
1
- const assert = require('assert')
2
- const pixelmatch = require('pixelmatch')
3
- const utils = require('@applitools/utils')
4
- const {Driver} = require('@applitools/driver')
5
- const spec = require('@applitools/spec-driver-webdriverio')
6
- const makeImage = require('../../src/image')
7
- const takeScreenshot = require('../../index')
8
-
9
- const env = {
10
- url: 'https://ondemand.saucelabs.com/wd/hub',
11
- capabilities: {
12
- name: 'iOS Screenshoter Test',
13
- deviceName: 'iPhone 11 Pro Simulator',
14
- platformName: 'iOS',
15
- platformVersion: '14.5',
16
- appiumVersion: '1.21.0',
17
- automationName: 'XCUITest',
18
- app: 'https://applitools.jfrog.io/artifactory/Examples/IOSTestApp/1.9/app/IOSTestApp.zip',
19
- username: process.env.SAUCE_USERNAME,
20
- accessKey: process.env.SAUCE_ACCESS_KEY,
21
- },
22
-
23
- // url: 'http://0.0.0.0:4723/wd/hub',
24
- // capabilities: {
25
- // deviceName: 'iPhone 11 Pro',
26
- // platformName: 'iOS',
27
- // platformVersion: '14.5',
28
- // automationName: 'XCUITest',
29
- // app: 'https://applitools.jfrog.io/artifactory/Examples/IOSTestApp/1.9/app/IOSTestApp.zip',
30
- // },
31
- }
32
-
33
- describe('screenshoter ios', () => {
34
- const logger = {log: () => {}, warn: () => {}, error: () => {}, verbose: () => {}}
35
- let driver, browser, destroyBrowser
36
-
37
- async function sanitizeStatusBar(image) {
38
- const leftPatchImage = makeImage({
39
- width: 50,
40
- height: 16,
41
- data: Buffer.alloc(50 * 16 * 4, Buffer.from([0, 0xed, 0xed, 0xff])),
42
- })
43
- await image.copy(leftPatchImage, {x: 18, y: 15})
44
- const rightPatchImage = makeImage({
45
- width: 75,
46
- height: 16,
47
- data: Buffer.alloc(75 * 16 * 4, Buffer.from([0, 0xed, 0xed, 0xff])),
48
- })
49
- await image.copy(rightPatchImage, {x: 290, y: 15})
50
- }
51
-
52
- before(async () => {
53
- ;[browser, destroyBrowser] = await spec.build(env)
54
- })
55
-
56
- after(async () => {
57
- await destroyBrowser()
58
- })
59
-
60
- beforeEach(async () => {
61
- await browser.closeApp()
62
- await browser.launchApp()
63
- driver = await new Driver({driver: browser, spec, logger}).init()
64
- })
65
-
66
- it('take viewport screenshot', () => {
67
- return app()
68
- })
69
-
70
- it('take viewport screenshot with status bar', () => {
71
- return app({withStatusBar: true})
72
- })
73
-
74
- it('take full app screenshot (scroll view)', () => {
75
- return fullApp({type: 'scroll'})
76
- })
77
-
78
- it('take full app screenshot with status bar (scroll view)', () => {
79
- return fullApp({type: 'scroll', withStatusBar: true})
80
- })
81
-
82
- it('take full app screenshot (table view)', () => {
83
- return fullApp({type: 'table'})
84
- })
85
-
86
- it('take full app screenshot (collection view)', () => {
87
- return fullApp({type: 'collection'})
88
- })
89
-
90
- it('take full app screenshot (table view with collapsing header)', () => {
91
- return fullApp({type: 'collapsing'})
92
- })
93
-
94
- it('take full app screenshot (collection view with overlapped status bar)', () => {
95
- return fullApp({type: 'overlapped'})
96
- })
97
-
98
- it('take full app screenshot with status bar (collection view with overlapped status bar)', () => {
99
- return fullApp({type: 'overlapped', withStatusBar: true})
100
- })
101
-
102
- it('take full app screenshot (collection view with superview)', () => {
103
- return fullApp({type: 'superview'})
104
- })
105
-
106
- it('take webview screenshot', () => {
107
- return webview()
108
- })
109
-
110
- it('take full webview screenshot', () => {
111
- return fullWebview()
112
- })
113
-
114
- it('take region screenshot', () => {
115
- return region()
116
- })
117
-
118
- it.skip('take full region screenshot', () => {
119
- return fullRegion()
120
- })
121
-
122
- it('take element screenshot', () => {
123
- return element()
124
- })
125
-
126
- it('take full element screenshot', () => {
127
- return fullElement()
128
- })
129
-
130
- async function app(options = {}) {
131
- const expectedPath = `./test/fixtures/ios/app${options.withStatusBar ? '-statusbar' : ''}.png`
132
- const buttonSelector = {type: 'accessibility id', selector: 'Empty table view'}
133
-
134
- const button = await driver.element(buttonSelector)
135
- await button.click()
136
-
137
- const screenshot = await takeScreenshot({logger, driver, ...options})
138
- try {
139
- if (options.withStatusBar) await sanitizeStatusBar(screenshot.image)
140
- const actual = await screenshot.image.toObject()
141
- const expected = await makeImage(expectedPath).toObject()
142
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
143
- } catch (err) {
144
- await screenshot.image.debug({path: './logs', name: 'viewport_failed', suffix: Date.now()})
145
- throw err
146
- }
147
- }
148
- async function fullApp({type, ...options} = {}) {
149
- let buttonSelector, expectedPath, overlap
150
- if (type === 'superview') {
151
- overlap = {top: 200}
152
- buttonSelector = {type: 'accessibility id', selector: 'Bottom to superview'}
153
- expectedPath = `./test/fixtures/ios/app-fully-superview${options.withStatusBar ? '-statusbar' : ''}.png`
154
- } else if (type === 'overlapped') {
155
- overlap = {top: 200}
156
- buttonSelector = {type: 'accessibility id', selector: 'Bottom to safe area'}
157
- expectedPath = `./test/fixtures/ios/app-fully-overlapped${options.withStatusBar ? '-statusbar' : ''}.png`
158
- } else if (type === 'collapsing') {
159
- buttonSelector = {type: 'accessibility id', selector: 'Table view with stretchable header'}
160
- expectedPath = `./test/fixtures/ios/app-fully-collapsing${options.withStatusBar ? '-statusbar' : ''}.png`
161
- } else if (type === 'collection') {
162
- buttonSelector = {type: 'accessibility id', selector: 'Collection view'}
163
- expectedPath = `./test/fixtures/ios/app-fully-collection${options.withStatusBar ? '-statusbar' : ''}.png`
164
- } else if (type === 'table') {
165
- buttonSelector = {type: 'accessibility id', selector: 'Table view'}
166
- expectedPath = `./test/fixtures/ios/app-fully-table${options.withStatusBar ? '-statusbar' : ''}.png`
167
- } else {
168
- buttonSelector = {type: 'accessibility id', selector: 'Scroll view'}
169
- expectedPath = `./test/fixtures/ios/app-fully-scroll${options.withStatusBar ? '-statusbar' : ''}.png`
170
- }
171
-
172
- const button = await driver.element(buttonSelector)
173
- await button.click()
174
-
175
- await driver.init()
176
-
177
- const screenshot = await takeScreenshot({
178
- logger,
179
- driver,
180
- fully: true,
181
- framed: true,
182
- scrollingMode: 'scroll',
183
- wait: 1500,
184
- overlap: {top: 10, bottom: 50, ...overlap},
185
- ...options,
186
- })
187
- try {
188
- if (options.withStatusBar) await sanitizeStatusBar(screenshot.image)
189
- const actual = await screenshot.image.toObject()
190
- const expected = await makeImage(expectedPath).toObject()
191
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
192
- } catch (err) {
193
- await screenshot.image.debug({path: './logs', name: 'full_app_failed', suffix: Date.now()})
194
- throw err
195
- }
196
- }
197
- async function webview(options) {
198
- const expectedPath = `./test/fixtures/ios/webview.png`
199
- const buttonSelector = {type: 'accessibility id', selector: 'Web view'}
200
-
201
- const button = await driver.element(buttonSelector)
202
- await button.click()
203
- await driver.target.getContexts()
204
- await utils.general.sleep(500)
205
- const [, webview] = await driver.target.getContexts()
206
- console.log(webview)
207
- await driver.target.switchContext(webview)
208
-
209
- await driver.init()
210
-
211
- const screenshot = await takeScreenshot({logger, driver, wait: 1500, ...options})
212
- try {
213
- const actual = await screenshot.image.toObject()
214
- const expected = await makeImage(expectedPath).toObject()
215
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
216
- } catch (err) {
217
- await screenshot.image.debug({path: './logs', name: 'webview_failed', suffix: Date.now()})
218
- throw err
219
- } finally {
220
- await driver.target.switchContext('NATIVE_APP')
221
- }
222
- }
223
- async function fullWebview(options) {
224
- const expectedPath = `./test/fixtures/ios/webview-fully.png`
225
- const buttonSelector = {type: 'accessibility id', selector: 'Web view'}
226
-
227
- const button = await driver.element(buttonSelector)
228
- await button.click()
229
- await driver.target.getContexts()
230
- await utils.general.sleep(500)
231
- const [, webview] = await driver.target.getContexts()
232
- await driver.target.switchContext(webview)
233
-
234
- await driver.init()
235
- const screenshot = await takeScreenshot({
236
- logger,
237
- driver,
238
- wait: 1500,
239
- fully: true,
240
- scrollingMode: 'scroll',
241
- ...options,
242
- })
243
- try {
244
- const actual = await screenshot.image.toObject()
245
- const expected = await makeImage(expectedPath).toObject()
246
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
247
- } catch (err) {
248
- await screenshot.image.debug({path: './logs', name: 'full_webview_failed', suffix: Date.now()})
249
- throw err
250
- } finally {
251
- await driver.target.switchContext('NATIVE_APP')
252
- }
253
- }
254
- async function region(options) {
255
- const expectedPath = `./test/fixtures/ios/region.png`
256
- const buttonSelector = {type: 'accessibility id', selector: 'Empty table view'}
257
-
258
- const button = await driver.element(buttonSelector)
259
- await button.click()
260
-
261
- await driver.init()
262
- const screenshot = await takeScreenshot({
263
- logger,
264
- driver,
265
- region: {x: 30, y: 500, height: 100, width: 200},
266
- scrollingMode: 'scroll',
267
- wait: 1500,
268
- ...options,
269
- })
270
- try {
271
- const actual = await screenshot.image.toObject()
272
- const expected = await makeImage(expectedPath).toObject()
273
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
274
- } catch (err) {
275
- await screenshot.image.debug({path: './logs', name: 'region_failed'})
276
- throw err
277
- }
278
- }
279
- async function fullRegion(options) {
280
- const screenshot = await takeScreenshot({
281
- logger,
282
- driver,
283
- region: {x: 30, y: 10, height: 700, width: 200},
284
- fully: true,
285
- scrollingMode: 'scroll',
286
- ...options,
287
- })
288
- try {
289
- const actual = await screenshot.image.toObject()
290
- const expected = await makeImage('./test/fixtures/ios/region-fully.png').toObject()
291
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
292
- } catch (err) {
293
- await screenshot.image.debug({path: './logs', name: 'full_region_failed'})
294
- throw err
295
- }
296
- }
297
- async function element(options) {
298
- const screenshot = await takeScreenshot({
299
- logger,
300
- driver,
301
- region: {type: 'accessibility id', selector: 'Table view'},
302
- scrollingMode: 'scroll',
303
- ...options,
304
- })
305
- try {
306
- const actual = await screenshot.image.toObject()
307
- const expected = await makeImage('./test/fixtures/ios/element.png').toObject()
308
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
309
- } catch (err) {
310
- await screenshot.image.debug({path: './logs', name: 'element_failed'})
311
- throw err
312
- }
313
- }
314
- async function fullElement(options) {
315
- const button = await driver.element({
316
- type: 'accessibility id',
317
- selector: 'Scroll view with nested table',
318
- })
319
- await button.click()
320
-
321
- const screenshot = await takeScreenshot({
322
- logger,
323
- driver,
324
- region: {type: 'xpath', selector: '//XCUIElementTypeTable[1]'},
325
- fully: true,
326
- scrollingMode: 'scroll',
327
- wait: 1500,
328
- ...options,
329
- })
330
- try {
331
- const actual = await screenshot.image.toObject()
332
- const expected = await makeImage('./test/fixtures/ios/element-fully.png').toObject()
333
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
334
- } catch (err) {
335
- await screenshot.image.debug({path: './logs', name: 'full_element_failed'})
336
- throw err
337
- }
338
- }
339
- })
@@ -1,107 +0,0 @@
1
- const assert = require('assert')
2
- const pixelmatch = require('pixelmatch')
3
- const {Driver} = require('@applitools/driver')
4
- const spec = require('@applitools/spec-driver-webdriverio')
5
- const takeScreenshot = require('../../index')
6
- const makeImage = require('../../src/image')
7
-
8
- const env = {
9
- url: 'https://ondemand.saucelabs.com/wd/hub',
10
- capabilities: {
11
- name: 'iOS Web Screenshoter Test',
12
- deviceName: 'iPhone 11 Pro Simulator',
13
- browserName: 'safari',
14
- platformName: 'iOS',
15
- platformVersion: '14.5',
16
- appiumVersion: '1.20.1',
17
- automationName: 'XCUITest',
18
- username: process.env.SAUCE_USERNAME,
19
- accessKey: process.env.SAUCE_ACCESS_KEY,
20
- },
21
-
22
- // url: 'http://0.0.0.0:4723/wd/hub',
23
- // capabilities: {
24
- // name: 'iOS Web Screenshoter Test',
25
- // deviceName: 'iPhone 11 Pro',
26
- // browserName: 'safari',
27
- // platformName: 'iOS',
28
- // platformVersion: '14.5',
29
- // appiumVersion: '1.20.1',
30
- // automationName: 'XCUITest',
31
- // username: process.env.SAUCE_USERNAME,
32
- // accessKey: process.env.SAUCE_ACCESS_KEY,
33
- // },
34
- }
35
-
36
- describe('screenshoter web ios', () => {
37
- const logger = {log: () => {}, warn: () => {}, error: () => {}, verbose: () => {}}
38
- let driver, browser, destroyBrowser
39
-
40
- before(async () => {
41
- ;[browser, destroyBrowser] = await spec.build(env)
42
- })
43
-
44
- after(async () => {
45
- await destroyBrowser()
46
- })
47
-
48
- beforeEach(async () => {
49
- driver = await new Driver({driver: browser, spec, logger}).init()
50
- await driver.visit('https://applitools.github.io/demo/TestPages/PageWithBurgerMenu/')
51
- await driver.setViewportSize({width: 700, height: 460})
52
- })
53
-
54
- it('take viewport screenshot', () => {
55
- return viewport({orientation: 'portrait'})
56
- })
57
-
58
- it('take viewport screenshot with landscape orientation', () => {
59
- return viewport({orientation: 'landscape'})
60
- })
61
-
62
- it('take full page screenshot', () => {
63
- return fullPage({orientation: 'portrait'})
64
- })
65
-
66
- it('take full page screenshot with landscape orientation', () => {
67
- return fullPage({orientation: 'landscape'})
68
- })
69
-
70
- async function viewport({orientation = 'portrait', ...options} = {}) {
71
- const expectedPath = `./test/fixtures/web-ios/page${orientation === 'landscape' ? '-landscape' : ''}.png`
72
-
73
- await driver.target.setOrientation(orientation.toUpperCase())
74
- await driver.visit(await driver.getUrl())
75
-
76
- await driver.init()
77
-
78
- const screenshot = await takeScreenshot({logger, driver, ...options})
79
- try {
80
- const actual = await screenshot.image.toObject()
81
- const expected = await makeImage(expectedPath).toObject()
82
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
83
- } catch (err) {
84
- await screenshot.image.debug({path: './logs', name: 'ios_viewport_failed'})
85
- throw err
86
- }
87
- }
88
-
89
- async function fullPage({orientation = 'portrait', ...options} = {}) {
90
- const expectedPath = `./test/fixtures/web-ios/page-fully${orientation === 'landscape' ? '-landscape' : ''}.png`
91
-
92
- await driver.target.setOrientation(orientation.toUpperCase())
93
- await driver.visit(await driver.getUrl())
94
-
95
- await driver.init()
96
-
97
- const screenshot = await takeScreenshot({logger, driver, fully: true, ...options})
98
- try {
99
- const actual = await screenshot.image.toObject()
100
- const expected = await makeImage(expectedPath).toObject()
101
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
102
- } catch (err) {
103
- await screenshot.image.debug({path: './logs', name: 'ios_full_page_failed'})
104
- throw err
105
- }
106
- }
107
- })