@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.
Files changed (28) hide show
  1. package/.bongo/dry-run/package-lock.json +5 -5
  2. package/.bongo/dry-run.tgz +0 -0
  3. package/CHANGELOG.md +16 -0
  4. package/docker-compose.yaml +29 -0
  5. package/package.json +6 -5
  6. package/src/image.js +1 -1
  7. package/src/screenshoter.js +14 -11
  8. package/src/take-screenshot.js +1 -0
  9. package/src/take-stitched-screenshot.js +1 -1
  10. package/test/e2e/android.spec.js +8 -1
  11. package/test/fixtures/android/app-fully-non-scrollable.png +0 -0
  12. package/test/fixtures/android/region.png +0 -0
  13. package/logs/screenshot_2021_08_12_10_21_06_033Z_full_app_failed_1628763666033.png +0 -0
  14. package/logs/screenshot_2021_08_12_10_34_27_290Z_ios_viewport_failed.png +0 -0
  15. package/logs/screenshot_2021_08_12_10_34_28_434Z_ios_full_page_failed.png +0 -0
  16. package/logs/screenshot_2021_08_12_10_43_02_793Z_full_app_failed_1628764982793.png +0 -0
  17. package/logs/screenshot_2021_08_12_11_03_20_837Z_region_failed_1628766200837.png +0 -0
  18. package/logs/screenshot_2021_08_12_11_11_33_054Z_full_app_failed_1628766693054.png +0 -0
  19. package/logs/screenshot_2021_08_12_12_46_06_592Z_viewport_failed_1628772366592.png +0 -0
  20. package/logs/screenshot_2021_08_12_12_46_15_832Z_viewport_failed_1628772375832.png +0 -0
  21. package/logs/screenshot_2021_08_12_12_49_45_671Z_viewport_failed_1628772585671.png +0 -0
  22. package/logs/screenshot_2021_08_12_12_49_56_939Z_viewport_failed_1628772596939.png +0 -0
  23. package/logs/screenshot_2021_08_12_12_51_32_701Z_full_app_failed_1628772692701.png +0 -0
  24. package/logs/screenshot_2021_08_12_12_58_47_681Z_region_failed_1628773127681.png +0 -0
  25. package/logs/screenshot_2021_08_12_13_11_30_839Z_viewport_failed_1628773890839.png +0 -0
  26. package/logs/screenshot_2021_08_12_13_11_54_642Z_viewport_failed_1628773914642.png +0 -0
  27. package/logs/screenshot_2021_08_12_13_16_08_255Z_element_failed.png +0 -0
  28. 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-Lb3Yt6kerHemQ1wViG33DcqxwC3bylxdL9A4PZXWs1cwYjxpm05j8k/L+fUJKsiR+0jCQJF3AdzFv/SUlooeyw==",
7
+ "integrity": "sha512-J9JOZ+7hf0GMgaDZtNE5oVcRcOwtvDD/gXDP/eEY0PFIPFpXeEZU9abkVH4E6VeT6PwRCZz42EIb8Mvf2nsEkQ==",
8
8
  "requires": {
9
9
  "@applitools/snippets": "2.1.7",
10
- "@applitools/utils": "1.2.3",
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.3",
21
- "resolved": "https://registry.npmjs.org/@applitools/utils/-/utils-1.2.3.tgz",
22
- "integrity": "sha512-MZXsrzeHTvjFLzpfyKRDUmZWzNxH3gWd3reqYf+1kYimALKB3CO82VDNmkaGJykrRbxEP03Yqha7fHJj9eKslQ=="
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",
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.4",
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.3",
53
+ "@applitools/utils": "1.2.4",
53
54
  "png-async": "0.9.4"
54
55
  },
55
56
  "devDependencies": {
56
- "@applitools/driver": "1.2.0",
57
- "@applitools/sdk-release-kit": "0.13.3",
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
@@ -40,7 +40,7 @@ function makeImage(data) {
40
40
  return true
41
41
  },
42
42
  get size() {
43
- return {...utils.geometry.scale(size, transforms.scale)}
43
+ return utils.geometry.round(utils.geometry.scale(size, transforms.scale))
44
44
  },
45
45
  get transforms() {
46
46
  return {...transforms}
@@ -54,13 +54,14 @@ async function screenshoter({
54
54
  try {
55
55
  if (!window) await scrollIntoViewport({...target, logger})
56
56
 
57
- const screenshot = fully
58
- ? await takeStitchedScreenshot({...target, withStatusBar, overlap, framed, wait, stabilization, debug, logger})
59
- : await takeViewportScreenshot({...target, withStatusBar, wait, stabilization, debug, logger})
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
- await target.scroller.restoreScrollbars()
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
  }
@@ -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')
@@ -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