@wdio/visual-service 8.0.3 โ 9.0.0
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 +141 -0
- package/dist/contextManager.d.ts +1 -1
- package/dist/contextManager.d.ts.map +1 -1
- package/dist/contextManager.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/reporter.js +1 -1
- package/dist/service.d.ts +1 -1
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +38 -72
- package/dist/storybook/Types.d.ts +1 -1
- package/dist/storybook/Types.d.ts.map +1 -1
- package/dist/storybook/launcher.d.ts +2 -2
- package/dist/storybook/launcher.d.ts.map +1 -1
- package/dist/storybook/launcher.js +1 -1
- package/dist/storybook/utils.d.ts +1 -1
- package/dist/storybook/utils.d.ts.map +1 -1
- package/dist/types.d.ts +21 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +2 -6
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +16 -32
- package/dist/wrapWithContext.d.ts.map +1 -1
- package/dist/wrapWithContext.js +2 -2
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,146 @@
|
|
|
1
1
|
# @wdio/visual-service
|
|
2
2
|
|
|
3
|
+
## 9.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 1326e99: ## ๐ฅ Major Release: New @wdio/image-comparison-core Package
|
|
8
|
+
|
|
9
|
+
### ๐๏ธ Architectural Refactor
|
|
10
|
+
|
|
11
|
+
This release introduces a **completely new core architecture** with the dedicated `@wdio/image-comparison-core` package, replacing the generic `webdriver-image-comparison` module with a WDIO-specific solution.
|
|
12
|
+
|
|
13
|
+
#### What was the problem?
|
|
14
|
+
|
|
15
|
+
- The old `webdriver-image-comparison` package was designed for generic webdriver usage
|
|
16
|
+
- Complex integration between generic and WDIO-specific code
|
|
17
|
+
- Limited test coverage (~58%) making maintenance difficult
|
|
18
|
+
- Mixed responsibilities between core logic and service integration
|
|
19
|
+
|
|
20
|
+
#### What changed?
|
|
21
|
+
|
|
22
|
+
โ
**New dedicated core package**: `@wdio/image-comparison-core` - purpose-built for WebdriverIO
|
|
23
|
+
โ
**Cleaner architecture**: Modular design with clear separation of concerns
|
|
24
|
+
โ
**Enhanced test coverage**: Improved from ~58% to ~90% across all metrics
|
|
25
|
+
โ
**Better maintainability**: Organized codebase with comprehensive TypeScript interfaces
|
|
26
|
+
โ
**WDIO-specific dependencies**: Only depends on `@wdio/logger`, `@wdio/types`, etc.
|
|
27
|
+
|
|
28
|
+
### ๐งช Testing Improvements
|
|
29
|
+
|
|
30
|
+
- **100% branch coverage** on critical decision points
|
|
31
|
+
- **Comprehensive unit tests** for all major functions
|
|
32
|
+
- **Optimized mocks** for complex scenarios
|
|
33
|
+
- **Better test isolation** and reliability
|
|
34
|
+
|
|
35
|
+
| Before/After | % Stmts | % Branch | % Funcs | % Lines |
|
|
36
|
+
| ------------------ | ------- | -------- | ------- | ------- |
|
|
37
|
+
| **Previous** | 58.59 | 91.4 | 80.71 | 58.59 |
|
|
38
|
+
| **After refactor** | 90.55 | 96.38 | 93.99 | 90.55 |
|
|
39
|
+
|
|
40
|
+
### ๐ง Service Integration
|
|
41
|
+
|
|
42
|
+
The `@wdio/visual-service` now imports from the new `@wdio/image-comparison-core` package while maintaining the same public API and functionality for users.
|
|
43
|
+
|
|
44
|
+
### ๐ Performance & Quality
|
|
45
|
+
|
|
46
|
+
- **Modular architecture**: Easier to maintain and extend
|
|
47
|
+
- **Type safety**: Comprehensive TypeScript coverage
|
|
48
|
+
- **Clean exports**: Well-defined public API
|
|
49
|
+
- **Internal interfaces**: Proper separation of concerns
|
|
50
|
+
|
|
51
|
+
### ๐ Backward Compatibility
|
|
52
|
+
|
|
53
|
+
โ
**No breaking changes** for end users
|
|
54
|
+
โ
**Same public API** maintained
|
|
55
|
+
โ
**Existing configurations** continue to work
|
|
56
|
+
โ
**All existing functionality** preserved
|
|
57
|
+
|
|
58
|
+
### ๐ฏ Future Benefits
|
|
59
|
+
|
|
60
|
+
This refactor sets the foundation for:
|
|
61
|
+
|
|
62
|
+
- Easier addition of new features
|
|
63
|
+
- Better bug fixing capabilities
|
|
64
|
+
- Enhanced mobile and native app support
|
|
65
|
+
- More reliable MultiRemote functionality
|
|
66
|
+
|
|
67
|
+
### ๐ฆ Dependency Updates
|
|
68
|
+
|
|
69
|
+
- Updated most dependencies to their latest versions
|
|
70
|
+
- Improved security with latest package versions
|
|
71
|
+
- Better compatibility with current WebdriverIO ecosystem
|
|
72
|
+
- Enhanced performance through updated dependencies
|
|
73
|
+
|
|
74
|
+
***
|
|
75
|
+
|
|
76
|
+
**Note**: This is an architectural improvement that modernizes the codebase while maintaining full backward compatibility. All existing functionality remains unchanged for users.
|
|
77
|
+
|
|
78
|
+
***
|
|
79
|
+
|
|
80
|
+
### Patch Changes
|
|
81
|
+
|
|
82
|
+
- be4272c: fix: [983](#983) in multiremote, commands are now executed on the requested instances
|
|
83
|
+
- Updated dependencies [74df53b]
|
|
84
|
+
- Updated dependencies [1326e99]
|
|
85
|
+
- @wdio/image-comparison-core@1.0.0
|
|
86
|
+
|
|
87
|
+
## Committers: 2
|
|
88
|
+
|
|
89
|
+
- P-Courteille ([@P-Courteille](https://github.com/P-Courteille))
|
|
90
|
+
- Wim Selles ([@wswebcreation](https://github.com/wswebcreation))
|
|
91
|
+
|
|
92
|
+
## 8.0.4
|
|
93
|
+
|
|
94
|
+
### Patch Changes
|
|
95
|
+
|
|
96
|
+
- d88d8dd: Optimize Mobile and Emulated device support
|
|
97
|
+
|
|
98
|
+
## ๐ Bugfixes
|
|
99
|
+
|
|
100
|
+
### #969 Fix layer injection on mobile devices
|
|
101
|
+
|
|
102
|
+
On some devices the layer injection, to determine the exact position of the webview, was failing. It exceeded the appium timeout and returned an error like
|
|
103
|
+
|
|
104
|
+
```logs
|
|
105
|
+
[1] [0-0] 2025-05-23T08:04:11.788Z INFO webdriver: COMMAND getUrl()
|
|
106
|
+
[1] [0-0] 2025-05-23T08:04:11.789Z INFO webdriver: [GET] https://hub-cloud.browserstack.com/wd/hub/session/xxxxx/url
|
|
107
|
+
[1] [0-0] 2025-05-23T08:04:12.036Z INFO webdriver: RESULT about:blank
|
|
108
|
+
[1] [0-0] 2025-05-23T08:04:12.038Z INFO webdriver: COMMAND navigateTo("data:text/html;base64,CiAgICAgICAgPG .... LONG LIST OF CHARACTERS=")
|
|
109
|
+
[1] [0-0] 2025-05-23T08:04:12.038Z INFO webdriver: [POST] https://hub-cloud.browserstack.com/wd/hub/session/xxxx/url
|
|
110
|
+
[1] [0-0] 2025-05-23T08:04:12.038Z INFO webdriver: DATA {
|
|
111
|
+
[1] [0-0] url: 'data:text/html;base64,CiAgICAgICAgPGh0bWw.... LONG LIST OF CHARACTERS='
|
|
112
|
+
[1] [0-0] }
|
|
113
|
+
[1] [0-0] 2025-05-23T08:05:42.132Z ERROR @wdio/utils:shim: Error: WebDriverError: The operation was aborted due to timeout when running "url" with method "POST" and args "{"url":"data:text/html;base64,CiAgICAgICAgPGh0b.... LONG LIST OF CHARACTERS="}"
|
|
114
|
+
[1] [0-0] at FetchRequest._libRequest (file:///xxxxxxx/node_modules/webdriver/build/node.js:1836:13)
|
|
115
|
+
[1] [0-0] 2025-05-23T08:05:42.132Z DEBUG @wdio/utils:shim: Finished to run "before" hook in 91147ms
|
|
116
|
+
[1] [0-0] at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
|
|
117
|
+
[1] [0-0] at async FetchRequest._request (file:///C:/xxxxxx/node_modules/webdriver/build/node.js:1846:20)
|
|
118
|
+
[1] [0-0] at Browser.wrapCommandFn (c:/Projects/xxxxxx/node_modules/@wdio/utils/build/index.js:907:23)
|
|
119
|
+
[1] [0-0] at Browser.url (c:/Projects/xxxxxxx/node_modules/webdriverio/build/node.js:5682:3)
|
|
120
|
+
[1] [0-0] at Browser.wrapCommandFn (c:/Projects/xxxxxx/node_modules/@wdio/utils/build/index.js:907:23)
|
|
121
|
+
[1] [0-0] at async loadBase64Html (file:///C:/Projects/xxxxxx/node_modules/webdriver-image-comparison/dist/helpers/utils.js:377:5)
|
|
122
|
+
[1] [0-0] at async getMobileViewPortPosition (file:///C:/Projects/xxxxxx/node_modules/webdriver-image-comparison/dist/helpers/utils.js:417:9)
|
|
123
|
+
[1] [0-0] at async getMobileInstanceData (file:///C:/Projects/xxxxxx/node_modules/@wdio/visual-service/dist/utils.js:58:28)
|
|
124
|
+
[1] [0-0] at async getInstanceData (file:///C:/Projects/xxxxxxx/node_modules/@wdio/visual-service/dist/utils.js:189:77)
|
|
125
|
+
[1] [0-0] 2025-05-23T08:05:42.144Z INFO @wdio/browserstack-service: Update job with sessionId xxxxx
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
This was caused by the `await url(`data:text/html;base64,${base64Html}`)` that injected the layer. Some browsers couldn't handle the `data:text/html;base64`.
|
|
129
|
+
|
|
130
|
+
We now fixed that with a different injection. It was tested on Android/iOS and on Sims/Emus/Real Devices and it worked
|
|
131
|
+
|
|
132
|
+
### Improve determining if a device is emulated
|
|
133
|
+
|
|
134
|
+
In a previous release we added a function to determine if a device was emulated. This resulted in incorrect screen sizes that were used for the files names for devices. This caused or failing baselines, or new files to be created because the screen sizes were not available
|
|
135
|
+
We now improved the check and the correct screen sizes are added again to the file names and made sure that the previous generated base line could be used again.
|
|
136
|
+
|
|
137
|
+
## Committers: 1
|
|
138
|
+
|
|
139
|
+
- Wim Selles ([@wswebcreation](https://github.com/wswebcreation))
|
|
140
|
+
|
|
141
|
+
- Updated dependencies [d88d8dd]
|
|
142
|
+
- webdriver-image-comparison@9.0.4
|
|
143
|
+
|
|
3
144
|
## 8.0.3
|
|
4
145
|
|
|
5
146
|
### Patch Changes
|
package/dist/contextManager.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextManager.d.ts","sourceRoot":"","sources":["../src/contextManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"contextManager.d.ts","sourceRoot":"","sources":["../src/contextManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAMnE,qBAAa,cAAc;;IAKvB,OAAO,CAAC,cAAc,CAAsC;gBAEhD,OAAO,EAAE,WAAW,CAAC,OAAO;IAOxC,kBAAkB,IAAI,gBAAgB;IAItC,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAKpD,IAAI,OAAO,IAAI,WAAW,CAAC,OAAO,CAEjC;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,aAAa,IAAI,IAAI;IAIrB,iBAAiB,CAAC,OAAO,EAAE,MAAM;IAO3B,iBAAiB;IAIvB,IAAI,eAAe,YAElB;CA0BJ"}
|
package/dist/contextManager.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import logger from '@wdio/logger';
|
|
2
|
-
import { DEVICE_RECTANGLES } from '
|
|
2
|
+
import { DEVICE_RECTANGLES } from '@wdio/image-comparison-core';
|
|
3
3
|
import { getNativeContext } from './utils.js';
|
|
4
4
|
const log = logger('@wdio/visual-service:ContextManager');
|
|
5
5
|
export class ContextManager {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { WicElement } from '
|
|
1
|
+
import type { WicElement } from '@wdio/image-comparison-core';
|
|
2
2
|
import WdioImageComparisonService from './service.js';
|
|
3
3
|
import VisualLauncher from './storybook/launcher.js';
|
|
4
4
|
import type { Output, Result, VisualServiceOptions, WdioCheckFullPageMethodOptions, WdioSaveFullPageMethodOptions, WdioSaveElementMethodOptions, WdioSaveScreenMethodOptions, WdioCheckElementMethodOptions, WdioCheckScreenMethodOptions } from './types.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/reporter.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import logger from '@wdio/logger';
|
|
4
|
-
const log = logger('@wdio/visual-service:
|
|
4
|
+
const log = logger('@wdio/visual-service:reporter');
|
|
5
5
|
class VisualReportGenerator {
|
|
6
6
|
directoryPath;
|
|
7
7
|
constructor({ directoryPath }) {
|
package/dist/service.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Frameworks } from '@wdio/types';
|
|
2
|
-
import { BaseClass } from '
|
|
2
|
+
import { BaseClass } from '@wdio/image-comparison-core';
|
|
3
3
|
import type { VisualServiceOptions } from './types.js';
|
|
4
4
|
import { ContextManager } from './contextManager.js';
|
|
5
5
|
export default class WdioImageComparisonService extends BaseClass {
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EACH,SAAS,EAWZ,MAAM,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,EACH,SAAS,EAWZ,MAAM,6BAA6B,CAAA;AAiBpC,OAAO,KAAK,EAAc,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAepD,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;;IAM7D,OAAO,CAAC,eAAe,CAAC,CAAgB;IACxC,OAAO,CAAC,gBAAgB,CAAC,CAAyC;gBAEtD,OAAO,EAAE,oBAAoB,EAAE,CAAC,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM;IAMlG;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB;IAIzE,MAAM,CACR,YAAY,EAAE,WAAW,CAAC,YAAY,EACtC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,kBAAkB;IAgC3D,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI;IAOtC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK;IA4ZtC,IAAI,cAAc,IAAI,cAAc,CAKnC;CAyCJ"}
|
package/dist/service.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import logger from '@wdio/logger';
|
|
2
2
|
import { expect } from '@wdio/globals';
|
|
3
3
|
import { dirname, normalize, resolve } from 'node:path';
|
|
4
|
-
import { BaseClass, checkElement, checkFullPageScreen, checkScreen, saveElement, saveFullPageScreen, saveScreen, saveTabbablePage, checkTabbablePage, FOLDERS, DEFAULT_TEST_CONTEXT, } from '
|
|
4
|
+
import { BaseClass, checkElement, checkFullPageScreen, checkScreen, saveElement, saveFullPageScreen, saveScreen, saveTabbablePage, checkTabbablePage, FOLDERS, DEFAULT_TEST_CONTEXT, } from '@wdio/image-comparison-core';
|
|
5
5
|
import { SevereServiceError } from 'webdriverio';
|
|
6
|
-
import { enrichTestContext, getFolders, getInstanceData, getNativeContext,
|
|
6
|
+
import { enrichTestContext, getFolders, getInstanceData, getNativeContext, } from './utils.js';
|
|
7
7
|
import { toMatchScreenSnapshot, toMatchFullPageSnapshot, toMatchElementSnapshot, toMatchTabbablePageSnapshot } from './matcher.js';
|
|
8
8
|
import { waitForStorybookComponentToBeLoaded } from './storybook/utils.js';
|
|
9
9
|
import { PAGE_OPTIONS_MAP } from './constants.js';
|
|
@@ -98,6 +98,14 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
98
98
|
async #extendMultiremoteBrowser(capabilities) {
|
|
99
99
|
const browser = this.#browser;
|
|
100
100
|
const browserNames = Object.keys(capabilities);
|
|
101
|
+
/**
|
|
102
|
+
* Add all the commands to the global browser object that will execute
|
|
103
|
+
* on each browser in the Multi Remote
|
|
104
|
+
* Start with the page commands
|
|
105
|
+
*/
|
|
106
|
+
for (const [commandName, command] of Object.entries(pageCommands)) {
|
|
107
|
+
this.#addMultiremoteCommand(browser, browserNames, commandName, command);
|
|
108
|
+
}
|
|
101
109
|
/**
|
|
102
110
|
* Add all the commands to each browser in the Multi Remote
|
|
103
111
|
*/
|
|
@@ -108,14 +116,6 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
108
116
|
this._contextManagers?.set(browserName, contextManager);
|
|
109
117
|
await this.#addCommandsToBrowser(browserInstance);
|
|
110
118
|
}
|
|
111
|
-
/**
|
|
112
|
-
* Add all the commands to the global browser object that will execute
|
|
113
|
-
* on each browser in the Multi Remote
|
|
114
|
-
* Start with the page commands
|
|
115
|
-
*/
|
|
116
|
-
for (const [commandName, command] of Object.entries(pageCommands)) {
|
|
117
|
-
this.#addMultiremoteCommand(browser, browserNames, commandName, command);
|
|
118
|
-
}
|
|
119
119
|
/**
|
|
120
120
|
* Add all the element commands to the global browser object that will execute
|
|
121
121
|
* on each browser in the Multi Remote
|
|
@@ -127,33 +127,33 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
127
127
|
/**
|
|
128
128
|
* Add commands to the "normal" browser object
|
|
129
129
|
*/
|
|
130
|
-
async #addCommandsToBrowser(
|
|
131
|
-
this._contextManager = new ContextManager(
|
|
132
|
-
|
|
130
|
+
async #addCommandsToBrowser(browserInstance) {
|
|
131
|
+
this._contextManager = new ContextManager(browserInstance);
|
|
132
|
+
browserInstance.visualService = this;
|
|
133
133
|
const instanceData = await getInstanceData({
|
|
134
|
-
|
|
134
|
+
browserInstance,
|
|
135
135
|
initialDeviceRectangles: this._contextManager.getViewportContext(),
|
|
136
136
|
isNativeContext: this._contextManager.isNativeContext,
|
|
137
137
|
});
|
|
138
138
|
// Update the context manager with the current viewport
|
|
139
139
|
this._contextManager.setViewPortContext(instanceData.deviceRectangles);
|
|
140
140
|
for (const [commandName, command] of Object.entries(elementCommands)) {
|
|
141
|
-
this.#addElementCommand(
|
|
141
|
+
this.#addElementCommand(browserInstance, commandName, command, instanceData);
|
|
142
142
|
}
|
|
143
143
|
for (const [commandName, command] of Object.entries(pageCommands)) {
|
|
144
|
-
this.#addPageCommand(
|
|
144
|
+
this.#addPageCommand(browserInstance, commandName, command, instanceData);
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
/**
|
|
148
148
|
* Add new element commands to the browser object
|
|
149
149
|
*/
|
|
150
|
-
#addElementCommand(
|
|
150
|
+
#addElementCommand(browserInstance, commandName, command, initialInstanceData) {
|
|
151
151
|
log.info(`Adding element command "${commandName}" to browser object`);
|
|
152
152
|
const elementOptionsKey = commandName === 'saveElement' ? 'saveElementOptions' : 'checkElementOptions';
|
|
153
153
|
const self = this;
|
|
154
|
-
|
|
154
|
+
browserInstance.addCommand(commandName, function (element, tag, elementOptions = {}) {
|
|
155
155
|
const wrapped = wrapWithContext({
|
|
156
|
-
|
|
156
|
+
browserInstance,
|
|
157
157
|
command,
|
|
158
158
|
contextManager: self.contextManager,
|
|
159
159
|
getArgs: () => {
|
|
@@ -163,25 +163,16 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
163
163
|
};
|
|
164
164
|
const isCurrentContextNative = self.contextManager.isNativeContext;
|
|
165
165
|
return [{
|
|
166
|
-
|
|
167
|
-
bidiScreenshot: isBiDiScreenshotSupported(browser) ? this.browsingContextCaptureScreenshot.bind(browser) : undefined,
|
|
168
|
-
executor: (fn, ...args) => {
|
|
169
|
-
return this.execute(fn, ...args);
|
|
170
|
-
},
|
|
171
|
-
getElementRect: this.getElementRect.bind(this),
|
|
172
|
-
getWindowHandle: this.getWindowHandle.bind(browser),
|
|
173
|
-
screenShot: this.takeScreenshot.bind(this),
|
|
174
|
-
takeElementScreenshot: this.takeElementScreenshot.bind(this),
|
|
175
|
-
},
|
|
176
|
-
instanceData: updatedInstanceData,
|
|
177
|
-
folders: getFolders(elementOptions, self.folders, self.#getBaselineFolder()),
|
|
166
|
+
browserInstance,
|
|
178
167
|
element,
|
|
168
|
+
folders: getFolders(elementOptions, self.folders, self.#getBaselineFolder()),
|
|
169
|
+
instanceData: updatedInstanceData,
|
|
170
|
+
isNativeContext: isCurrentContextNative,
|
|
179
171
|
tag,
|
|
180
172
|
[elementOptionsKey]: {
|
|
181
173
|
wic: self.defaultOptions,
|
|
182
174
|
method: elementOptions,
|
|
183
175
|
},
|
|
184
|
-
isNativeContext: isCurrentContextNative,
|
|
185
176
|
testContext: enrichTestContext({
|
|
186
177
|
commandName,
|
|
187
178
|
currentTestContext: self.#testContext,
|
|
@@ -197,17 +188,17 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
197
188
|
/**
|
|
198
189
|
* Add new page commands to the browser object
|
|
199
190
|
*/
|
|
200
|
-
#addPageCommand(
|
|
191
|
+
#addPageCommand(browserInstance, commandName, command, initialInstanceData) {
|
|
201
192
|
log.info(`Adding browser command "${commandName}" to browser object`);
|
|
202
193
|
const self = this;
|
|
203
194
|
const pageOptionsKey = PAGE_OPTIONS_MAP[commandName];
|
|
204
195
|
if (commandName === 'waitForStorybookComponentToBeLoaded') {
|
|
205
|
-
|
|
196
|
+
browserInstance.addCommand(commandName, (options) => waitForStorybookComponentToBeLoaded(options));
|
|
206
197
|
return;
|
|
207
198
|
}
|
|
208
|
-
|
|
199
|
+
browserInstance.addCommand(commandName, function (tag, pageOptions = {}) {
|
|
209
200
|
const wrapped = wrapWithContext({
|
|
210
|
-
|
|
201
|
+
browserInstance,
|
|
211
202
|
command,
|
|
212
203
|
contextManager: self.contextManager,
|
|
213
204
|
getArgs: () => {
|
|
@@ -217,23 +208,15 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
217
208
|
};
|
|
218
209
|
const isCurrentContextNative = self.contextManager.isNativeContext;
|
|
219
210
|
return [{
|
|
220
|
-
|
|
221
|
-
bidiScreenshot: isBiDiScreenshotSupported(browser) ? this.browsingContextCaptureScreenshot.bind(browser) : undefined,
|
|
222
|
-
executor: (fn, ...args) => {
|
|
223
|
-
return this.execute(fn, ...args);
|
|
224
|
-
},
|
|
225
|
-
getElementRect: this.getElementRect.bind(browser),
|
|
226
|
-
getWindowHandle: this.getWindowHandle.bind(browser),
|
|
227
|
-
screenShot: this.takeScreenshot.bind(browser),
|
|
228
|
-
},
|
|
229
|
-
instanceData: updatedInstanceData,
|
|
211
|
+
browserInstance,
|
|
230
212
|
folders: getFolders(pageOptions, self.folders, self.#getBaselineFolder()),
|
|
213
|
+
instanceData: updatedInstanceData,
|
|
214
|
+
isNativeContext: isCurrentContextNative,
|
|
231
215
|
tag,
|
|
232
216
|
[pageOptionsKey]: {
|
|
233
217
|
wic: self.defaultOptions,
|
|
234
218
|
method: pageOptions,
|
|
235
219
|
},
|
|
236
|
-
isNativeContext: isCurrentContextNative,
|
|
237
220
|
testContext: enrichTestContext({
|
|
238
221
|
commandName,
|
|
239
222
|
currentTestContext: self.#testContext,
|
|
@@ -260,12 +243,12 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
260
243
|
}
|
|
261
244
|
const isNativeContext = contextManager.isNativeContext;
|
|
262
245
|
const initialInstanceData = await getInstanceData({
|
|
263
|
-
|
|
246
|
+
browserInstance: browserInstance,
|
|
264
247
|
initialDeviceRectangles: contextManager.getViewportContext(),
|
|
265
248
|
isNativeContext
|
|
266
249
|
});
|
|
267
250
|
const wrapped = wrapWithContext({
|
|
268
|
-
|
|
251
|
+
browserInstance,
|
|
269
252
|
command,
|
|
270
253
|
contextManager,
|
|
271
254
|
getArgs: () => {
|
|
@@ -274,16 +257,7 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
274
257
|
deviceRectangles: contextManager.getViewportContext(),
|
|
275
258
|
};
|
|
276
259
|
return [{
|
|
277
|
-
|
|
278
|
-
bidiScreenshot: isBiDiScreenshotSupported(browserInstance) ? browserInstance.browsingContextCaptureScreenshot.bind(browserInstance) : undefined,
|
|
279
|
-
executor: (fn, ...args) => {
|
|
280
|
-
return browserInstance.execute(fn, ...args);
|
|
281
|
-
},
|
|
282
|
-
getElementRect: browserInstance.getElementRect.bind(browserInstance),
|
|
283
|
-
getWindowHandle: browserInstance.getWindowHandle.bind(browserInstance),
|
|
284
|
-
screenShot: browserInstance.takeScreenshot.bind(browserInstance),
|
|
285
|
-
takeElementScreenshot: browserInstance.takeElementScreenshot.bind(browserInstance),
|
|
286
|
-
},
|
|
260
|
+
browserInstance,
|
|
287
261
|
instanceData: updatedInstanceData,
|
|
288
262
|
folders: getFolders(elementOptions, self.folders, self.#getBaselineFolder()),
|
|
289
263
|
tag,
|
|
@@ -328,12 +302,12 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
328
302
|
isMobile: browserInstance.isMobile,
|
|
329
303
|
});
|
|
330
304
|
const initialInstanceData = await getInstanceData({
|
|
331
|
-
|
|
305
|
+
browserInstance: browserInstance,
|
|
332
306
|
initialDeviceRectangles: contextManager.getViewportContext(),
|
|
333
307
|
isNativeContext
|
|
334
308
|
});
|
|
335
309
|
const wrapped = wrapWithContext({
|
|
336
|
-
|
|
310
|
+
browserInstance,
|
|
337
311
|
command,
|
|
338
312
|
contextManager,
|
|
339
313
|
getArgs: () => {
|
|
@@ -343,23 +317,15 @@ export default class WdioImageComparisonService extends BaseClass {
|
|
|
343
317
|
};
|
|
344
318
|
const isCurrentContextNative = contextManager.isNativeContext;
|
|
345
319
|
return [{
|
|
346
|
-
|
|
347
|
-
bidiScreenshot: isBiDiScreenshotSupported(browserInstance) ? browserInstance.browsingContextCaptureScreenshot.bind(browserInstance) : undefined,
|
|
348
|
-
executor: (fn, ...args) => {
|
|
349
|
-
return browserInstance.execute(fn, ...args);
|
|
350
|
-
},
|
|
351
|
-
getElementRect: browserInstance.getElementRect.bind(browserInstance),
|
|
352
|
-
getWindowHandle: browserInstance.getWindowHandle.bind(browserInstance),
|
|
353
|
-
screenShot: browserInstance.takeScreenshot.bind(browserInstance),
|
|
354
|
-
},
|
|
355
|
-
instanceData: updatedInstanceData,
|
|
320
|
+
browserInstance,
|
|
356
321
|
folders: getFolders(pageOptions, self.folders, self.#getBaselineFolder()),
|
|
322
|
+
instanceData: updatedInstanceData,
|
|
323
|
+
isNativeContext: isCurrentContextNative,
|
|
357
324
|
tag,
|
|
358
325
|
[pageOptionsKey]: {
|
|
359
326
|
wic: self.defaultOptions,
|
|
360
327
|
method: pageOptions,
|
|
361
328
|
},
|
|
362
|
-
isNativeContext: isCurrentContextNative,
|
|
363
329
|
testContext: enrichTestContext({
|
|
364
330
|
commandName,
|
|
365
331
|
currentTestContext: self.#testContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../src/storybook/Types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../src/storybook/Types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Capabilities } from '@wdio/types';
|
|
2
|
-
import type { ClassOptions } from '
|
|
3
|
-
import { BaseClass } from '
|
|
2
|
+
import type { ClassOptions } from '@wdio/image-comparison-core';
|
|
3
|
+
import { BaseClass } from '@wdio/image-comparison-core';
|
|
4
4
|
export default class VisualLauncher extends BaseClass {
|
|
5
5
|
#private;
|
|
6
6
|
constructor(options: ClassOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/storybook/launcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/storybook/launcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,6BAA6B,CAAA;AAC3F,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAevD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,SAAS;;gBAGrC,OAAO,EAAE,YAAY;IAK3B,SAAS,CAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC,sBAAsB;IA+FxF,UAAU;CAuBnB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { rmdirSync } from 'node:fs';
|
|
2
2
|
import logger from '@wdio/logger';
|
|
3
3
|
import { SevereServiceError } from 'webdriverio';
|
|
4
|
-
import { BaseClass } from '
|
|
4
|
+
import { BaseClass } from '@wdio/image-comparison-core';
|
|
5
5
|
import { createStorybookCapabilities, createTestFiles, getArgvValue, isCucumberFramework, isStorybookMode, parseSkipStories, scanStorybook, } from './utils.js';
|
|
6
6
|
import { CLIP_SELECTOR, NUM_SHARDS, V6_CLIP_SELECTOR } from '../constants.js';
|
|
7
7
|
import generateVisualReport from '../reporter.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Options } from '@wdio/types';
|
|
2
|
-
import type { ClassOptions } from '
|
|
2
|
+
import type { ClassOptions } from '@wdio/image-comparison-core';
|
|
3
3
|
import type { CategoryComponent, CreateItContent, CreateTestContent, CreateTestFileOptions, ScanStorybookReturnData, Stories, EmulatedDeviceType, CapabilityMap, WaitForStorybookComponentToBeLoaded } from './Types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Check if we run for Storybook
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/storybook/utils.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/storybook/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type { ScreenshotOutput, ImageCompareResult, CheckScreenMethodOptions, SaveScreenMethodOptions, CheckElementMethodOptions, SaveElementMethodOptions, CheckFullPageMethodOptions, SaveFullPageMethodOptions, ClassOptions, DeviceRectangles, TestContext, InstanceData } from '
|
|
1
|
+
import type { ScreenshotOutput, ImageCompareResult, CheckScreenMethodOptions, SaveScreenMethodOptions, CheckElementMethodOptions, SaveElementMethodOptions, CheckFullPageMethodOptions, SaveFullPageMethodOptions, ClassOptions, DeviceRectangles, TestContext, InstanceData, InternalSaveScreenMethodOptions, InternalCheckTabbablePageMethodOptions, InternalSaveElementMethodOptions, InternalSaveFullPageMethodOptions, InternalSaveTabbablePageMethodOptions, InternalCheckScreenMethodOptions, InternalCheckElementMethodOptions, InternalCheckFullPageMethodOptions } from '@wdio/image-comparison-core';
|
|
2
2
|
import type { ChainablePromiseElement } from 'webdriverio';
|
|
3
3
|
import type { ContextManager } from './contextManager.js';
|
|
4
|
+
import type { WaitForStorybookComponentToBeLoaded } from './storybook/Types.js';
|
|
4
5
|
type MultiOutput = {
|
|
5
6
|
[browserName: string]: ScreenshotOutput;
|
|
6
7
|
};
|
|
@@ -15,7 +16,7 @@ export type MobileInstanceData = {
|
|
|
15
16
|
};
|
|
16
17
|
export type getFolderMethodOptions = CheckElementMethodOptions | CheckFullPageMethodOptions | CheckScreenMethodOptions | SaveElementMethodOptions | SaveFullPageMethodOptions | SaveScreenMethodOptions;
|
|
17
18
|
export type GetInstanceDataOptions = {
|
|
18
|
-
|
|
19
|
+
browserInstance: WebdriverIO.Browser;
|
|
19
20
|
initialDeviceRectangles: DeviceRectangles;
|
|
20
21
|
isNativeContext: boolean;
|
|
21
22
|
};
|
|
@@ -26,13 +27,13 @@ export type EnrichTestContextOptions = {
|
|
|
26
27
|
tag: string;
|
|
27
28
|
};
|
|
28
29
|
export type GetMobileInstanceDataOptions = {
|
|
29
|
-
|
|
30
|
+
browserInstance: WebdriverIO.Browser;
|
|
30
31
|
initialDeviceRectangles: DeviceRectangles;
|
|
31
32
|
isNativeContext: boolean;
|
|
32
33
|
nativeWebScreenshot: boolean;
|
|
33
34
|
};
|
|
34
35
|
export interface WrapWithContextOptions<T extends (...args: any[]) => any> {
|
|
35
|
-
|
|
36
|
+
browserInstance: WebdriverIO.Browser;
|
|
36
37
|
command: T;
|
|
37
38
|
contextManager: ContextManager;
|
|
38
39
|
getArgs: () => Parameters<T>;
|
|
@@ -48,19 +49,30 @@ export interface WdioIcsCommonOptions {
|
|
|
48
49
|
export interface WdioIcsScrollOptions extends WdioIcsCommonOptions {
|
|
49
50
|
hideAfterFirstScroll?: (WebdriverIO.Element | ChainablePromiseElement)[];
|
|
50
51
|
}
|
|
51
|
-
export interface
|
|
52
|
-
}
|
|
53
|
-
export interface WdioSaveFullPageMethodOptions extends Omit<SaveFullPageMethodOptions, keyof WdioIcsScrollOptions>, WdioIcsScrollOptions {
|
|
52
|
+
export interface WdioSaveScreenMethodOptions extends Omit<SaveScreenMethodOptions, keyof WdioIcsCommonOptions>, WdioIcsCommonOptions {
|
|
54
53
|
}
|
|
55
54
|
export interface WdioSaveElementMethodOptions extends Omit<SaveElementMethodOptions, keyof WdioIcsCommonOptions>, WdioIcsCommonOptions {
|
|
56
55
|
}
|
|
57
|
-
export interface
|
|
56
|
+
export interface WdioSaveFullPageMethodOptions extends Omit<SaveFullPageMethodOptions, keyof WdioIcsScrollOptions>, WdioIcsScrollOptions {
|
|
57
|
+
}
|
|
58
|
+
export interface WdioCheckScreenMethodOptions extends Omit<CheckScreenMethodOptions, keyof WdioIcsCommonOptions>, WdioIcsCommonOptions {
|
|
58
59
|
}
|
|
59
60
|
export interface WdioCheckElementMethodOptions extends Omit<CheckElementMethodOptions, keyof WdioIcsCommonOptions>, WdioIcsCommonOptions {
|
|
60
61
|
}
|
|
61
|
-
export interface
|
|
62
|
+
export interface WdioCheckFullPageMethodOptions extends Omit<CheckFullPageMethodOptions, keyof WdioIcsScrollOptions>, WdioIcsScrollOptions {
|
|
62
63
|
}
|
|
63
64
|
export interface VisualServiceOptions extends ClassOptions {
|
|
64
65
|
}
|
|
66
|
+
export interface CommandMap {
|
|
67
|
+
saveScreen: (options: InternalSaveScreenMethodOptions) => Promise<Output>;
|
|
68
|
+
saveElement: (options: InternalSaveElementMethodOptions) => Promise<Output>;
|
|
69
|
+
saveFullPageScreen: (options: InternalSaveFullPageMethodOptions) => Promise<Output>;
|
|
70
|
+
saveTabbablePage: (options: InternalSaveTabbablePageMethodOptions) => Promise<Output>;
|
|
71
|
+
checkScreen: (options: InternalCheckScreenMethodOptions) => Promise<Result>;
|
|
72
|
+
checkElement: (options: InternalCheckElementMethodOptions) => Promise<Result>;
|
|
73
|
+
checkFullPageScreen: (options: InternalCheckFullPageMethodOptions) => Promise<Result>;
|
|
74
|
+
checkTabbablePage: (options: InternalCheckTabbablePageMethodOptions) => Promise<Result>;
|
|
75
|
+
waitForStorybookComponentToBeLoaded: (options: WaitForStorybookComponentToBeLoaded) => Promise<void>;
|
|
76
|
+
}
|
|
65
77
|
export {};
|
|
66
78
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,YAAY,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Folders, InstanceData, TestContext } from '
|
|
1
|
+
import type { Folders, InstanceData, TestContext } from '@wdio/image-comparison-core';
|
|
2
2
|
import type { EnrichTestContextOptions, getFolderMethodOptions, GetInstanceDataOptions } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Get the folders data
|
|
@@ -28,7 +28,7 @@ export declare function getLtOptions(capabilities: WebdriverIO.Capabilities): an
|
|
|
28
28
|
/**
|
|
29
29
|
* Get the instance data
|
|
30
30
|
*/
|
|
31
|
-
export declare function getInstanceData({
|
|
31
|
+
export declare function getInstanceData({ browserInstance, initialDeviceRectangles, isNativeContext }: GetInstanceDataOptions): Promise<InstanceData>;
|
|
32
32
|
/**
|
|
33
33
|
* Traverse up the scope chain until browser element was reached
|
|
34
34
|
*/
|
|
@@ -41,8 +41,4 @@ export declare function getNativeContext({ capabilities, isMobile }: {
|
|
|
41
41
|
* Make sure we have all the data for the test context
|
|
42
42
|
*/
|
|
43
43
|
export declare function enrichTestContext({ commandName, currentTestContext: { framework, parent, title, }, instanceData: { appName, browserName, browserVersion, deviceName, isAndroid, isIOS, isMobile, platformName, platformVersion, }, tag, }: EnrichTestContextOptions): TestContext;
|
|
44
|
-
/**
|
|
45
|
-
* Check if the current browser supports isBidi screenshots
|
|
46
|
-
*/
|
|
47
|
-
export declare function isBiDiScreenshotSupported(driver: WebdriverIO.Browser): boolean;
|
|
48
44
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACrF,OAAO,KAAK,EACR,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EAIzB,MAAM,YAAY,CAAA;AAEnB;;;;;GAKG;AAEH,wBAAgB,UAAU,CACtB,aAAa,EAAE,sBAAsB,EACrC,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,MAAM,GACxB,OAAO,CAMT;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,SAAI,GAAG;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB,CAKA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE;IAAC,MAAM,EAAC,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,GAAG,MAAM,CAOhH;AAuFD;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,GAAG,GAAG,GAAG,SAAS,CAMpF;AAmCD;;GAEG;AACH,wBAAsB,eAAe,CAAC,EAClC,eAAe,EACf,uBAAuB,EACvB,eAAe,EAClB,EAAE,sBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoEhD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAGtG;AAOD,wBAAgB,gBAAgB,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,EACvD;IAAE,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAC9D,OAAO,CAuBT;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,EACI,WAAW,EACX,kBAAkB,EAAE,EAChB,SAAS,EACT,MAAM,EACN,KAAK,GACR,EACD,YAAY,EAAE,EACV,OAAO,EACP,WAAW,EACX,cAAc,EACd,UAAU,EACV,SAAS,EACT,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,eAAe,GAClB,EACD,GAAG,GACN,EAAE,wBAAwB,GAAG,WAAW,CAuB5C"}
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getMobileScreenSize, getMobileViewPortPosition, IOS_OFFSETS, NOT_KNOWN } from '
|
|
1
|
+
import { getMobileScreenSize, getMobileViewPortPosition, IOS_OFFSETS, NOT_KNOWN } from '@wdio/image-comparison-core';
|
|
2
2
|
/**
|
|
3
3
|
* Get the folders data
|
|
4
4
|
*
|
|
@@ -34,18 +34,14 @@ export function getDevicePixelRatio(screenshot, deviceScreenSize) {
|
|
|
34
34
|
/**
|
|
35
35
|
* Get the mobile instance data
|
|
36
36
|
*/
|
|
37
|
-
async function getMobileInstanceData({
|
|
38
|
-
const { isAndroid, isIOS, isMobile } =
|
|
37
|
+
async function getMobileInstanceData({ browserInstance, initialDeviceRectangles, isNativeContext, nativeWebScreenshot, }) {
|
|
38
|
+
const { isAndroid, isIOS, isMobile } = browserInstance;
|
|
39
39
|
let devicePixelRatio = 1;
|
|
40
40
|
let deviceRectangles = initialDeviceRectangles;
|
|
41
41
|
if (isMobile) {
|
|
42
|
-
const
|
|
43
|
-
const getUrl = () => currentBrowser.getUrl();
|
|
44
|
-
const url = (arg) => currentBrowser.url(arg);
|
|
45
|
-
const currentDriverCapabilities = currentBrowser.capabilities;
|
|
42
|
+
const currentDriverCapabilities = browserInstance.capabilities;
|
|
46
43
|
const { height: screenHeight, width: screenWidth } = await getMobileScreenSize({
|
|
47
|
-
|
|
48
|
-
executor,
|
|
44
|
+
browserInstance,
|
|
49
45
|
isIOS,
|
|
50
46
|
isNativeContext,
|
|
51
47
|
});
|
|
@@ -56,15 +52,11 @@ async function getMobileInstanceData({ currentBrowser, initialDeviceRectangles,
|
|
|
56
52
|
deviceRectangles.statusBarAndAddressBar.width = screenWidth;
|
|
57
53
|
deviceRectangles.statusBar.width = screenWidth;
|
|
58
54
|
deviceRectangles = await getMobileViewPortPosition({
|
|
55
|
+
browserInstance,
|
|
59
56
|
initialDeviceRectangles,
|
|
60
57
|
isAndroid,
|
|
61
58
|
isIOS,
|
|
62
59
|
isNativeContext,
|
|
63
|
-
methods: {
|
|
64
|
-
executor,
|
|
65
|
-
getUrl,
|
|
66
|
-
url,
|
|
67
|
-
},
|
|
68
60
|
nativeWebScreenshot,
|
|
69
61
|
screenHeight,
|
|
70
62
|
screenWidth,
|
|
@@ -88,7 +80,7 @@ async function getMobileInstanceData({ currentBrowser, initialDeviceRectangles,
|
|
|
88
80
|
}
|
|
89
81
|
else {
|
|
90
82
|
// This is to already determine the device pixel ratio if it's not set in the capabilities
|
|
91
|
-
const base64Image = await
|
|
83
|
+
const base64Image = await browserInstance.takeScreenshot();
|
|
92
84
|
devicePixelRatio = getDevicePixelRatio(base64Image, deviceRectangles.screenSize);
|
|
93
85
|
const isIphone = deviceRectangles.screenSize.width < 1024 && deviceRectangles.screenSize.height < 1024;
|
|
94
86
|
const deviceType = isIphone ? 'IPHONE' : 'IPAD';
|
|
@@ -99,7 +91,7 @@ async function getMobileInstanceData({ currentBrowser, initialDeviceRectangles,
|
|
|
99
91
|
const offsetPortraitHeight = Object.keys(IOS_OFFSETS[deviceType]).indexOf(portraitHeight.toString()) > -1 ?
|
|
100
92
|
portraitHeight :
|
|
101
93
|
defaultPortraitHeight;
|
|
102
|
-
const currentOffsets = IOS_OFFSETS[deviceType][offsetPortraitHeight]
|
|
94
|
+
const currentOffsets = IOS_OFFSETS[deviceType][offsetPortraitHeight][screenWidth > screenHeight ? 'LANDSCAPE' : 'PORTRAIT'];
|
|
103
95
|
// NOTE: The values for iOS are based on CSS pixels, so we need to multiply them with the devicePixelRatio,
|
|
104
96
|
// This will NOT be done here but in a central place
|
|
105
97
|
deviceRectangles.statusBar = {
|
|
@@ -126,12 +118,12 @@ export function getLtOptions(capabilities) {
|
|
|
126
118
|
/**
|
|
127
119
|
* Get the device name
|
|
128
120
|
*/
|
|
129
|
-
function getDeviceName(
|
|
121
|
+
function getDeviceName(browserInstance) {
|
|
130
122
|
const { capabilities: {
|
|
131
123
|
// We use a few `@ts-ignore` here because this is returned by the driver
|
|
132
124
|
// and not recognized by the types because they are not requested
|
|
133
125
|
// @ts-ignore
|
|
134
|
-
deviceName: returnedDeviceName = NOT_KNOWN, }, requestedCapabilities } =
|
|
126
|
+
deviceName: returnedDeviceName = NOT_KNOWN, }, requestedCapabilities } = browserInstance;
|
|
135
127
|
let deviceName = NOT_KNOWN;
|
|
136
128
|
// First check if it's a BrowserStack session, they don't:
|
|
137
129
|
// - return the "requested" deviceName in the session capabilities
|
|
@@ -154,8 +146,8 @@ function getDeviceName(currentBrowser) {
|
|
|
154
146
|
/**
|
|
155
147
|
* Get the instance data
|
|
156
148
|
*/
|
|
157
|
-
export async function getInstanceData({
|
|
158
|
-
const { capabilities: currentCapabilities, requestedCapabilities } =
|
|
149
|
+
export async function getInstanceData({ browserInstance, initialDeviceRectangles, isNativeContext }) {
|
|
150
|
+
const { capabilities: currentCapabilities, requestedCapabilities } = browserInstance;
|
|
159
151
|
const { browserName: rawBrowserName = NOT_KNOWN, browserVersion: rawBrowserVersion = NOT_KNOWN, platformName: rawPlatformName = NOT_KNOWN, } = currentCapabilities;
|
|
160
152
|
// Generic data
|
|
161
153
|
const browserName = rawBrowserName === '' ? NOT_KNOWN : rawBrowserName.toLowerCase();
|
|
@@ -163,7 +155,7 @@ export async function getInstanceData({ currentBrowser, initialDeviceRectangles,
|
|
|
163
155
|
// For #967: When a screenshot of an emulated device is taken, but the browser was initially
|
|
164
156
|
// started as a "desktop" session, so not with emulated caps, we need to store the initial
|
|
165
157
|
// devicePixelRatio when we take a screenshot and enableLegacyScreenshotMethod is enabled
|
|
166
|
-
let devicePixelRatio = !
|
|
158
|
+
let devicePixelRatio = !browserInstance.isMobile ? (await browserInstance.execute('return window.devicePixelRatio')) : 1;
|
|
167
159
|
const platformName = rawPlatformName === '' ? NOT_KNOWN : rawPlatformName.toLowerCase();
|
|
168
160
|
const logName = 'wdio-ics:options' in requestedCapabilities
|
|
169
161
|
? requestedCapabilities['wdio-ics:options']?.logName ?? ''
|
|
@@ -172,7 +164,7 @@ export async function getInstanceData({ currentBrowser, initialDeviceRectangles,
|
|
|
172
164
|
? requestedCapabilities['wdio-ics:options']?.name ?? ''
|
|
173
165
|
: '';
|
|
174
166
|
// Mobile data
|
|
175
|
-
const { isAndroid, isIOS, isMobile } =
|
|
167
|
+
const { isAndroid, isIOS, isMobile } = browserInstance;
|
|
176
168
|
const {
|
|
177
169
|
// We use a few `@ts-ignore` here because this is returned by the driver
|
|
178
170
|
// and not recognized by the types because they are not requested
|
|
@@ -183,13 +175,13 @@ export async function getInstanceData({ currentBrowser, initialDeviceRectangles,
|
|
|
183
175
|
const appName = rawApp !== NOT_KNOWN
|
|
184
176
|
? rawApp.replace(/\\/g, '/').split('/').pop().replace(/[^a-zA-Z0-9.]/g, '_')
|
|
185
177
|
: NOT_KNOWN;
|
|
186
|
-
const deviceName = getDeviceName(
|
|
178
|
+
const deviceName = getDeviceName(browserInstance);
|
|
187
179
|
const ltOptions = getLtOptions(requestedCapabilities);
|
|
188
180
|
// @TODO: Figure this one out in the future when we know more about the Appium capabilities from LT
|
|
189
181
|
// 20241216: LT doesn't have the option to take a ChromeDriver screenshot, so if it's Android it's always native
|
|
190
182
|
const nativeWebScreenshot = isAndroid && ltOptions || !!(requestedCapabilities['appium:nativeWebScreenshot']);
|
|
191
183
|
const platformVersion = (rawPlatformVersion === undefined || rawPlatformVersion === '') ? NOT_KNOWN : rawPlatformVersion.toLowerCase();
|
|
192
|
-
const { devicePixelRatio: mobileDevicePixelRatio, deviceRectangles, } = await getMobileInstanceData({
|
|
184
|
+
const { devicePixelRatio: mobileDevicePixelRatio, deviceRectangles, } = await getMobileInstanceData({ browserInstance, initialDeviceRectangles, isNativeContext, nativeWebScreenshot });
|
|
193
185
|
devicePixelRatio = isMobile ? mobileDevicePixelRatio : devicePixelRatio;
|
|
194
186
|
return {
|
|
195
187
|
appName,
|
|
@@ -266,11 +258,3 @@ export function enrichTestContext({ commandName, currentTestContext: { framework
|
|
|
266
258
|
title,
|
|
267
259
|
};
|
|
268
260
|
}
|
|
269
|
-
/**
|
|
270
|
-
* Check if the current browser supports isBidi screenshots
|
|
271
|
-
*/
|
|
272
|
-
export function isBiDiScreenshotSupported(driver) {
|
|
273
|
-
const { isBidi } = driver;
|
|
274
|
-
const isBiDiSupported = typeof driver.browsingContextCaptureScreenshot === 'function';
|
|
275
|
-
return isBidi && isBiDiSupported;
|
|
276
|
-
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrapWithContext.d.ts","sourceRoot":"","sources":["../src/wrapWithContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAGxD;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"wrapWithContext.d.ts","sourceRoot":"","sources":["../src/wrapWithContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAGxD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAkBhI"}
|
package/dist/wrapWithContext.js
CHANGED
|
@@ -5,11 +5,11 @@ import { getInstanceData } from './utils.js';
|
|
|
5
5
|
* and that the command is executed in the correct context
|
|
6
6
|
*/
|
|
7
7
|
export function wrapWithContext(opts) {
|
|
8
|
-
const {
|
|
8
|
+
const { browserInstance, command, contextManager, getArgs } = opts;
|
|
9
9
|
return async function () {
|
|
10
10
|
if (contextManager.needsUpdate) {
|
|
11
11
|
const instanceData = await getInstanceData({
|
|
12
|
-
|
|
12
|
+
browserInstance,
|
|
13
13
|
initialDeviceRectangles: contextManager.getViewportContext(),
|
|
14
14
|
isNativeContext: contextManager.isNativeContext,
|
|
15
15
|
});
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@wdio/visual-service",
|
|
3
3
|
"author": "Wim Selles - wswebcreation",
|
|
4
4
|
"description": "Image comparison / visual regression testing for WebdriverIO",
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "9.0.0",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"homepage": "https://webdriver.io/docs/visual-testing",
|
|
8
8
|
"repository": {
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
"type": "module",
|
|
21
21
|
"types": "./dist/index.d.ts",
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@wdio/globals": "^9.
|
|
24
|
-
"@wdio/logger": "^9.
|
|
25
|
-
"@wdio/types": "^9.
|
|
26
|
-
"expect-webdriverio": "^5.
|
|
27
|
-
"
|
|
23
|
+
"@wdio/globals": "^9.17.0",
|
|
24
|
+
"@wdio/logger": "^9.18.0",
|
|
25
|
+
"@wdio/types": "^9.16.2",
|
|
26
|
+
"expect-webdriverio": "^5.4.0",
|
|
27
|
+
"@wdio/image-comparison-core": "1.0.0"
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "run-s clean build:*",
|