@applitools/screenshoter 3.3.12 → 3.3.15
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/index.js +6 -2
- package/package.json +7 -7
- package/src/getTarget.js +94 -0
- package/src/take-screenshot.js +30 -79
- package/src/take-viewport-screenshot.js +12 -1
- package/CHANGELOG.md +0 -187
package/index.js
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
const takeScreenshot = require('./src/take-screenshot')
|
|
2
|
+
const getTarget = require('./src/getTarget')
|
|
3
|
+
module.exports = {
|
|
4
|
+
takeScreenshot,
|
|
5
|
+
getTarget,
|
|
6
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applitools/screenshoter",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.15",
|
|
4
4
|
"description": "Applitools universal screenshoter for web and native applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"applitools",
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
"test": "yarn test:it && yarn test:e2e",
|
|
36
36
|
"test:unit": "mocha ./test/unit/*.spec.js --no-timeouts",
|
|
37
37
|
"test:it": "mocha ./test/it/*.spec.js --no-timeouts",
|
|
38
|
-
"test:e2e": "
|
|
39
|
-
"test:e2e:web": "mocha ./test/e2e/web/*.spec.js --no-timeouts -r @applitools/test-utils/mocha-hooks/docker
|
|
38
|
+
"test:e2e": "yarn test:e2e:web && yarn && test:e2e:android && yarn test:e2e:ios",
|
|
39
|
+
"test:e2e:web": "APPLITOOLS_SHOW_LOGS=true mocha ./test/e2e/web/*.spec.js --no-timeouts -r @applitools/test-utils/mocha-hooks/docker",
|
|
40
40
|
"test:e2e:android": "APPLITOOLS_TEST_REMOTE=sauce mocha ./test/e2e/android*/*.spec.js --no-timeouts --parallel --jobs ${MOCHA_JOBS:-2}",
|
|
41
41
|
"test:e2e:ios": "APPLITOOLS_TEST_REMOTE=sauce mocha ./test/e2e/ios*/*.spec.js --no-timeouts --parallel --jobs ${MOCHA_JOBS:-2}",
|
|
42
42
|
"setup:web": "yarn docker:setup",
|
|
@@ -65,11 +65,11 @@
|
|
|
65
65
|
"png-async": "0.9.4"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@applitools/
|
|
68
|
+
"@applitools/bongo": "^2.0.1",
|
|
69
|
+
"@applitools/driver": "1.6.1",
|
|
69
70
|
"@applitools/scripts": "1.1.0",
|
|
70
|
-
"@applitools/
|
|
71
|
-
"@applitools/
|
|
72
|
-
"@applitools/test-utils": "1.1.5",
|
|
71
|
+
"@applitools/spec-driver-webdriverio": "1.2.8",
|
|
72
|
+
"@applitools/test-utils": "1.3.0",
|
|
73
73
|
"appium": "^1.22.2",
|
|
74
74
|
"chromedriver": "^95.0.0",
|
|
75
75
|
"eslint": "^7.9.0",
|
package/src/getTarget.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const utils = require('@applitools/utils')
|
|
4
|
+
|
|
5
|
+
function isNavigationBar(region) {
|
|
6
|
+
if (
|
|
7
|
+
(region.value && region.value.includes(`type == "XCUIElementTypeNavigationBar"`)) ||
|
|
8
|
+
(region.selector && region.selector.includes(`type == "XCUIElementTypeNavigationBar"`))
|
|
9
|
+
) {
|
|
10
|
+
return true
|
|
11
|
+
} else {
|
|
12
|
+
return false
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function isTabBar(region) {
|
|
17
|
+
if (
|
|
18
|
+
(region.value && region.value.includes('type == "XCUIElementTypeTabBar"')) ||
|
|
19
|
+
(region.selector && region.selector.includes(`type == "XCUIElementTypeTabBar"`))
|
|
20
|
+
) {
|
|
21
|
+
return true
|
|
22
|
+
} else {
|
|
23
|
+
return false
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function getTarget({window, context, region, fully, scrollingMode}) {
|
|
28
|
+
if (window) {
|
|
29
|
+
// window/app
|
|
30
|
+
const scrollingElement = await context.main.getScrollingElement()
|
|
31
|
+
return {
|
|
32
|
+
context: context.main,
|
|
33
|
+
scrollingElement,
|
|
34
|
+
}
|
|
35
|
+
} else if (region) {
|
|
36
|
+
if (utils.types.has(region, ['x', 'y', 'width', 'height'])) {
|
|
37
|
+
// region by coordinates
|
|
38
|
+
const scrollingElement = await context.getScrollingElement()
|
|
39
|
+
return {
|
|
40
|
+
context,
|
|
41
|
+
region,
|
|
42
|
+
scrollingElement,
|
|
43
|
+
}
|
|
44
|
+
} else {
|
|
45
|
+
// region by element or selector
|
|
46
|
+
const element = await context.element(region)
|
|
47
|
+
if (!element) throw new Error('Element not found!')
|
|
48
|
+
|
|
49
|
+
const elementContext = element.context
|
|
50
|
+
|
|
51
|
+
if (fully) {
|
|
52
|
+
const isScrollable = await element.isScrollable()
|
|
53
|
+
// if element is scrollable, then take screenshot of the full element content, otherwise take screenshot of full element
|
|
54
|
+
const region = isScrollable ? null : await element.getRegion()
|
|
55
|
+
const scrollingElement = isScrollable ? element : await elementContext.getScrollingElement()
|
|
56
|
+
// css stitching could be applied only to root element of its context
|
|
57
|
+
scrollingMode = scrollingMode === 'css' && !(await scrollingElement.isRoot()) ? 'mixed+' : scrollingMode
|
|
58
|
+
return {
|
|
59
|
+
context: elementContext,
|
|
60
|
+
region,
|
|
61
|
+
scrollingMode,
|
|
62
|
+
scrollingElement,
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
const scrollingElement = await context.getScrollingElement()
|
|
66
|
+
const navBar = isNavigationBar(region)
|
|
67
|
+
const tabBar = isTabBar(region)
|
|
68
|
+
return {
|
|
69
|
+
context: elementContext,
|
|
70
|
+
region: await element.getRegion(navBar || tabBar),
|
|
71
|
+
scrollingElement,
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
} else if (!context.isMain) {
|
|
76
|
+
// context
|
|
77
|
+
if (fully) {
|
|
78
|
+
const scrollingElement = await context.getScrollingElement()
|
|
79
|
+
return {
|
|
80
|
+
context,
|
|
81
|
+
scrollingElement,
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
const scrollingElement = await context.parent.getScrollingElement()
|
|
85
|
+
const element = await context.getContextElement()
|
|
86
|
+
return {
|
|
87
|
+
context: context.parent,
|
|
88
|
+
region: await element.getRegion(), // IMHO we should use CLIENT (without borders) region here
|
|
89
|
+
scrollingElement,
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
module.exports = getTarget
|
package/src/take-screenshot.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const utils = require('@applitools/utils')
|
|
2
|
-
const makeScroller = require('./scroller')
|
|
3
1
|
const scrollIntoViewport = require('./scroll-into-viewport')
|
|
2
|
+
const getTarget = require('./getTarget')
|
|
3
|
+
const makeScroller = require('./scroller')
|
|
4
4
|
const takeStitchedScreenshot = require('./take-stitched-screenshot')
|
|
5
5
|
const takeSimpleScreenshot = require('./take-simple-screenshot')
|
|
6
6
|
|
|
@@ -48,32 +48,48 @@ async function takeScreenshot({
|
|
|
48
48
|
// blur active element in target context
|
|
49
49
|
const activeElement = driver.isWeb && hideCaret ? await context.blurElement() : null
|
|
50
50
|
|
|
51
|
-
const target = await getTarget({window, context, region, fully, scrollingMode
|
|
51
|
+
const target = await getTarget({window, context, region, fully, scrollingMode})
|
|
52
|
+
// in some cases getTarget logic manipulates the 'scrollingMode'
|
|
53
|
+
scrollingMode = target.scrollingMode || scrollingMode
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
const scroller = target.scrollingElement
|
|
56
|
+
? makeScroller({element: target.scrollingElement, scrollingMode, logger})
|
|
57
|
+
: null
|
|
58
|
+
|
|
59
|
+
if (scroller) {
|
|
60
|
+
await scroller.preserveState()
|
|
61
|
+
if (driver.isWeb && hideScrollbars) await scroller.hideScrollbars()
|
|
56
62
|
}
|
|
57
63
|
|
|
58
64
|
try {
|
|
59
|
-
if (!window) await scrollIntoViewport({
|
|
65
|
+
if (!window) await scrollIntoViewport({context: target.context, region: target.region, scroller, logger})
|
|
60
66
|
|
|
61
67
|
const screenshot =
|
|
62
|
-
fully &&
|
|
63
|
-
? await takeStitchedScreenshot({
|
|
64
|
-
|
|
68
|
+
fully && scroller
|
|
69
|
+
? await takeStitchedScreenshot({
|
|
70
|
+
...target,
|
|
71
|
+
scroller,
|
|
72
|
+
withStatusBar,
|
|
73
|
+
overlap,
|
|
74
|
+
framed,
|
|
75
|
+
wait,
|
|
76
|
+
stabilization,
|
|
77
|
+
debug,
|
|
78
|
+
logger,
|
|
79
|
+
})
|
|
80
|
+
: await takeSimpleScreenshot({...target, scroller, withStatusBar, wait, stabilization, debug, logger})
|
|
65
81
|
|
|
66
82
|
screenshot.image.scale(driver.viewportScale)
|
|
67
83
|
|
|
68
84
|
if (hooks && hooks.afterScreenshot) {
|
|
69
|
-
await hooks.afterScreenshot({driver, scroller
|
|
85
|
+
await hooks.afterScreenshot({driver, scroller, screenshot})
|
|
70
86
|
}
|
|
71
87
|
|
|
72
88
|
return screenshot
|
|
73
89
|
} finally {
|
|
74
|
-
if (
|
|
75
|
-
await
|
|
76
|
-
await
|
|
90
|
+
if (scroller) {
|
|
91
|
+
await scroller.restoreScrollbars()
|
|
92
|
+
await scroller.restoreState()
|
|
77
93
|
}
|
|
78
94
|
|
|
79
95
|
// if there was active element and we have blurred it, then restore focus
|
|
@@ -93,69 +109,4 @@ async function takeScreenshot({
|
|
|
93
109
|
}
|
|
94
110
|
}
|
|
95
111
|
|
|
96
|
-
async function getTarget({window, context, region, fully, scrollingMode, logger}) {
|
|
97
|
-
if (window) {
|
|
98
|
-
// window/app
|
|
99
|
-
const scrollingElement = await context.main.getScrollingElement()
|
|
100
|
-
return {
|
|
101
|
-
context: context.main,
|
|
102
|
-
scroller: scrollingElement ? makeScroller({element: scrollingElement, scrollingMode, logger}) : null,
|
|
103
|
-
}
|
|
104
|
-
} else if (region) {
|
|
105
|
-
if (utils.types.has(region, ['x', 'y', 'width', 'height'])) {
|
|
106
|
-
// region by coordinates
|
|
107
|
-
const scrollingElement = await context.getScrollingElement()
|
|
108
|
-
return {
|
|
109
|
-
context,
|
|
110
|
-
region,
|
|
111
|
-
scroller: scrollingElement ? makeScroller({element: scrollingElement, scrollingMode, logger}) : null,
|
|
112
|
-
}
|
|
113
|
-
} else {
|
|
114
|
-
// region by element or selector
|
|
115
|
-
const element = await context.element(region)
|
|
116
|
-
if (!element) throw new Error('Element not found!')
|
|
117
|
-
|
|
118
|
-
const elementContext = element.context
|
|
119
|
-
|
|
120
|
-
if (fully) {
|
|
121
|
-
const isScrollable = await element.isScrollable()
|
|
122
|
-
// if element is scrollable, then take screenshot of the full element content, otherwise take screenshot of full element
|
|
123
|
-
const region = isScrollable ? null : await element.getRegion()
|
|
124
|
-
const scrollingElement = isScrollable ? element : await elementContext.getScrollingElement()
|
|
125
|
-
// css stitching could be applied only to root element of its context
|
|
126
|
-
scrollingMode = scrollingMode === 'css' && !(await scrollingElement.isRoot()) ? 'mixed+' : scrollingMode
|
|
127
|
-
return {
|
|
128
|
-
context: elementContext,
|
|
129
|
-
region,
|
|
130
|
-
scroller: scrollingElement ? makeScroller({element: scrollingElement, scrollingMode, logger}) : null,
|
|
131
|
-
}
|
|
132
|
-
} else {
|
|
133
|
-
const scrollingElement = await context.getScrollingElement()
|
|
134
|
-
return {
|
|
135
|
-
context: elementContext,
|
|
136
|
-
region: await element.getRegion(),
|
|
137
|
-
scroller: scrollingElement ? makeScroller({element: scrollingElement, scrollingMode, logger}) : null,
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
} else if (!context.isMain) {
|
|
142
|
-
// context
|
|
143
|
-
if (fully) {
|
|
144
|
-
const scrollingElement = await context.getScrollingElement()
|
|
145
|
-
return {
|
|
146
|
-
context,
|
|
147
|
-
scroller: scrollingElement ? makeScroller({logger, element: scrollingElement, scrollingMode}) : null,
|
|
148
|
-
}
|
|
149
|
-
} else {
|
|
150
|
-
const scrollingElement = await context.parent.getScrollingElement()
|
|
151
|
-
const element = await context.getContextElement()
|
|
152
|
-
return {
|
|
153
|
-
context: context.parent,
|
|
154
|
-
region: await element.getRegion(), // IMHO we should use CLIENT (without borders) region here
|
|
155
|
-
scroller: scrollingElement ? makeScroller({logger, element: scrollingElement, scrollingMode}) : null,
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
112
|
module.exports = takeScreenshot
|
|
@@ -163,7 +163,18 @@ function makeTakeNativeScreenshot({driver, stabilization = {}, debug, logger}) {
|
|
|
163
163
|
const viewportSize = await driver.getViewportSize()
|
|
164
164
|
const cropRegion = withStatusBar
|
|
165
165
|
? {x: 0, y: 0, width: viewportSize.width, height: viewportSize.height + driver.statusBarHeight}
|
|
166
|
-
: {
|
|
166
|
+
: {
|
|
167
|
+
top: driver.statusBarHeight,
|
|
168
|
+
bottom: driver.orientation === 'landscape' ? 0 : driver.navigationBarHeight,
|
|
169
|
+
left:
|
|
170
|
+
driver.isAndroid && driver.orientation === 'landscape' && driver.platformVersion > 7
|
|
171
|
+
? driver.navigationBarHeight
|
|
172
|
+
: 0,
|
|
173
|
+
right:
|
|
174
|
+
driver.isAndroid && driver.orientation === 'landscape' && driver.platformVersion < 8
|
|
175
|
+
? driver.navigationBarHeight
|
|
176
|
+
: 0,
|
|
177
|
+
}
|
|
167
178
|
image.crop(cropRegion)
|
|
168
179
|
}
|
|
169
180
|
|
package/CHANGELOG.md
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
# Change Log
|
|
3
|
-
|
|
4
|
-
## Unreleased
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
## 3.3.12 - 2022/3/14
|
|
8
|
-
|
|
9
|
-
- update snippets
|
|
10
|
-
- updated to @applitools/snippets@2.2.2 (from 2.2.1)
|
|
11
|
-
|
|
12
|
-
## 3.3.11 - 2022/3/12
|
|
13
|
-
|
|
14
|
-
- disable scroll to 0,0 before taking stitched screenshot
|
|
15
|
-
- add better error handling when taking a stitched screenshot
|
|
16
|
-
- updated to @applitools/snippets@2.2.1 (from 2.2.0)
|
|
17
|
-
|
|
18
|
-
## 3.3.10 - 2022/2/16
|
|
19
|
-
|
|
20
|
-
- do not perform initial scrolling in `takeStitchedScreenshot`
|
|
21
|
-
|
|
22
|
-
## 3.3.9 - 2022/2/16
|
|
23
|
-
|
|
24
|
-
- remove prevention of translation in `mixed` scrolling mode
|
|
25
|
-
- updated to @applitools/snippets@2.1.15 (from 2.1.14)
|
|
26
|
-
|
|
27
|
-
## 3.3.8 - 2022/2/16
|
|
28
|
-
|
|
29
|
-
- updated to @applitools/snippets@2.1.14 (from 2.1.13)
|
|
30
|
-
|
|
31
|
-
## 3.3.7 - 2022/2/15
|
|
32
|
-
|
|
33
|
-
- fix image scaling on pages without viewport metatag
|
|
34
|
-
- fix safari's viewport detection on iOS devices
|
|
35
|
-
- updated to @applitools/snippets@2.1.13 (from 2.1.12)
|
|
36
|
-
- updated to @applitools/utils@1.2.13 (from 1.2.12)
|
|
37
|
-
|
|
38
|
-
## 3.3.6 - 2022/2/9
|
|
39
|
-
|
|
40
|
-
- fix testing
|
|
41
|
-
- updated to @applitools/utils@1.2.12 (from 1.2.11)
|
|
42
|
-
|
|
43
|
-
## 3.3.5 - 2022/2/8
|
|
44
|
-
|
|
45
|
-
- add "files" field to the package.json to avoid unnecessary files to be published
|
|
46
|
-
- updated to @applitools/utils@1.2.11 (from 1.2.5)
|
|
47
|
-
|
|
48
|
-
## 3.3.4 - 2021/12/23
|
|
49
|
-
|
|
50
|
-
- updated to @applitools/snippets@2.1.12 (from 2.1.11)
|
|
51
|
-
|
|
52
|
-
## 3.3.3 - 2021/12/22
|
|
53
|
-
|
|
54
|
-
- improve default rotation and scaling logic
|
|
55
|
-
- improve scroll into viewport algorithm
|
|
56
|
-
- fix lazy handling of image rotation
|
|
57
|
-
- updated to @applitools/snippets@2.1.11 (from 2.1.10)
|
|
58
|
-
- updated to @applitools/utils@1.2.5 (from 1.2.4)
|
|
59
|
-
|
|
60
|
-
## 3.3.2 - 2021/12/20
|
|
61
|
-
|
|
62
|
-
- add basic support of webview screenshots on ios
|
|
63
|
-
- updated to @applitools/snippets@2.1.10 (from 2.1.8)
|
|
64
|
-
|
|
65
|
-
## 3.3.1 - 2021/12/17
|
|
66
|
-
|
|
67
|
-
- no changes
|
|
68
|
-
|
|
69
|
-
## 3.3.0 - 2021/12/16
|
|
70
|
-
|
|
71
|
-
- fix ios web screenshots on pages without viewport meta tag
|
|
72
|
-
- improve native apps support
|
|
73
|
-
- updated to @applitools/snippets@2.1.8 (from 2.1.7)
|
|
74
|
-
|
|
75
|
-
## 3.2.9 - 2021/11/14
|
|
76
|
-
|
|
77
|
-
- add support of scrollable elements that change its size during scrolling
|
|
78
|
-
|
|
79
|
-
## 3.2.8 - 2021/10/30
|
|
80
|
-
|
|
81
|
-
- updated to @applitools/utils@1.2.4 (from 1.2.3)
|
|
82
|
-
|
|
83
|
-
## 3.2.7 - 2021/10/13
|
|
84
|
-
|
|
85
|
-
- handle a case when scrolling element does not exist
|
|
86
|
-
|
|
87
|
-
## 3.2.6 - 2021/10/12
|
|
88
|
-
|
|
89
|
-
- handle a case when scrolling element does not exist
|
|
90
|
-
|
|
91
|
-
## 3.2.5 - 2021/10/5
|
|
92
|
-
|
|
93
|
-
- fix issue with fractional image size after scaling
|
|
94
|
-
|
|
95
|
-
## 3.2.4 - 2021/9/9
|
|
96
|
-
|
|
97
|
-
- handle selectors that evaluate to elements from a different context
|
|
98
|
-
- updated to @applitools/snippets@2.1.7 (from 2.1.4)
|
|
99
|
-
- updated to @applitools/utils@1.2.3 (from 1.2.2)
|
|
100
|
-
|
|
101
|
-
## 3.2.3 - 2021/8/13
|
|
102
|
-
|
|
103
|
-
- remove base64 sanitizing
|
|
104
|
-
|
|
105
|
-
## 3.2.2 - 2021/8/13
|
|
106
|
-
|
|
107
|
-
- add `withStatusBar` capability property to take app and full app screenshots with status bar
|
|
108
|
-
- fix ios web screenshots
|
|
109
|
-
|
|
110
|
-
## 3.2.1 - 2021/8/8
|
|
111
|
-
|
|
112
|
-
- no changes
|
|
113
|
-
|
|
114
|
-
## 3.2.0 - 2021/8/7
|
|
115
|
-
|
|
116
|
-
- change image processing order and improve general algorithm
|
|
117
|
-
- updated to @applitools/utils@1.2.2 (from 1.2.1)
|
|
118
|
-
|
|
119
|
-
## 3.1.0 - 2021/8/4
|
|
120
|
-
|
|
121
|
-
- improve support of native devices
|
|
122
|
-
- updated to @applitools/snippets@2.1.4 (from 2.1.3)
|
|
123
|
-
- updated to @applitools/utils@1.2.1 (from 1.2.0)
|
|
124
|
-
|
|
125
|
-
## 3.0.8 - 2021/5/24
|
|
126
|
-
|
|
127
|
-
- updated to @applitools/utils@1.2.0 (from 1.1.3)
|
|
128
|
-
|
|
129
|
-
## 3.0.7 - 2021/5/13
|
|
130
|
-
|
|
131
|
-
- fixed image cropping algorithm to not copy data into a heap
|
|
132
|
-
- optimized image rotation and image copping algorithms
|
|
133
|
-
|
|
134
|
-
## 3.0.6 - 2021/5/11
|
|
135
|
-
|
|
136
|
-
- updated to @applitools/utils@1.1.3 (from 1.0.1)
|
|
137
|
-
|
|
138
|
-
## 3.0.5 - 2021/2/18
|
|
139
|
-
|
|
140
|
-
- fix bug with wrong stitching due to fractional offset
|
|
141
|
-
|
|
142
|
-
## 3.0.4 - 2021/2/15
|
|
143
|
-
|
|
144
|
-
- fix scaling issue
|
|
145
|
-
- handle firefox buggy versions
|
|
146
|
-
|
|
147
|
-
## 3.0.3 - 2021/1/27
|
|
148
|
-
|
|
149
|
-
- no changes
|
|
150
|
-
- updated to @applitools/utils@1.0.1 (from 1.0.0)
|
|
151
|
-
- updated to @applitools/utils@1.0.1 (from 1.0.0)
|
|
152
|
-
## 3.0.2 - 2021/1/27
|
|
153
|
-
|
|
154
|
-
- no changes
|
|
155
|
-
## 3.0.1 - 2021/1/27
|
|
156
|
-
- no changes
|
|
157
|
-
## 3.0.0 - 2021/1/26
|
|
158
|
-
|
|
159
|
-
- `crop`, `scale` and `rotate` now should be placed in `stabilization` object
|
|
160
|
-
- rename `context` to `frames`
|
|
161
|
-
- rename `isFully` to `fully`
|
|
162
|
-
- integrate dom-capture
|
|
163
|
-
- chore: add husky
|
|
164
|
-
- fix bug when screenshots on iPad were taken with Safari navigation bar and iOS status bar
|
|
165
|
-
|
|
166
|
-
## 2.1.1 - 2021/1/15
|
|
167
|
-
|
|
168
|
-
- fix bug when `toPng` method returns empty buffer
|
|
169
|
-
- fix bug when `toPng` method returns empty buffer
|
|
170
|
-
## 2.1.0 - 2021/1/15
|
|
171
|
-
|
|
172
|
-
- remove native module dependency (`sharp`)
|
|
173
|
-
|
|
174
|
-
## 2.0.0 - 2021/1/7
|
|
175
|
-
|
|
176
|
-
- return image location relative to viewport
|
|
177
|
-
- return image location relative to viewport
|
|
178
|
-
## 1.0.2 - 2020/12/29
|
|
179
|
-
|
|
180
|
-
- fix saveScreenshot
|
|
181
|
-
## 1.0.1 - 2020/12/1
|
|
182
|
-
|
|
183
|
-
- round coordinate and size before image operations
|
|
184
|
-
|
|
185
|
-
## 1.0.0 - 2020/12/1
|
|
186
|
-
|
|
187
|
-
- Provide functionality to take screenshots (viewport and full) using Applitools driver wrapper
|