@applitools/screenshoter 3.3.2 → 3.3.6

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 (81) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/package.json +26 -15
  3. package/src/image.js +15 -12
  4. package/src/scroll-into-viewport.js +16 -7
  5. package/src/take-viewport-screenshot.js +8 -30
  6. package/.bongo/dry-run/package-lock.json +0 -73
  7. package/.bongo/dry-run/package.json +0 -5
  8. package/.bongo/dry-run.tgz +0 -0
  9. package/.eslintrc +0 -39
  10. package/test/e2e/android.spec.js +0 -335
  11. package/test/e2e/external.spec.js +0 -155
  12. package/test/e2e/ios.spec.js +0 -338
  13. package/test/e2e/web-ios.spec.js +0 -72
  14. package/test/e2e/web.spec.js +0 -334
  15. package/test/fixtures/android/app-fully-non-scrollable.png +0 -0
  16. package/test/fixtures/android/app-fully-recycler.png +0 -0
  17. package/test/fixtures/android/app-fully-scroll-statusbar.png +0 -0
  18. package/test/fixtures/android/app-fully-scroll.png +0 -0
  19. package/test/fixtures/android/app-statusbar.png +0 -0
  20. package/test/fixtures/android/app.png +0 -0
  21. package/test/fixtures/android/element.png +0 -0
  22. package/test/fixtures/android/region.png +0 -0
  23. package/test/fixtures/android/x-app-fully-collapsing.png +0 -0
  24. package/test/fixtures/android/x-app-fully-recycler.png +0 -0
  25. package/test/fixtures/android/x-element-fully.png +0 -0
  26. package/test/fixtures/external/agl.png +0 -0
  27. package/test/fixtures/image/house.cropped-rect.png +0 -0
  28. package/test/fixtures/image/house.cropped-region.png +0 -0
  29. package/test/fixtures/image/house.framed-higher-wider.png +0 -0
  30. package/test/fixtures/image/house.framed-higher.png +0 -0
  31. package/test/fixtures/image/house.framed-shorter-thinner.png +0 -0
  32. package/test/fixtures/image/house.framed-wider.png +0 -0
  33. package/test/fixtures/image/house.png +0 -0
  34. package/test/fixtures/image/house.rotated.png +0 -0
  35. package/test/fixtures/image/house.scaled.png +0 -0
  36. package/test/fixtures/image/house.stitched.png +0 -0
  37. package/test/fixtures/ios/app-fully-collapsing.png +0 -0
  38. package/test/fixtures/ios/app-fully-collection.png +0 -0
  39. package/test/fixtures/ios/app-fully-overlapped-statusbar.png +0 -0
  40. package/test/fixtures/ios/app-fully-overlapped.png +0 -0
  41. package/test/fixtures/ios/app-fully-scroll-statusbar.png +0 -0
  42. package/test/fixtures/ios/app-fully-scroll.png +0 -0
  43. package/test/fixtures/ios/app-fully-superview.png +0 -0
  44. package/test/fixtures/ios/app-fully-table.png +0 -0
  45. package/test/fixtures/ios/app-statusbar.png +0 -0
  46. package/test/fixtures/ios/app.png +0 -0
  47. package/test/fixtures/ios/element-fully.png +0 -0
  48. package/test/fixtures/ios/element.png +0 -0
  49. package/test/fixtures/ios/region.png +0 -0
  50. package/test/fixtures/ios/webview-fully.png +0 -0
  51. package/test/fixtures/ios/webview.png +0 -0
  52. package/test/fixtures/pattern/iPad_5th_landscape.png +0 -0
  53. package/test/fixtures/pattern/iPad_5th_portrait.png +0 -0
  54. package/test/fixtures/pattern/iPad_9th_landscape.png +0 -0
  55. package/test/fixtures/pattern/iPad_9th_portrait.png +0 -0
  56. package/test/fixtures/pattern/iPhone_11_landscape.png +0 -0
  57. package/test/fixtures/pattern/iPhone_11_portrait.png +0 -0
  58. package/test/fixtures/pattern/iPhone_13_landscape.png +0 -0
  59. package/test/fixtures/pattern/iPhone_13_portrait.png +0 -0
  60. package/test/fixtures/pattern/iPhone_SE_landscape.png +0 -0
  61. package/test/fixtures/pattern/iPhone_SE_portrait.png +0 -0
  62. package/test/fixtures/pattern/iPhone_XS_portrait_nomarker.png +0 -0
  63. package/test/fixtures/pattern/iPhone_XS_portrait_noviewport.png +0 -0
  64. package/test/fixtures/web/element-fully.png +0 -0
  65. package/test/fixtures/web/element.png +0 -0
  66. package/test/fixtures/web/frame-fully.png +0 -0
  67. package/test/fixtures/web/frame.png +0 -0
  68. package/test/fixtures/web/inner-element-fully.png +0 -0
  69. package/test/fixtures/web/inner-element.png +0 -0
  70. package/test/fixtures/web/inner-frame-fully.png +0 -0
  71. package/test/fixtures/web/inner-frame.png +0 -0
  72. package/test/fixtures/web/inner-region-fully.png +0 -0
  73. package/test/fixtures/web/inner-region.png +0 -0
  74. package/test/fixtures/web/page-fully.png +0 -0
  75. package/test/fixtures/web/page.png +0 -0
  76. package/test/fixtures/web/region-fully.png +0 -0
  77. package/test/fixtures/web/region.png +0 -0
  78. package/test/fixtures/web-ios/page-fully.png +0 -0
  79. package/test/fixtures/web-ios/page.png +0 -0
  80. package/test/it/find-pattern.spec.js +0 -33
  81. package/test/it/image.spec.js +0 -146
@@ -1,338 +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
- await driver.target.switchContext(webview)
207
-
208
- await driver.init()
209
-
210
- const screenshot = await takeScreenshot({logger, driver, wait: 1500, ...options})
211
- try {
212
- const actual = await screenshot.image.toObject()
213
- const expected = await makeImage(expectedPath).toObject()
214
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
215
- } catch (err) {
216
- await screenshot.image.debug({path: './logs', name: 'webview_failed', suffix: Date.now()})
217
- throw err
218
- } finally {
219
- await driver.target.switchContext('NATIVE_APP')
220
- }
221
- }
222
- async function fullWebview(options) {
223
- const expectedPath = `./test/fixtures/ios/webview-fully.png`
224
- const buttonSelector = {type: 'accessibility id', selector: 'Web view'}
225
-
226
- const button = await driver.element(buttonSelector)
227
- await button.click()
228
- await driver.target.getContexts()
229
- await utils.general.sleep(500)
230
- const [, webview] = await driver.target.getContexts()
231
- await driver.target.switchContext(webview)
232
-
233
- await driver.init()
234
- const screenshot = await takeScreenshot({
235
- logger,
236
- driver,
237
- wait: 1500,
238
- fully: true,
239
- scrollingMode: 'scroll',
240
- ...options,
241
- })
242
- try {
243
- const actual = await screenshot.image.toObject()
244
- const expected = await makeImage(expectedPath).toObject()
245
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
246
- } catch (err) {
247
- await screenshot.image.debug({path: './logs', name: 'full_webview_failed', suffix: Date.now()})
248
- throw err
249
- } finally {
250
- await driver.target.switchContext('NATIVE_APP')
251
- }
252
- }
253
- async function region(options) {
254
- const expectedPath = `./test/fixtures/ios/region.png`
255
- const buttonSelector = {type: 'accessibility id', selector: 'Empty table view'}
256
-
257
- const button = await driver.element(buttonSelector)
258
- await button.click()
259
-
260
- await driver.init()
261
- const screenshot = await takeScreenshot({
262
- logger,
263
- driver,
264
- region: {x: 30, y: 500, height: 100, width: 200},
265
- scrollingMode: 'scroll',
266
- wait: 1500,
267
- ...options,
268
- })
269
- try {
270
- const actual = await screenshot.image.toObject()
271
- const expected = await makeImage(expectedPath).toObject()
272
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
273
- } catch (err) {
274
- await screenshot.image.debug({path: './logs', name: 'region_failed'})
275
- throw err
276
- }
277
- }
278
- async function fullRegion(options) {
279
- const screenshot = await takeScreenshot({
280
- logger,
281
- driver,
282
- region: {x: 30, y: 10, height: 700, width: 200},
283
- fully: true,
284
- scrollingMode: 'scroll',
285
- ...options,
286
- })
287
- try {
288
- const actual = await screenshot.image.toObject()
289
- const expected = await makeImage('./test/fixtures/ios/region-fully.png').toObject()
290
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
291
- } catch (err) {
292
- await screenshot.image.debug({path: './logs', name: 'full_region_failed'})
293
- throw err
294
- }
295
- }
296
- async function element(options) {
297
- const screenshot = await takeScreenshot({
298
- logger,
299
- driver,
300
- region: {type: 'accessibility id', selector: 'Table view'},
301
- scrollingMode: 'scroll',
302
- ...options,
303
- })
304
- try {
305
- const actual = await screenshot.image.toObject()
306
- const expected = await makeImage('./test/fixtures/ios/element.png').toObject()
307
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
308
- } catch (err) {
309
- await screenshot.image.debug({path: './logs', name: 'element_failed'})
310
- throw err
311
- }
312
- }
313
- async function fullElement(options) {
314
- const button = await driver.element({
315
- type: 'accessibility id',
316
- selector: 'Scroll view with nested table',
317
- })
318
- await button.click()
319
-
320
- const screenshot = await takeScreenshot({
321
- logger,
322
- driver,
323
- region: {type: 'xpath', selector: '//XCUIElementTypeTable[1]'},
324
- fully: true,
325
- scrollingMode: 'scroll',
326
- wait: 1500,
327
- ...options,
328
- })
329
- try {
330
- const actual = await screenshot.image.toObject()
331
- const expected = await makeImage('./test/fixtures/ios/element-fully.png').toObject()
332
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
333
- } catch (err) {
334
- await screenshot.image.debug({path: './logs', name: 'full_element_failed'})
335
- throw err
336
- }
337
- }
338
- })
@@ -1,72 +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
-
23
- describe('screenshoter web ios', () => {
24
- const logger = {log: () => {}, warn: () => {}, error: () => {}, verbose: () => {}}
25
- let driver, browser, destroyBrowser
26
-
27
- before(async () => {
28
- ;[browser, destroyBrowser] = await spec.build(env)
29
- })
30
-
31
- after(async () => {
32
- await destroyBrowser()
33
- })
34
-
35
- beforeEach(async () => {
36
- driver = await new Driver({driver: browser, spec, logger}).init()
37
- await driver.visit('https://applitools.github.io/demo/TestPages/PageWithBurgerMenu/')
38
- await driver.setViewportSize({width: 700, height: 460})
39
- })
40
-
41
- it('take viewport screenshot', () => {
42
- return viewport()
43
- })
44
-
45
- it('take full page screenshot', () => {
46
- return fullPage()
47
- })
48
-
49
- async function viewport(options) {
50
- const screenshot = await takeScreenshot({logger, driver, ...options})
51
- try {
52
- const actual = await screenshot.image.toObject()
53
- const expected = await makeImage('./test/fixtures/web-ios/page.png').toObject()
54
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
55
- } catch (err) {
56
- await screenshot.image.debug({path: './logs', name: 'ios_viewport_failed'})
57
- throw err
58
- }
59
- }
60
-
61
- async function fullPage(options) {
62
- const screenshot = await takeScreenshot({logger, driver, fully: true, ...options})
63
- try {
64
- const actual = await screenshot.image.toObject()
65
- const expected = await makeImage('./test/fixtures/web-ios/page-fully.png').toObject()
66
- assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
67
- } catch (err) {
68
- await screenshot.image.debug({path: './logs', name: 'ios_full_page_failed'})
69
- throw err
70
- }
71
- }
72
- })