@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.
- package/CHANGELOG.md +22 -0
- package/package.json +26 -15
- package/src/image.js +15 -12
- package/src/scroll-into-viewport.js +16 -7
- package/src/take-viewport-screenshot.js +8 -30
- package/.bongo/dry-run/package-lock.json +0 -73
- package/.bongo/dry-run/package.json +0 -5
- package/.bongo/dry-run.tgz +0 -0
- package/.eslintrc +0 -39
- package/test/e2e/android.spec.js +0 -335
- package/test/e2e/external.spec.js +0 -155
- package/test/e2e/ios.spec.js +0 -338
- package/test/e2e/web-ios.spec.js +0 -72
- package/test/e2e/web.spec.js +0 -334
- package/test/fixtures/android/app-fully-non-scrollable.png +0 -0
- package/test/fixtures/android/app-fully-recycler.png +0 -0
- package/test/fixtures/android/app-fully-scroll-statusbar.png +0 -0
- package/test/fixtures/android/app-fully-scroll.png +0 -0
- package/test/fixtures/android/app-statusbar.png +0 -0
- package/test/fixtures/android/app.png +0 -0
- package/test/fixtures/android/element.png +0 -0
- package/test/fixtures/android/region.png +0 -0
- package/test/fixtures/android/x-app-fully-collapsing.png +0 -0
- package/test/fixtures/android/x-app-fully-recycler.png +0 -0
- package/test/fixtures/android/x-element-fully.png +0 -0
- package/test/fixtures/external/agl.png +0 -0
- package/test/fixtures/image/house.cropped-rect.png +0 -0
- package/test/fixtures/image/house.cropped-region.png +0 -0
- package/test/fixtures/image/house.framed-higher-wider.png +0 -0
- package/test/fixtures/image/house.framed-higher.png +0 -0
- package/test/fixtures/image/house.framed-shorter-thinner.png +0 -0
- package/test/fixtures/image/house.framed-wider.png +0 -0
- package/test/fixtures/image/house.png +0 -0
- package/test/fixtures/image/house.rotated.png +0 -0
- package/test/fixtures/image/house.scaled.png +0 -0
- package/test/fixtures/image/house.stitched.png +0 -0
- package/test/fixtures/ios/app-fully-collapsing.png +0 -0
- package/test/fixtures/ios/app-fully-collection.png +0 -0
- package/test/fixtures/ios/app-fully-overlapped-statusbar.png +0 -0
- package/test/fixtures/ios/app-fully-overlapped.png +0 -0
- package/test/fixtures/ios/app-fully-scroll-statusbar.png +0 -0
- package/test/fixtures/ios/app-fully-scroll.png +0 -0
- package/test/fixtures/ios/app-fully-superview.png +0 -0
- package/test/fixtures/ios/app-fully-table.png +0 -0
- package/test/fixtures/ios/app-statusbar.png +0 -0
- package/test/fixtures/ios/app.png +0 -0
- package/test/fixtures/ios/element-fully.png +0 -0
- package/test/fixtures/ios/element.png +0 -0
- package/test/fixtures/ios/region.png +0 -0
- package/test/fixtures/ios/webview-fully.png +0 -0
- package/test/fixtures/ios/webview.png +0 -0
- package/test/fixtures/pattern/iPad_5th_landscape.png +0 -0
- package/test/fixtures/pattern/iPad_5th_portrait.png +0 -0
- package/test/fixtures/pattern/iPad_9th_landscape.png +0 -0
- package/test/fixtures/pattern/iPad_9th_portrait.png +0 -0
- package/test/fixtures/pattern/iPhone_11_landscape.png +0 -0
- package/test/fixtures/pattern/iPhone_11_portrait.png +0 -0
- package/test/fixtures/pattern/iPhone_13_landscape.png +0 -0
- package/test/fixtures/pattern/iPhone_13_portrait.png +0 -0
- package/test/fixtures/pattern/iPhone_SE_landscape.png +0 -0
- package/test/fixtures/pattern/iPhone_SE_portrait.png +0 -0
- package/test/fixtures/pattern/iPhone_XS_portrait_nomarker.png +0 -0
- package/test/fixtures/pattern/iPhone_XS_portrait_noviewport.png +0 -0
- package/test/fixtures/web/element-fully.png +0 -0
- package/test/fixtures/web/element.png +0 -0
- package/test/fixtures/web/frame-fully.png +0 -0
- package/test/fixtures/web/frame.png +0 -0
- package/test/fixtures/web/inner-element-fully.png +0 -0
- package/test/fixtures/web/inner-element.png +0 -0
- package/test/fixtures/web/inner-frame-fully.png +0 -0
- package/test/fixtures/web/inner-frame.png +0 -0
- package/test/fixtures/web/inner-region-fully.png +0 -0
- package/test/fixtures/web/inner-region.png +0 -0
- package/test/fixtures/web/page-fully.png +0 -0
- package/test/fixtures/web/page.png +0 -0
- package/test/fixtures/web/region-fully.png +0 -0
- package/test/fixtures/web/region.png +0 -0
- package/test/fixtures/web-ios/page-fully.png +0 -0
- package/test/fixtures/web-ios/page.png +0 -0
- package/test/it/find-pattern.spec.js +0 -33
- package/test/it/image.spec.js +0 -146
package/test/e2e/android.spec.js
DELETED
|
@@ -1,335 +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 makeImage = require('../../src/image')
|
|
6
|
-
const takeScreenshot = require('../../index')
|
|
7
|
-
|
|
8
|
-
const env = {
|
|
9
|
-
android: {
|
|
10
|
-
url: 'https://ondemand.saucelabs.com/wd/hub',
|
|
11
|
-
capabilities: {
|
|
12
|
-
name: 'Android Screenshoter Test',
|
|
13
|
-
browserName: '',
|
|
14
|
-
platformName: 'Android',
|
|
15
|
-
platformVersion: '7.0',
|
|
16
|
-
appiumVersion: '1.20.2',
|
|
17
|
-
deviceName: 'Samsung Galaxy S8 FHD GoogleAPI Emulator',
|
|
18
|
-
automationName: 'uiautomator2',
|
|
19
|
-
app: 'https://applitools.jfrog.io/artifactory/Examples/android/1.3/app-debug.apk',
|
|
20
|
-
username: process.env.SAUCE_USERNAME,
|
|
21
|
-
accessKey: process.env.SAUCE_ACCESS_KEY,
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
// url: 'http://0.0.0.0:4723/wd/hub',
|
|
25
|
-
// capabilities: {
|
|
26
|
-
// deviceName: 'Google Pixel 3a XL',
|
|
27
|
-
// platformName: 'Android',
|
|
28
|
-
// platformVersion: '10.0',
|
|
29
|
-
// automationName: 'uiautomator2',
|
|
30
|
-
// nativeWebScreenshot: true,
|
|
31
|
-
// avd: 'Pixel_3a_XL',
|
|
32
|
-
// app: 'https://applitools.jfrog.io/artifactory/Examples/android/1.3/app-debug.apk',
|
|
33
|
-
// },
|
|
34
|
-
},
|
|
35
|
-
androidx: {
|
|
36
|
-
url: 'https://ondemand.saucelabs.com/wd/hub',
|
|
37
|
-
capabilities: {
|
|
38
|
-
name: 'AndroidX Screenshoter Test',
|
|
39
|
-
browserName: '',
|
|
40
|
-
platformName: 'Android',
|
|
41
|
-
platformVersion: '10.0',
|
|
42
|
-
appiumVersion: '1.20.2',
|
|
43
|
-
deviceName: 'Google Pixel 3a XL GoogleAPI Emulator',
|
|
44
|
-
automationName: 'uiautomator2',
|
|
45
|
-
app: 'https://applitools.jfrog.io/artifactory/Examples/androidx/1.3.1/app_androidx.apk',
|
|
46
|
-
username: process.env.SAUCE_USERNAME,
|
|
47
|
-
accessKey: process.env.SAUCE_ACCESS_KEY,
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
// url: 'http://0.0.0.0:4723/wd/hub',
|
|
51
|
-
// capabilities: {
|
|
52
|
-
// deviceName: 'Google Pixel 3a XL',
|
|
53
|
-
// platformName: 'Android',
|
|
54
|
-
// platformVersion: '10.0',
|
|
55
|
-
// automationName: 'uiautomator2',
|
|
56
|
-
// avd: 'Pixel_3a_XL',
|
|
57
|
-
// app: 'https://applitools.jfrog.io/artifactory/Examples/androidx/1.3.3/app_androidx.apk',
|
|
58
|
-
// },
|
|
59
|
-
},
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
describe('screenshoter', () => {
|
|
63
|
-
const logger = {log: () => {}, warn: () => {}, error: () => {}, verbose: () => {}}
|
|
64
|
-
let driver, browser, destroyBrowser
|
|
65
|
-
|
|
66
|
-
async function sanitizeStatusBar(image) {
|
|
67
|
-
const patchImage = makeImage({
|
|
68
|
-
width: 85,
|
|
69
|
-
height: 18,
|
|
70
|
-
data: Buffer.alloc(85 * 18 * 4, Buffer.from([0, 0xed, 0xed, 0xff])),
|
|
71
|
-
})
|
|
72
|
-
await image.copy(patchImage, {x: 270, y: 4})
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
describe('android app', () => {
|
|
76
|
-
before(async () => {
|
|
77
|
-
;[browser, destroyBrowser] = await spec.build(env.android)
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
after(async () => {
|
|
81
|
-
await destroyBrowser()
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
beforeEach(async () => {
|
|
85
|
-
await browser.closeApp()
|
|
86
|
-
await browser.launchApp()
|
|
87
|
-
driver = await new Driver({driver: browser, spec, logger}).init()
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('take viewport screenshot', () => {
|
|
91
|
-
return app()
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
it('take viewport screenshot with status bar', () => {
|
|
95
|
-
return app({withStatusBar: true})
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
it('take full app screenshot (scroll view)', () => {
|
|
99
|
-
return fullApp({type: 'scroll'})
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
it('take full app screenshot with status bar (scroll view)', () => {
|
|
103
|
-
return fullApp({type: 'scroll', withStatusBar: true})
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
it('take full app screenshot (recycler view)', () => {
|
|
107
|
-
return fullApp({type: 'recycler'})
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
it('take full app screenshot (non-scrollable)', () => {
|
|
111
|
-
return fullApp({type: 'non-scrollable'})
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
it.skip('take webview screenshot', () => {
|
|
115
|
-
return webview()
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
it('take region screenshot', () => {
|
|
119
|
-
return region()
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
it.skip('take full region screenshot', () => {
|
|
123
|
-
return fullRegion()
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
it('take element screenshot', () => {
|
|
127
|
-
return element()
|
|
128
|
-
})
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
describe('androidx app', () => {
|
|
132
|
-
before(async () => {
|
|
133
|
-
;[browser, destroyBrowser] = await spec.build(env.androidx)
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
after(async () => {
|
|
137
|
-
await destroyBrowser()
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
beforeEach(async () => {
|
|
141
|
-
await browser.closeApp()
|
|
142
|
-
await browser.launchApp()
|
|
143
|
-
driver = await new Driver({driver: browser, spec, logger}).init()
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
it('take full app screenshot (recycler view)', () => {
|
|
147
|
-
return fullApp({type: 'recycler', x: true})
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
it('take full app screenshot (collapsing layout)', () => {
|
|
151
|
-
return fullApp({type: 'collapsing', x: true})
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
it.skip('take full app screenshot (pager)', () => {
|
|
155
|
-
return fullApp({type: 'pager', x: true})
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
it.skip('take full app screenshot (overlapped status bar)', () => {
|
|
159
|
-
return fullApp({type: 'overlapped', x: true})
|
|
160
|
-
})
|
|
161
|
-
|
|
162
|
-
it('take full element screenshot', () => {
|
|
163
|
-
return fullElement()
|
|
164
|
-
})
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
async function app(options = {}) {
|
|
168
|
-
const expectedPath = `./test/fixtures/android/app${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
169
|
-
|
|
170
|
-
const screenshot = await takeScreenshot({logger, driver, wait: 1500, ...options})
|
|
171
|
-
try {
|
|
172
|
-
if (options.withStatusBar) await sanitizeStatusBar(screenshot.image)
|
|
173
|
-
const actual = await screenshot.image.toObject()
|
|
174
|
-
const expected = await makeImage(expectedPath).toObject()
|
|
175
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
176
|
-
} catch (err) {
|
|
177
|
-
await screenshot.image.debug({path: './logs', name: 'viewport_failed', suffix: Date.now()})
|
|
178
|
-
throw err
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
async function fullApp({type, x, ...options} = {}) {
|
|
182
|
-
let buttonSelector, expectedPath, scrollingElementSelector
|
|
183
|
-
if (type === 'pager') {
|
|
184
|
-
buttonSelector = {type: 'id', selector: 'btn_view_pager_2_activity'}
|
|
185
|
-
expectedPath = `./test/fixtures/android/x-app-fully-pager${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
186
|
-
} else if (type === 'overlapped') {
|
|
187
|
-
buttonSelector = {type: 'id', selector: 'btn_recycler_view_under_status_bar_activity'}
|
|
188
|
-
expectedPath = `./test/fixtures/android/x-app-fully-overlapped${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
189
|
-
} else if (type === 'collapsing') {
|
|
190
|
-
buttonSelector = {type: 'id', selector: 'btn_recycler_view_nested_collapsing'}
|
|
191
|
-
scrollingElementSelector = {type: 'id', selector: 'recyclerView'}
|
|
192
|
-
expectedPath = `./test/fixtures/android/x-app-fully-collapsing${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
193
|
-
} else if (type === 'recycler') {
|
|
194
|
-
if (x) {
|
|
195
|
-
buttonSelector = {type: 'id', selector: 'btn_recycler_view_activity'}
|
|
196
|
-
expectedPath = `./test/fixtures/android/x-app-fully-recycler${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
197
|
-
} else {
|
|
198
|
-
buttonSelector = {type: 'id', selector: 'btn_recycler_view'}
|
|
199
|
-
expectedPath = `./test/fixtures/android/app-fully-recycler${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
200
|
-
}
|
|
201
|
-
} else if (type === 'non-scrollable') {
|
|
202
|
-
buttonSelector = {type: 'id', selector: 'btn_activity_as_dialog'}
|
|
203
|
-
expectedPath = `./test/fixtures/android/app-fully-non-scrollable${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
204
|
-
} else {
|
|
205
|
-
buttonSelector = {type: 'id', selector: 'btn_scroll_view_footer_header'}
|
|
206
|
-
expectedPath = `./test/fixtures/android/app-fully-scroll${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
const button = await driver.element(buttonSelector)
|
|
210
|
-
await button.click()
|
|
211
|
-
|
|
212
|
-
await driver.init()
|
|
213
|
-
|
|
214
|
-
if (scrollingElementSelector) {
|
|
215
|
-
await driver.currentContext.setScrollingElement(scrollingElementSelector)
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
const screenshot = await takeScreenshot({
|
|
219
|
-
logger,
|
|
220
|
-
driver,
|
|
221
|
-
fully: true,
|
|
222
|
-
framed: true,
|
|
223
|
-
scrollingMode: 'scroll',
|
|
224
|
-
wait: 1500,
|
|
225
|
-
...options,
|
|
226
|
-
})
|
|
227
|
-
try {
|
|
228
|
-
if (options.withStatusBar) await sanitizeStatusBar(screenshot.image)
|
|
229
|
-
const actual = await screenshot.image.toObject()
|
|
230
|
-
const expected = await makeImage(expectedPath).toObject()
|
|
231
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
232
|
-
} catch (err) {
|
|
233
|
-
await screenshot.image.debug({path: './logs', name: 'full_app_failed', suffix: Date.now()})
|
|
234
|
-
throw err
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
async function webview(options) {
|
|
238
|
-
const expectedPath = `./test/fixtures/android/webview.png`
|
|
239
|
-
const buttonSelector = {type: 'id', selector: 'btn_web_view'}
|
|
240
|
-
|
|
241
|
-
const button = await driver.element(buttonSelector)
|
|
242
|
-
await button.click()
|
|
243
|
-
console.log(await driver.target.getContexts())
|
|
244
|
-
await driver.target.switchContext('WEBVIEW')
|
|
245
|
-
|
|
246
|
-
await driver.init()
|
|
247
|
-
|
|
248
|
-
const screenshot = await takeScreenshot({logger, driver, wait: 1500, ...options})
|
|
249
|
-
try {
|
|
250
|
-
const actual = await screenshot.image.toObject()
|
|
251
|
-
const expected = await makeImage(expectedPath).toObject()
|
|
252
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
253
|
-
} catch (err) {
|
|
254
|
-
await screenshot.image.debug({path: './logs', name: 'webview_failed', suffix: Date.now()})
|
|
255
|
-
throw err
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
async function region(options) {
|
|
259
|
-
const screenshot = await takeScreenshot({
|
|
260
|
-
logger,
|
|
261
|
-
driver,
|
|
262
|
-
region: {x: 30, y: 500, height: 100, width: 200},
|
|
263
|
-
scrollingMode: 'scroll',
|
|
264
|
-
...options,
|
|
265
|
-
})
|
|
266
|
-
try {
|
|
267
|
-
const actual = await screenshot.image.toObject()
|
|
268
|
-
const expected = await makeImage('./test/fixtures/android/region.png').toObject()
|
|
269
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
270
|
-
} catch (err) {
|
|
271
|
-
await screenshot.image.debug({path: './logs', name: 'region_failed', suffix: Date.now()})
|
|
272
|
-
throw err
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
async function fullRegion(options) {
|
|
276
|
-
const screenshot = await takeScreenshot({
|
|
277
|
-
logger,
|
|
278
|
-
driver,
|
|
279
|
-
region: {x: 30, y: 10, height: 700, width: 200},
|
|
280
|
-
fully: true,
|
|
281
|
-
scrollingMode: 'scroll',
|
|
282
|
-
...options,
|
|
283
|
-
})
|
|
284
|
-
try {
|
|
285
|
-
const actual = await screenshot.image.toObject()
|
|
286
|
-
const expected = await makeImage('./test/fixtures/android/region-fully.png').toObject()
|
|
287
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
288
|
-
} catch (err) {
|
|
289
|
-
await screenshot.image.debug({path: './logs', name: 'full_region_failed', suffix: Date.now()})
|
|
290
|
-
throw err
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
async function element(options) {
|
|
294
|
-
const screenshot = await takeScreenshot({
|
|
295
|
-
logger,
|
|
296
|
-
driver,
|
|
297
|
-
region: {type: 'id', selector: 'btn_recycler_view'},
|
|
298
|
-
scrollingMode: 'scroll',
|
|
299
|
-
...options,
|
|
300
|
-
})
|
|
301
|
-
try {
|
|
302
|
-
const actual = await screenshot.image.toObject()
|
|
303
|
-
const expected = await makeImage('./test/fixtures/android/element.png').toObject()
|
|
304
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
305
|
-
} catch (err) {
|
|
306
|
-
await screenshot.image.debug({path: './logs', name: 'element_failed', suffix: Date.now()})
|
|
307
|
-
throw err
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
async function fullElement(options) {
|
|
311
|
-
const button = await driver.element({
|
|
312
|
-
type: 'id',
|
|
313
|
-
selector: 'btn_recycler_view_in_scroll_view_activity',
|
|
314
|
-
})
|
|
315
|
-
await button.click()
|
|
316
|
-
|
|
317
|
-
const screenshot = await takeScreenshot({
|
|
318
|
-
logger,
|
|
319
|
-
driver,
|
|
320
|
-
region: {type: 'id', selector: 'recyclerView'},
|
|
321
|
-
fully: true,
|
|
322
|
-
scrollingMode: 'scroll',
|
|
323
|
-
wait: 1500,
|
|
324
|
-
...options,
|
|
325
|
-
})
|
|
326
|
-
try {
|
|
327
|
-
const actual = await screenshot.image.toObject()
|
|
328
|
-
const expected = await makeImage('./test/fixtures/android/x-element-fully.png').toObject()
|
|
329
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
330
|
-
} catch (err) {
|
|
331
|
-
await screenshot.image.debug({path: './logs', name: 'full_element_failed', suffix: Date.now()})
|
|
332
|
-
throw err
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
})
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
const assert = require('assert')
|
|
2
|
-
const pixelmatch = require('pixelmatch')
|
|
3
|
-
const {Driver} = require('@applitools/driver')
|
|
4
|
-
const utils = require('@applitools/utils')
|
|
5
|
-
const spec = require('@applitools/spec-driver-webdriverio')
|
|
6
|
-
const makeImage = require('../../src/image')
|
|
7
|
-
const takeScreenshot = require('../../index')
|
|
8
|
-
|
|
9
|
-
describe.skip('external tests', () => {
|
|
10
|
-
const logger = {log: () => {}, warn: () => {}, error: () => {}, verbose: () => {}}
|
|
11
|
-
let browser, destroyBrowser
|
|
12
|
-
|
|
13
|
-
afterEach(async () => {
|
|
14
|
-
await destroyBrowser()
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
it('AGL Android - full app screenshot of the view with animated scroll', async () => {
|
|
18
|
-
const expectedPath = `./test/fixtures/external/agl.png`
|
|
19
|
-
|
|
20
|
-
;[browser, destroyBrowser] = await spec.build({
|
|
21
|
-
url: 'https://hub.browserstack.com/wd/hub',
|
|
22
|
-
capabilities: {
|
|
23
|
-
platformName: 'android',
|
|
24
|
-
'appium:platformVersion': '11.0',
|
|
25
|
-
'appium:deviceName': 'Google Pixel 5',
|
|
26
|
-
'appium:app': 'agl_app_android',
|
|
27
|
-
'bstack:options': {
|
|
28
|
-
userName: process.env.BROWSERSTACK_USERNAME,
|
|
29
|
-
accessKey: process.env.BROWSERSTACK_ACCESS_KEY,
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
await browser.closeApp()
|
|
35
|
-
await browser.launchApp()
|
|
36
|
-
const driver = await new Driver({driver: browser, spec, logger}).init()
|
|
37
|
-
|
|
38
|
-
const saveBtn = await browser.$('//android.widget.Button')
|
|
39
|
-
await saveBtn.click()
|
|
40
|
-
|
|
41
|
-
await utils.general.sleep(8000)
|
|
42
|
-
const signinBtn = await browser.$('//android.widget.Button[@text="SIGN IN"]')
|
|
43
|
-
await signinBtn.click()
|
|
44
|
-
await utils.general.sleep(10000)
|
|
45
|
-
const emailInput = await browser.$('//android.widget.EditText')
|
|
46
|
-
await emailInput.setValue('daniel.martin@toro.com')
|
|
47
|
-
const nxtBtn = await browser.$('//android.widget.Button[@text="NEXT"]')
|
|
48
|
-
await nxtBtn.click()
|
|
49
|
-
await utils.general.sleep(10000)
|
|
50
|
-
const passwordInput = await browser.$('//android.widget.EditText[@password="true"]')
|
|
51
|
-
await passwordInput.setValue('Welcome@1')
|
|
52
|
-
const loginBtn = await browser.$('//android.widget.Button[@text="LOGIN"]')
|
|
53
|
-
await loginBtn.click()
|
|
54
|
-
await utils.general.sleep(18000)
|
|
55
|
-
const skipBtn = await browser.$('//android.widget.Button[@text="SKIP"]')
|
|
56
|
-
await skipBtn.click()
|
|
57
|
-
await utils.general.sleep(5000)
|
|
58
|
-
const finishBtn = await browser.$('//android.widget.Button[@text="FINISH"]')
|
|
59
|
-
await finishBtn.click()
|
|
60
|
-
await utils.general.sleep(15000)
|
|
61
|
-
|
|
62
|
-
await driver.init()
|
|
63
|
-
|
|
64
|
-
const screenshot = await takeScreenshot({
|
|
65
|
-
logger,
|
|
66
|
-
driver,
|
|
67
|
-
fully: true,
|
|
68
|
-
framed: true,
|
|
69
|
-
stabilization: {crop: {top: 53, bottom: 16, left: 0, right: 0}},
|
|
70
|
-
debug: {path: './'},
|
|
71
|
-
})
|
|
72
|
-
try {
|
|
73
|
-
const actual = await screenshot.image.toObject()
|
|
74
|
-
const expected = await makeImage(expectedPath).toObject()
|
|
75
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
76
|
-
} catch (err) {
|
|
77
|
-
await screenshot.image.debug({path: './logs', name: 'viewport_failed', suffix: Date.now()})
|
|
78
|
-
throw err
|
|
79
|
-
}
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
it('AGL iOS - full app screenshot of the view with animated scroll', async () => {
|
|
83
|
-
const expectedPath = `./test/fixtures/external/agl.png`
|
|
84
|
-
;[browser, destroyBrowser] = await spec.build({
|
|
85
|
-
url: 'https://hub.browserstack.com/wd/hub',
|
|
86
|
-
capabilities: {
|
|
87
|
-
platformName: 'ios',
|
|
88
|
-
'appium:platformVersion': '14',
|
|
89
|
-
'appium:deviceName': 'iPhone 12',
|
|
90
|
-
'appium:app': 'agl_app',
|
|
91
|
-
'appium:processArguments': `{
|
|
92
|
-
"args": [
|
|
93
|
-
"-dev.environment", "qtrtest",
|
|
94
|
-
"-dev.clear.keychain", "YES",
|
|
95
|
-
"-dev.keychain.shared", "NO",
|
|
96
|
-
"-user.lastQuickTourVersionCompleted", "0"
|
|
97
|
-
],
|
|
98
|
-
"env": {
|
|
99
|
-
"DYLD_INSERT_LIBRARIES": "@executable_path/Frameworks/EyesiOSHelper.xcframework/ios-arm64/EyesiOSHelper.framework/EyesiOSHelper"
|
|
100
|
-
}
|
|
101
|
-
}`,
|
|
102
|
-
'bstack:options': {
|
|
103
|
-
userName: process.env.BROWSERSTACK_USERNAME,
|
|
104
|
-
accessKey: process.env.BROWSERSTACK_ACCESS_KEY,
|
|
105
|
-
},
|
|
106
|
-
},
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
await browser.closeApp()
|
|
110
|
-
await browser.launchApp()
|
|
111
|
-
const driver = await new Driver({driver: browser, spec, logger}).init()
|
|
112
|
-
|
|
113
|
-
await browser.acceptAlert()
|
|
114
|
-
|
|
115
|
-
await utils.general.sleep(8000)
|
|
116
|
-
const signinBtn = await browser.$('//XCUIElementTypeButton[@name="SIGN IN"]')
|
|
117
|
-
await signinBtn.click()
|
|
118
|
-
await utils.general.sleep(8000)
|
|
119
|
-
const emailInput = await browser.$('//XCUIElementTypeTextField')
|
|
120
|
-
await emailInput.setValue('daniel.martin@toro.com')
|
|
121
|
-
const nxtBtn = await browser.$('//XCUIElementTypeButton[@name="NEXT"]')
|
|
122
|
-
await nxtBtn.click()
|
|
123
|
-
await utils.general.sleep(8000)
|
|
124
|
-
const passwordInput = await browser.$('//XCUIElementTypeSecureTextField')
|
|
125
|
-
await passwordInput.setValue('Welcome@1')
|
|
126
|
-
const loginBtn = await browser.$('//XCUIElementTypeButton[@name="LOGIN"]')
|
|
127
|
-
await loginBtn.click()
|
|
128
|
-
await utils.general.sleep(18000)
|
|
129
|
-
const skipBtn = await browser.$('//XCUIElementTypeButton[@name="Skip"]')
|
|
130
|
-
await skipBtn.click()
|
|
131
|
-
await utils.general.sleep(5000)
|
|
132
|
-
const finishBtn = await browser.$('//XCUIElementTypeButton[@name="Finish"]')
|
|
133
|
-
await finishBtn.click()
|
|
134
|
-
await utils.general.sleep(20000)
|
|
135
|
-
|
|
136
|
-
await driver.init()
|
|
137
|
-
|
|
138
|
-
const screenshot = await takeScreenshot({
|
|
139
|
-
logger,
|
|
140
|
-
driver,
|
|
141
|
-
fully: true,
|
|
142
|
-
framed: true,
|
|
143
|
-
wait: 1500,
|
|
144
|
-
// debug: {path: './'},
|
|
145
|
-
})
|
|
146
|
-
try {
|
|
147
|
-
const actual = await screenshot.image.toObject()
|
|
148
|
-
const expected = await makeImage(expectedPath).toObject()
|
|
149
|
-
assert.strictEqual(pixelmatch(actual.data, expected.data, null, expected.width, expected.height), 0)
|
|
150
|
-
} catch (err) {
|
|
151
|
-
await screenshot.image.debug({path: './logs', name: 'viewport_failed', suffix: Date.now()})
|
|
152
|
-
throw err
|
|
153
|
-
}
|
|
154
|
-
})
|
|
155
|
-
})
|