@applitools/screenshoter 3.2.4 → 3.2.8
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/.bongo/dry-run/package-lock.json +5 -5
- package/.bongo/dry-run.tgz +0 -0
- package/CHANGELOG.md +16 -0
- package/docker-compose.yaml +29 -0
- package/package.json +6 -5
- package/src/image.js +1 -1
- package/src/screenshoter.js +14 -11
- package/src/take-screenshot.js +1 -0
- package/src/take-stitched-screenshot.js +1 -1
- package/test/e2e/android.spec.js +8 -1
- package/test/fixtures/android/app-fully-non-scrollable.png +0 -0
- package/test/fixtures/android/region.png +0 -0
- package/logs/screenshot_2021_08_12_10_21_06_033Z_full_app_failed_1628763666033.png +0 -0
- package/logs/screenshot_2021_08_12_10_34_27_290Z_ios_viewport_failed.png +0 -0
- package/logs/screenshot_2021_08_12_10_34_28_434Z_ios_full_page_failed.png +0 -0
- package/logs/screenshot_2021_08_12_10_43_02_793Z_full_app_failed_1628764982793.png +0 -0
- package/logs/screenshot_2021_08_12_11_03_20_837Z_region_failed_1628766200837.png +0 -0
- package/logs/screenshot_2021_08_12_11_11_33_054Z_full_app_failed_1628766693054.png +0 -0
- package/logs/screenshot_2021_08_12_12_46_06_592Z_viewport_failed_1628772366592.png +0 -0
- package/logs/screenshot_2021_08_12_12_46_15_832Z_viewport_failed_1628772375832.png +0 -0
- package/logs/screenshot_2021_08_12_12_49_45_671Z_viewport_failed_1628772585671.png +0 -0
- package/logs/screenshot_2021_08_12_12_49_56_939Z_viewport_failed_1628772596939.png +0 -0
- package/logs/screenshot_2021_08_12_12_51_32_701Z_full_app_failed_1628772692701.png +0 -0
- package/logs/screenshot_2021_08_12_12_58_47_681Z_region_failed_1628773127681.png +0 -0
- package/logs/screenshot_2021_08_12_13_11_30_839Z_viewport_failed_1628773890839.png +0 -0
- package/logs/screenshot_2021_08_12_13_11_54_642Z_viewport_failed_1628773914642.png +0 -0
- package/logs/screenshot_2021_08_12_13_16_08_255Z_element_failed.png +0 -0
- package/logs/screenshot_2021_08_12_13_38_10_302Z_region_failed_1628775490302.png +0 -0
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"@applitools/screenshoter": {
|
|
6
6
|
"version": "file:../dry-run.tgz",
|
|
7
|
-
"integrity": "sha512-
|
|
7
|
+
"integrity": "sha512-J9JOZ+7hf0GMgaDZtNE5oVcRcOwtvDD/gXDP/eEY0PFIPFpXeEZU9abkVH4E6VeT6PwRCZz42EIb8Mvf2nsEkQ==",
|
|
8
8
|
"requires": {
|
|
9
9
|
"@applitools/snippets": "2.1.7",
|
|
10
|
-
"@applitools/utils": "1.2.
|
|
10
|
+
"@applitools/utils": "1.2.4",
|
|
11
11
|
"png-async": "0.9.4"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
"integrity": "sha512-Tr4Gj7Qov/oPy+8WI4oVmmubxqpOzr8P3Wjzpl6rA57xKLg6/TiIg5oZNb4+jEmO2ShjNYLaEwRWHl7kPgb4fw=="
|
|
18
18
|
},
|
|
19
19
|
"@applitools/utils": {
|
|
20
|
-
"version": "1.2.
|
|
21
|
-
"resolved": "https://registry.npmjs.org/@applitools/utils/-/utils-1.2.
|
|
22
|
-
"integrity": "sha512-
|
|
20
|
+
"version": "1.2.4",
|
|
21
|
+
"resolved": "https://registry.npmjs.org/@applitools/utils/-/utils-1.2.4.tgz",
|
|
22
|
+
"integrity": "sha512-w7ma6FFGyqhdP6LEcuHFWOcH7EzBjnoAX3UfbFWcTHA3QXnXPX37Y2ENYRodfwkorP1cUKyUHwNXJB/BMIj/hg=="
|
|
23
23
|
},
|
|
24
24
|
"png-async": {
|
|
25
25
|
"version": "0.9.4",
|
package/.bongo/dry-run.tgz
CHANGED
|
Binary file
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@
|
|
|
4
4
|
## Unreleased
|
|
5
5
|
|
|
6
6
|
|
|
7
|
+
## 3.2.8 - 2021/10/30
|
|
8
|
+
|
|
9
|
+
- updated to @applitools/utils@1.2.4 (from 1.2.3)
|
|
10
|
+
|
|
11
|
+
## 3.2.7 - 2021/10/13
|
|
12
|
+
|
|
13
|
+
- handle a case when scrolling element does not exist
|
|
14
|
+
|
|
15
|
+
## 3.2.6 - 2021/10/12
|
|
16
|
+
|
|
17
|
+
- handle a case when scrolling element does not exist
|
|
18
|
+
|
|
19
|
+
## 3.2.5 - 2021/10/5
|
|
20
|
+
|
|
21
|
+
- fix issue with fractional image size after scaling
|
|
22
|
+
|
|
7
23
|
## 3.2.4 - 2021/9/9
|
|
8
24
|
|
|
9
25
|
- handle selectors that evaluate to elements from a different context
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "3.4",
|
|
3
|
+
"services": {
|
|
4
|
+
"chrome": {
|
|
5
|
+
"image": "selenium/standalone-chrome",
|
|
6
|
+
"environment": [
|
|
7
|
+
"SE_NODE_OVERRIDE_MAX_SESSIONS=true",
|
|
8
|
+
"SE_NODE_MAX_SESSIONS=15"
|
|
9
|
+
],
|
|
10
|
+
"volumes": [
|
|
11
|
+
"/dev/shm:/dev/shm"
|
|
12
|
+
],
|
|
13
|
+
"network_mode": "host"
|
|
14
|
+
},
|
|
15
|
+
"firefox": {
|
|
16
|
+
"image": "selenium/standalone-firefox",
|
|
17
|
+
"environment": [
|
|
18
|
+
"SE_NODE_OVERRIDE_MAX_SESSIONS=true",
|
|
19
|
+
"SE_NODE_MAX_SESSIONS=15"
|
|
20
|
+
],
|
|
21
|
+
"volumes": [
|
|
22
|
+
"/dev/shm:/dev/shm"
|
|
23
|
+
],
|
|
24
|
+
"ports": [
|
|
25
|
+
"4445:4444"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applitools/screenshoter",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.8",
|
|
4
4
|
"description": "Applitools universal screenshoter for web and native applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"applitools",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
},
|
|
18
18
|
"repository": {
|
|
19
19
|
"type": "git",
|
|
20
|
-
"url": "git://github.com/applitools/eyes.sdk.javascript1.git"
|
|
20
|
+
"url": "git://github.com/applitools/eyes.sdk.javascript1.git",
|
|
21
|
+
"directory": "packages/screenshoter"
|
|
21
22
|
},
|
|
22
23
|
"license": "SEE LICENSE IN LICENSE",
|
|
23
24
|
"author": {
|
|
@@ -49,12 +50,12 @@
|
|
|
49
50
|
},
|
|
50
51
|
"dependencies": {
|
|
51
52
|
"@applitools/snippets": "2.1.7",
|
|
52
|
-
"@applitools/utils": "1.2.
|
|
53
|
+
"@applitools/utils": "1.2.4",
|
|
53
54
|
"png-async": "0.9.4"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
|
-
"@applitools/driver": "1.2.
|
|
57
|
-
"@applitools/sdk-release-kit": "0.13.
|
|
57
|
+
"@applitools/driver": "1.2.7",
|
|
58
|
+
"@applitools/sdk-release-kit": "0.13.4",
|
|
58
59
|
"eslint": "^7.9.0",
|
|
59
60
|
"eslint-plugin-mocha-no-only": "^1.1.1",
|
|
60
61
|
"eslint-plugin-node": "^11.1.0",
|
package/src/image.js
CHANGED
package/src/screenshoter.js
CHANGED
|
@@ -54,13 +54,14 @@ async function screenshoter({
|
|
|
54
54
|
try {
|
|
55
55
|
if (!window) await scrollIntoViewport({...target, logger})
|
|
56
56
|
|
|
57
|
-
const screenshot =
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
const screenshot =
|
|
58
|
+
fully && target.scroller
|
|
59
|
+
? await takeStitchedScreenshot({...target, withStatusBar, overlap, framed, wait, stabilization, debug, logger})
|
|
60
|
+
: await takeViewportScreenshot({...target, withStatusBar, wait, stabilization, debug, logger})
|
|
60
61
|
|
|
61
62
|
if (hooks && hooks.afterScreenshot) {
|
|
62
63
|
// imitate image-like state for the hook
|
|
63
|
-
if (window && fully) {
|
|
64
|
+
if (window && fully && target.scroller) {
|
|
64
65
|
await target.scroller.moveTo({x: 0, y: 0}, await driver.mainContext.getScrollingElement())
|
|
65
66
|
}
|
|
66
67
|
await hooks.afterScreenshot({driver, scroller: target.scroller, screenshot})
|
|
@@ -68,7 +69,9 @@ async function screenshoter({
|
|
|
68
69
|
|
|
69
70
|
return screenshot
|
|
70
71
|
} finally {
|
|
71
|
-
|
|
72
|
+
if (target.scroller) {
|
|
73
|
+
await target.scroller.restoreScrollbars()
|
|
74
|
+
}
|
|
72
75
|
|
|
73
76
|
// if there was active element and we have blurred it, then restore focus
|
|
74
77
|
if (activeElement) await context.focusElement(activeElement)
|
|
@@ -93,7 +96,7 @@ async function getTarget({window, context, region, fully, scrollingMode, logger}
|
|
|
93
96
|
const scrollingElement = await context.main.getScrollingElement()
|
|
94
97
|
return {
|
|
95
98
|
context: context.main,
|
|
96
|
-
scroller: makeScroller({element: scrollingElement, scrollingMode, logger}),
|
|
99
|
+
scroller: scrollingElement ? makeScroller({element: scrollingElement, scrollingMode, logger}) : null,
|
|
97
100
|
}
|
|
98
101
|
} else if (region) {
|
|
99
102
|
if (utils.types.has(region, ['x', 'y', 'width', 'height'])) {
|
|
@@ -102,7 +105,7 @@ async function getTarget({window, context, region, fully, scrollingMode, logger}
|
|
|
102
105
|
return {
|
|
103
106
|
context,
|
|
104
107
|
region,
|
|
105
|
-
scroller: makeScroller({element: scrollingElement, scrollingMode, logger}),
|
|
108
|
+
scroller: scrollingElement ? makeScroller({element: scrollingElement, scrollingMode, logger}) : null,
|
|
106
109
|
}
|
|
107
110
|
} else {
|
|
108
111
|
// region by element or selector
|
|
@@ -121,14 +124,14 @@ async function getTarget({window, context, region, fully, scrollingMode, logger}
|
|
|
121
124
|
return {
|
|
122
125
|
context: elementContext,
|
|
123
126
|
region,
|
|
124
|
-
scroller: makeScroller({element: scrollingElement, scrollingMode, logger}),
|
|
127
|
+
scroller: scrollingElement ? makeScroller({element: scrollingElement, scrollingMode, logger}) : null,
|
|
125
128
|
}
|
|
126
129
|
} else {
|
|
127
130
|
const scrollingElement = await context.getScrollingElement()
|
|
128
131
|
return {
|
|
129
132
|
context: elementContext,
|
|
130
133
|
region: await element.getRegion(),
|
|
131
|
-
scroller: makeScroller({element: scrollingElement, scrollingMode, logger}),
|
|
134
|
+
scroller: scrollingElement ? makeScroller({element: scrollingElement, scrollingMode, logger}) : null,
|
|
132
135
|
}
|
|
133
136
|
}
|
|
134
137
|
}
|
|
@@ -138,7 +141,7 @@ async function getTarget({window, context, region, fully, scrollingMode, logger}
|
|
|
138
141
|
const scrollingElement = await context.getScrollingElement()
|
|
139
142
|
return {
|
|
140
143
|
context,
|
|
141
|
-
scroller: makeScroller({logger, element: scrollingElement, scrollingMode}),
|
|
144
|
+
scroller: scrollingElement ? makeScroller({logger, element: scrollingElement, scrollingMode}) : null,
|
|
142
145
|
}
|
|
143
146
|
} else {
|
|
144
147
|
const scrollingElement = await context.parent.getScrollingElement()
|
|
@@ -146,7 +149,7 @@ async function getTarget({window, context, region, fully, scrollingMode, logger}
|
|
|
146
149
|
return {
|
|
147
150
|
context: context.parent,
|
|
148
151
|
region: await element.getRegion(), // IMHO we should use CLIENT (without borders) region here
|
|
149
|
-
scroller: makeScroller({logger, element: scrollingElement, scrollingMode}),
|
|
152
|
+
scroller: scrollingElement ? makeScroller({logger, element: scrollingElement, scrollingMode}) : null,
|
|
150
153
|
}
|
|
151
154
|
}
|
|
152
155
|
}
|
package/src/take-screenshot.js
CHANGED
|
@@ -107,6 +107,7 @@ function makeTakeMarkedScreenshot({driver, stabilization = {}, debug, logger}) {
|
|
|
107
107
|
else {
|
|
108
108
|
if (!viewportRegion) viewportRegion = await getViewportRegion()
|
|
109
109
|
image.crop(viewportRegion)
|
|
110
|
+
await image.debug({...debug, name, suffix: 'viewport'})
|
|
110
111
|
}
|
|
111
112
|
|
|
112
113
|
return image
|
|
@@ -55,7 +55,7 @@ async function takeStitchedScreenshot({
|
|
|
55
55
|
|
|
56
56
|
// TODO padding should be provided from args instead of overlap
|
|
57
57
|
const padding = {top: overlap, bottom: overlap}
|
|
58
|
-
const [initialRegion, ...partRegions] = utils.geometry.divide(region, image.size, padding)
|
|
58
|
+
const [initialRegion, ...partRegions] = utils.geometry.divide(region, utils.geometry.round(image.size), padding)
|
|
59
59
|
logger.verbose('Part regions', partRegions)
|
|
60
60
|
|
|
61
61
|
logger.verbose('Creating stitched image composition container')
|
package/test/e2e/android.spec.js
CHANGED
|
@@ -53,8 +53,12 @@ describe('screenshoter', () => {
|
|
|
53
53
|
return fullApp({type: 'recycler'})
|
|
54
54
|
})
|
|
55
55
|
|
|
56
|
+
it('take full app screenshot (non-scrollable)', () => {
|
|
57
|
+
return fullApp({type: 'non-scrollable'})
|
|
58
|
+
})
|
|
59
|
+
|
|
56
60
|
it('take region screenshot', () => {
|
|
57
|
-
region()
|
|
61
|
+
return region()
|
|
58
62
|
})
|
|
59
63
|
|
|
60
64
|
it.skip('take full region screenshot', () => {
|
|
@@ -114,6 +118,9 @@ describe('screenshoter', () => {
|
|
|
114
118
|
buttonSelector = {type: 'id', selector: 'btn_recycler_view'}
|
|
115
119
|
expectedPath = `./test/fixtures/android/app-fully-recycler${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
116
120
|
}
|
|
121
|
+
} else if (type === 'non-scrollable') {
|
|
122
|
+
buttonSelector = {type: 'id', selector: 'btn_edit_text'}
|
|
123
|
+
expectedPath = `./test/fixtures/android/app-fully-non-scrollable${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
117
124
|
} else {
|
|
118
125
|
buttonSelector = {type: 'id', selector: 'btn_scroll_view_footer_header'}
|
|
119
126
|
expectedPath = `./test/fixtures/android/app-fully-scroll${options.withStatusBar ? '-statusbar' : ''}.png`
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|