webdriverio 9.0.0-alpha.10 → 9.0.0-alpha.113
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/build/cjs/index.js +0 -1
- package/build/commands/browser/$$.js +0 -1
- package/build/commands/browser/$.d.ts.map +1 -1
- package/build/commands/browser/$.js +10 -20
- package/build/commands/browser/action.js +0 -1
- package/build/commands/browser/actions.js +0 -1
- package/build/commands/browser/addCommand.js +0 -1
- package/build/commands/browser/call.js +0 -1
- package/build/commands/browser/custom$$.js +0 -1
- package/build/commands/browser/custom$.js +0 -1
- package/build/commands/browser/debug.js +0 -1
- package/build/commands/browser/deleteCookies.js +0 -1
- package/build/commands/browser/emulate.d.ts +6 -0
- package/build/commands/browser/emulate.d.ts.map +1 -1
- package/build/commands/browser/emulate.js +6 -1
- package/build/commands/browser/execute.js +0 -1
- package/build/commands/browser/executeAsync.js +0 -1
- package/build/commands/browser/getCookies.js +0 -1
- package/build/commands/browser/getPuppeteer.js +0 -1
- package/build/commands/browser/getWindowSize.js +0 -1
- package/build/commands/browser/keys.js +0 -1
- package/build/commands/browser/mock.d.ts +4 -7
- package/build/commands/browser/mock.d.ts.map +1 -1
- package/build/commands/browser/mock.js +4 -44
- package/build/commands/browser/mockClearAll.js +0 -1
- package/build/commands/browser/mockRestoreAll.js +0 -1
- package/build/commands/browser/newWindow.js +0 -1
- package/build/commands/browser/overwriteCommand.js +0 -1
- package/build/commands/browser/pause.js +0 -1
- package/build/commands/browser/react$$.js +0 -1
- package/build/commands/browser/react$.js +0 -1
- package/build/commands/browser/reloadSession.js +0 -1
- package/build/commands/browser/savePDF.js +0 -1
- package/build/commands/browser/saveRecordingScreen.js +0 -1
- package/build/commands/browser/saveScreenshot.js +0 -1
- package/build/commands/browser/scroll.js +0 -1
- package/build/commands/browser/setCookies.js +0 -1
- package/build/commands/browser/setTimeout.js +0 -1
- package/build/commands/browser/setWindowSize.js +0 -1
- package/build/commands/browser/switchWindow.js +0 -1
- package/build/commands/browser/throttle.d.ts +1 -1
- package/build/commands/browser/throttle.d.ts.map +1 -1
- package/build/commands/browser/throttle.js +0 -1
- package/build/commands/browser/throttleCPU.js +0 -1
- package/build/commands/browser/throttleNetwork.d.ts +1 -1
- package/build/commands/browser/throttleNetwork.d.ts.map +1 -1
- package/build/commands/browser/throttleNetwork.js +0 -1
- package/build/commands/browser/touchAction.js +0 -1
- package/build/commands/browser/uploadFile.js +0 -1
- package/build/commands/browser/url.js +0 -1
- package/build/commands/browser/waitUntil.js +0 -1
- package/build/commands/browser.js +0 -1
- package/build/commands/constant.js +0 -1
- package/build/commands/element/$$.js +0 -1
- package/build/commands/element/$.js +0 -1
- package/build/commands/element/addValue.js +0 -1
- package/build/commands/element/clearValue.js +0 -1
- package/build/commands/element/click.js +0 -1
- package/build/commands/element/custom$$.js +0 -1
- package/build/commands/element/custom$.js +0 -1
- package/build/commands/element/doubleClick.js +0 -1
- package/build/commands/element/dragAndDrop.js +0 -1
- package/build/commands/element/execute.d.ts +0 -1
- package/build/commands/element/execute.d.ts.map +1 -1
- package/build/commands/element/execute.js +0 -1
- package/build/commands/element/executeAsync.d.ts +0 -1
- package/build/commands/element/executeAsync.d.ts.map +1 -1
- package/build/commands/element/executeAsync.js +0 -1
- package/build/commands/element/getAttribute.js +0 -1
- package/build/commands/element/getCSSProperty.d.ts +1 -1
- package/build/commands/element/getCSSProperty.d.ts.map +1 -1
- package/build/commands/element/getCSSProperty.js +0 -1
- package/build/commands/element/getComputedLabel.js +0 -1
- package/build/commands/element/getComputedRole.js +0 -1
- package/build/commands/element/getHTML.d.ts.map +1 -1
- package/build/commands/element/getHTML.js +30 -51
- package/build/commands/element/getLocation.js +0 -1
- package/build/commands/element/getProperty.js +0 -1
- package/build/commands/element/getSize.js +0 -1
- package/build/commands/element/getTagName.js +0 -1
- package/build/commands/element/getText.js +0 -1
- package/build/commands/element/getValue.js +0 -1
- package/build/commands/element/isClickable.js +0 -1
- package/build/commands/element/isDisplayed.js +0 -1
- package/build/commands/element/isEnabled.js +0 -1
- package/build/commands/element/isEqual.js +0 -1
- package/build/commands/element/isExisting.js +0 -1
- package/build/commands/element/isFocused.js +0 -1
- package/build/commands/element/isSelected.js +0 -1
- package/build/commands/element/isStable.js +0 -1
- package/build/commands/element/moveTo.js +0 -1
- package/build/commands/element/nextElement.d.ts +1 -1
- package/build/commands/element/nextElement.d.ts.map +1 -1
- package/build/commands/element/nextElement.js +0 -1
- package/build/commands/element/parentElement.d.ts +1 -1
- package/build/commands/element/parentElement.d.ts.map +1 -1
- package/build/commands/element/parentElement.js +0 -1
- package/build/commands/element/previousElement.d.ts +1 -1
- package/build/commands/element/previousElement.d.ts.map +1 -1
- package/build/commands/element/previousElement.js +0 -1
- package/build/commands/element/react$$.js +0 -1
- package/build/commands/element/react$.js +0 -1
- package/build/commands/element/saveScreenshot.js +0 -1
- package/build/commands/element/scrollIntoView.js +0 -1
- package/build/commands/element/selectByAttribute.js +0 -1
- package/build/commands/element/selectByIndex.js +0 -1
- package/build/commands/element/selectByVisibleText.js +0 -1
- package/build/commands/element/setValue.js +0 -1
- package/build/commands/element/shadow$$.js +0 -1
- package/build/commands/element/shadow$.js +0 -1
- package/build/commands/element/touchAction.js +0 -1
- package/build/commands/element/waitForClickable.js +0 -1
- package/build/commands/element/waitForDisplayed.js +0 -1
- package/build/commands/element/waitForEnabled.js +0 -1
- package/build/commands/element/waitForExist.js +0 -1
- package/build/commands/element/waitForStable.js +0 -1
- package/build/commands/element/waitUntil.js +0 -1
- package/build/commands/element.js +0 -1
- package/build/commands/mock/abort.js +0 -1
- package/build/commands/mock/abortOnce.js +0 -1
- package/build/commands/mock/clear.js +0 -1
- package/build/commands/mock/respond.js +0 -1
- package/build/commands/mock/respondOnce.js +0 -1
- package/build/commands/mock/restore.js +0 -1
- package/build/constants.js +0 -1
- package/build/index.d.ts +3 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -3
- package/build/middlewares.d.ts.map +1 -1
- package/build/middlewares.js +0 -1
- package/build/multiremote.js +0 -1
- package/build/protocol-stub.js +0 -1
- package/build/scripts/customElement.d.ts.map +1 -1
- package/build/scripts/customElement.js +6 -3
- package/build/scripts/getHTML.js +0 -1
- package/build/scripts/getHTMLShadow.d.ts +11 -8
- package/build/scripts/getHTMLShadow.d.ts.map +1 -1
- package/build/scripts/getHTMLShadow.js +20 -31
- package/build/scripts/getProperty.js +0 -1
- package/build/scripts/isDescendant.js +0 -1
- package/build/scripts/isElementClickable.js +0 -1
- package/build/scripts/isElementDisplayed.js +0 -1
- package/build/scripts/isElementInViewport.js +0 -1
- package/build/scripts/isElementStable.js +0 -1
- package/build/scripts/isFocused.js +0 -1
- package/build/scripts/newWindow.js +0 -1
- package/build/scripts/resq.js +0 -1
- package/build/scripts/shadowFnFactory.js +0 -1
- package/build/shadowRoot.d.ts +25 -15
- package/build/shadowRoot.d.ts.map +1 -1
- package/build/shadowRoot.js +153 -49
- package/build/types.d.ts +29 -37
- package/build/types.d.ts.map +1 -1
- package/build/types.js +0 -1
- package/build/utils/SevereServiceError.js +0 -1
- package/build/utils/Timer.js +0 -1
- package/build/utils/actions/base.js +0 -1
- package/build/utils/actions/index.js +0 -1
- package/build/utils/actions/key.js +0 -1
- package/build/utils/actions/pointer.js +0 -1
- package/build/utils/actions/wheel.js +0 -1
- package/build/utils/detectBackend.js +0 -1
- package/build/utils/driver.js +0 -1
- package/build/utils/findStrategy.js +0 -1
- package/build/utils/getElementObject.d.ts +3 -3
- package/build/utils/getElementObject.d.ts.map +1 -1
- package/build/utils/getElementObject.js +20 -11
- package/build/utils/implicitWait.js +0 -1
- package/build/utils/index.d.ts +2 -8
- package/build/utils/index.d.ts.map +1 -1
- package/build/utils/index.js +71 -96
- package/build/utils/interception/index.d.ts +76 -22
- package/build/utils/interception/index.d.ts.map +1 -1
- package/build/utils/interception/index.js +297 -26
- package/build/utils/interception/types.d.ts +18 -85
- package/build/utils/interception/types.d.ts.map +1 -1
- package/build/utils/interception/types.js +0 -1
- package/build/utils/interception/utils.d.ts +17 -0
- package/build/utils/interception/utils.d.ts.map +1 -0
- package/build/utils/interception/utils.js +87 -0
- package/build/utils/refetchElement.d.ts.map +1 -1
- package/build/utils/refetchElement.js +6 -3
- package/build/utils/thirdParty/querySelectorShadowDom.js +0 -1
- package/package.json +11 -9
- package/build/utils/interception/devtools.d.ts +0 -64
- package/build/utils/interception/devtools.d.ts.map +0 -1
- package/build/utils/interception/devtools.js +0 -268
- package/build/utils/interception/webdriver.d.ts +0 -49
- package/build/utils/interception/webdriver.d.ts.map +0 -1
- package/build/utils/interception/webdriver.js +0 -76
|
@@ -1,32 +1,293 @@
|
|
|
1
|
+
/* eslint-disable no-dupe-class-members */
|
|
1
2
|
import EventEmitter from 'node:events';
|
|
2
|
-
import
|
|
3
|
+
import logger from '@wdio/logger';
|
|
4
|
+
import { URLPattern } from 'urlpattern-polyfill';
|
|
3
5
|
import Timer from '../Timer.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
import { parseOverwrite, getPatternParam } from './utils.js';
|
|
7
|
+
import { SESSION_MOCKS } from '../../commands/browser/mock.js';
|
|
8
|
+
const log = logger('WebDriverInterception');
|
|
9
|
+
let hasSubscribedToEvents = false;
|
|
10
|
+
/**
|
|
11
|
+
* Network interception class based on a WebDriver Bidi implementation.
|
|
12
|
+
*
|
|
13
|
+
* Note: this code is executed in Node.js and in the browser, so make sure
|
|
14
|
+
* you use primitives that work in both environments.
|
|
15
|
+
*/
|
|
16
|
+
export default class WebDriverInterception {
|
|
17
|
+
#pattern;
|
|
18
|
+
#mockId;
|
|
19
|
+
#browser;
|
|
20
|
+
#emitter = new EventEmitter();
|
|
21
|
+
#restored = false;
|
|
22
|
+
#respondOverwrites = [];
|
|
23
|
+
#calls = [];
|
|
24
|
+
constructor(pattern, mockId, browser) {
|
|
25
|
+
this.#pattern = pattern;
|
|
26
|
+
this.#mockId = mockId;
|
|
27
|
+
this.#browser = browser;
|
|
28
|
+
/**
|
|
29
|
+
* attach network listener to this mock
|
|
30
|
+
*/
|
|
31
|
+
browser.on('network.beforeRequestSent', this.#handleBeforeRequestSent.bind(this));
|
|
32
|
+
browser.on('network.responseStarted', this.#handleResponseStarted.bind(this));
|
|
33
|
+
}
|
|
34
|
+
static async initiate(url,
|
|
35
|
+
/**
|
|
36
|
+
* ToDo(Christian): incorporate filterOptions
|
|
37
|
+
*/
|
|
38
|
+
filterOptions, browser) {
|
|
39
|
+
const pattern = parseUrlPattern(url);
|
|
40
|
+
if (!hasSubscribedToEvents) {
|
|
41
|
+
await browser.sessionSubscribe({
|
|
42
|
+
events: [
|
|
43
|
+
'network.beforeRequestSent',
|
|
44
|
+
'network.responseStarted'
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
log.info('subscribed to network events');
|
|
48
|
+
hasSubscribedToEvents = true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* register network intercept
|
|
52
|
+
*/
|
|
53
|
+
const interception = await browser.networkAddIntercept({
|
|
54
|
+
phases: ['beforeRequestSent', 'responseStarted'],
|
|
55
|
+
urlPatterns: [{
|
|
56
|
+
type: 'pattern',
|
|
57
|
+
protocol: getPatternParam(pattern, 'protocol'),
|
|
58
|
+
hostname: getPatternParam(pattern, 'hostname'),
|
|
59
|
+
pathname: getPatternParam(pattern, 'pathname'),
|
|
60
|
+
port: getPatternParam(pattern, 'port'),
|
|
61
|
+
search: getPatternParam(pattern, 'search')
|
|
62
|
+
}]
|
|
63
|
+
});
|
|
64
|
+
return new WebDriverInterception(pattern, interception.intercept, browser);
|
|
65
|
+
}
|
|
66
|
+
#handleBeforeRequestSent(request) {
|
|
67
|
+
/**
|
|
68
|
+
* don't do anything if:
|
|
69
|
+
* - request is not blocked
|
|
70
|
+
* - request is not matching the pattern, e.g. a different mock is responsible for this request
|
|
71
|
+
*/
|
|
72
|
+
if (!this.#isRequestMatching(request)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* continue the request without modifications, if:
|
|
77
|
+
*/
|
|
78
|
+
const continueRequest = (
|
|
79
|
+
/**
|
|
80
|
+
* - mock has no request/respond overwrites
|
|
81
|
+
* - no request modifications are set
|
|
82
|
+
* - no errorReason is set
|
|
83
|
+
* - no requestWith is set
|
|
84
|
+
*/
|
|
85
|
+
this.#respondOverwrites.length === 0 ||
|
|
86
|
+
(!this.#respondOverwrites[0].abort &&
|
|
87
|
+
!this.#respondOverwrites[0].requestWith));
|
|
88
|
+
/**
|
|
89
|
+
* check if request matches the mock url
|
|
90
|
+
*/
|
|
91
|
+
if (continueRequest) {
|
|
92
|
+
this.#emitter.emit('continue', request.request.request);
|
|
93
|
+
return this.#browser.networkContinueRequest({
|
|
94
|
+
request: request.request.request
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
this.#emitter.emit('request', request);
|
|
98
|
+
const { requestWith, abort } = this.#respondOverwrites[0].once
|
|
99
|
+
? this.#respondOverwrites.shift() || {}
|
|
100
|
+
: this.#respondOverwrites[0];
|
|
101
|
+
/**
|
|
102
|
+
* check if should abort the request
|
|
103
|
+
*/
|
|
104
|
+
if (abort) {
|
|
105
|
+
this.#emitter.emit('fail', request.request.request);
|
|
106
|
+
return this.#browser.networkFailRequest({ request: request.request.request });
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* continue request (possibly with overwrites)
|
|
110
|
+
*/
|
|
111
|
+
if (requestWith) {
|
|
112
|
+
this.#emitter.emit('overwrite', request);
|
|
113
|
+
return this.#browser.networkContinueRequest({
|
|
114
|
+
request: request.request.request,
|
|
115
|
+
...parseOverwrite(requestWith, request)
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
throw new Error('This should never happen');
|
|
119
|
+
}
|
|
120
|
+
#handleResponseStarted(request) {
|
|
121
|
+
/**
|
|
122
|
+
* don't do anything if:
|
|
123
|
+
* - request is not blocked
|
|
124
|
+
* - request is not matching the pattern, e.g. a different mock is responsible for this request
|
|
125
|
+
*/
|
|
126
|
+
if (!this.#isRequestMatching(request)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* continue the request without modifications, if:
|
|
131
|
+
*/
|
|
132
|
+
const continueRequest = (
|
|
133
|
+
/**
|
|
134
|
+
* - mock has no request/respond overwrites
|
|
135
|
+
* - no request modifications are set, e.g. no overwrite is set
|
|
136
|
+
*/
|
|
137
|
+
this.#respondOverwrites.length === 0 ||
|
|
138
|
+
!this.#respondOverwrites[0].overwrite);
|
|
139
|
+
/**
|
|
140
|
+
* check if request matches the mock url
|
|
141
|
+
*/
|
|
142
|
+
if (continueRequest) {
|
|
143
|
+
this.#emitter.emit('continue', request.request.request);
|
|
144
|
+
return this.#browser.networkProvideResponse({
|
|
145
|
+
request: request.request.request
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
this.#calls.push(request);
|
|
149
|
+
const { overwrite } = this.#respondOverwrites[0].once
|
|
150
|
+
? this.#respondOverwrites.shift() || {}
|
|
151
|
+
: this.#respondOverwrites[0];
|
|
152
|
+
/**
|
|
153
|
+
* continue request (possibly with overwrites)
|
|
154
|
+
*/
|
|
155
|
+
if (overwrite) {
|
|
156
|
+
this.#emitter.emit('overwrite', request);
|
|
157
|
+
return this.#browser.networkProvideResponse({
|
|
158
|
+
request: request.request.request,
|
|
159
|
+
...parseOverwrite(overwrite, request)
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* continue request as is
|
|
164
|
+
*/
|
|
165
|
+
this.#emitter.emit('continue', request.request.request);
|
|
166
|
+
return this.#browser.networkProvideResponse({
|
|
167
|
+
request: request.request.request
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
#isRequestMatching(request) {
|
|
171
|
+
return request.isBlocked && this.#pattern && this.#pattern.test(request.request.url);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* allows access to all requests made with given pattern
|
|
175
|
+
*/
|
|
176
|
+
get calls() {
|
|
177
|
+
return this.#calls;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Resets all information stored in the `mock.calls` set.
|
|
181
|
+
*/
|
|
182
|
+
clear() {
|
|
183
|
+
this.#calls = [];
|
|
184
|
+
return this;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Does what `mock.clear()` does and makes removes custom request overrides
|
|
188
|
+
* and response overwrites
|
|
189
|
+
*/
|
|
190
|
+
reset() {
|
|
191
|
+
this.clear();
|
|
192
|
+
this.#respondOverwrites = [];
|
|
193
|
+
return this;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Does everything that `mock.reset()` does, and also
|
|
197
|
+
* removes any mocked return values or implementations.
|
|
198
|
+
* Restored mock does not emit events and could not mock responses
|
|
199
|
+
*/
|
|
200
|
+
async restore() {
|
|
201
|
+
this.reset();
|
|
202
|
+
this.#respondOverwrites = [];
|
|
203
|
+
this.#restored = true;
|
|
204
|
+
const handle = await this.#browser.getWindowHandle();
|
|
205
|
+
log.trace(`Restoring mock for ${handle}`);
|
|
206
|
+
SESSION_MOCKS[handle].delete(this);
|
|
207
|
+
if (this.#mockId) {
|
|
208
|
+
await this.#browser.networkRemoveIntercept({ intercept: this.#mockId });
|
|
209
|
+
}
|
|
210
|
+
return this;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Always respond with same overwrite
|
|
214
|
+
* @param {*} overwrites payload to overwrite the response
|
|
215
|
+
* @param {*} params additional respond parameters to overwrite
|
|
216
|
+
* @param {boolean} once apply overwrite only once for the next request
|
|
217
|
+
*/
|
|
218
|
+
respond(payload, params = {}, once) {
|
|
219
|
+
this.#ensureNotRestored();
|
|
220
|
+
const body = typeof payload === 'string'
|
|
221
|
+
? payload
|
|
222
|
+
: globalThis.Buffer && globalThis.Buffer.isBuffer(payload)
|
|
223
|
+
? payload.toString('base64')
|
|
224
|
+
: JSON.stringify(payload);
|
|
225
|
+
const overwrite = { body, ...params };
|
|
226
|
+
this.#respondOverwrites.push({ overwrite, once });
|
|
227
|
+
return this;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* alias for `mock.respond(…, true)`
|
|
231
|
+
*/
|
|
232
|
+
respondOnce(payload, params = {}) {
|
|
233
|
+
return this.respond(payload, params, true);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Abort the request with an error code
|
|
237
|
+
* @param {string} errorReason error code of the response
|
|
238
|
+
* @param {boolean} once if request should be aborted only once for the next request
|
|
239
|
+
*/
|
|
240
|
+
abort(once) {
|
|
241
|
+
this.#ensureNotRestored();
|
|
242
|
+
this.#respondOverwrites.push({ abort: true, once });
|
|
243
|
+
return this;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* alias for `mock.abort(true)`
|
|
247
|
+
*/
|
|
248
|
+
abortOnce() {
|
|
249
|
+
return this.abort(true);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Redirect request to another URL
|
|
253
|
+
* @param {string} redirectUrl URL to redirect to
|
|
254
|
+
* @param {boolean} sticky if request should be redirected for all following requests
|
|
255
|
+
*/
|
|
256
|
+
redirect(redirectUrl, once) {
|
|
257
|
+
this.#ensureNotRestored();
|
|
258
|
+
const requestWith = { url: redirectUrl };
|
|
259
|
+
this.#respondOverwrites.push({ requestWith, once });
|
|
260
|
+
return this;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* alias for `mock.redirect(…, true)`
|
|
264
|
+
*/
|
|
265
|
+
redirectOnce(redirectUrl) {
|
|
266
|
+
return this.redirect(redirectUrl, true);
|
|
267
|
+
}
|
|
268
|
+
on(event, callback) {
|
|
269
|
+
this.#emitter.on(event, callback);
|
|
270
|
+
return this;
|
|
271
|
+
}
|
|
272
|
+
#ensureNotRestored() {
|
|
273
|
+
if (this.#restored) {
|
|
274
|
+
throw new Error('This can\'t be done on restored mock');
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
waitForResponse({ timeout = this.#browser.options.waitforTimeout, interval = this.#browser.options.waitforInterval, timeoutMsg, } = {}) {
|
|
17
278
|
/*!
|
|
18
279
|
* ensure that timeout and interval are set properly
|
|
19
280
|
*/
|
|
20
281
|
if (typeof timeout !== 'number') {
|
|
21
|
-
timeout = this
|
|
282
|
+
timeout = this.#browser.options.waitforTimeout;
|
|
22
283
|
}
|
|
23
284
|
if (typeof interval !== 'number') {
|
|
24
|
-
interval = this
|
|
285
|
+
interval = this.#browser.options.waitforInterval;
|
|
25
286
|
}
|
|
26
287
|
/* istanbul ignore next */
|
|
27
288
|
const fn = async () => this.calls && (await this.calls).length > 0;
|
|
28
289
|
const timer = new Timer(interval, timeout, fn, true);
|
|
29
|
-
return this
|
|
290
|
+
return this.#browser.call(() => timer.catch((e) => {
|
|
30
291
|
if (e.message === 'timeout') {
|
|
31
292
|
if (typeof timeoutMsg === 'string') {
|
|
32
293
|
throw new Error(timeoutMsg);
|
|
@@ -36,14 +297,24 @@ export default class Interception extends EventEmitter {
|
|
|
36
297
|
throw new Error(`waitForResponse failed with the following reason: ${(e && e.message) || e}`);
|
|
37
298
|
}));
|
|
38
299
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
300
|
+
}
|
|
301
|
+
export function parseUrlPattern(url) {
|
|
302
|
+
/**
|
|
303
|
+
* return early if it's already a URLPattern
|
|
304
|
+
*/
|
|
305
|
+
if (typeof url === 'object') {
|
|
306
|
+
return url;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* parse URLPattern from absolute URL
|
|
310
|
+
*/
|
|
311
|
+
if (url.startsWith('http')) {
|
|
312
|
+
return new URLPattern(url);
|
|
47
313
|
}
|
|
314
|
+
/**
|
|
315
|
+
* parse URLPattern from relative URL
|
|
316
|
+
*/
|
|
317
|
+
return new URLPattern({
|
|
318
|
+
pathname: url
|
|
319
|
+
});
|
|
48
320
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvaW50ZXJjZXB0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLGFBQWEsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRXJDLE9BQU8sS0FBSyxNQUFNLGFBQWEsQ0FBQTtBQUsvQixNQUFNLENBQUMsT0FBTyxPQUFnQixZQUFhLFNBQVEsWUFBWTtJQWtCaEQ7SUFDQTtJQUNBO0lBWFgsaUJBQWlCLEdBS1gsRUFBRSxDQUFBO0lBQ1IsT0FBTyxHQUFjLEVBQUUsQ0FBQTtJQUV2QixZQUNXLEdBQW9CLEVBQ3BCLGdCQUFtQyxFQUFFLEVBQ3JDLE9BQTRCO1FBRW5DLEtBQUssRUFBRSxDQUFBO1FBSkEsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFDcEIsa0JBQWEsR0FBYixhQUFhLENBQXdCO1FBQ3JDLFlBQU8sR0FBUCxPQUFPLENBQXFCO0lBR3ZDLENBQUM7SUFFRCxlQUFlLENBQUUsRUFDYixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUM3QyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUMvQyxVQUFVLE1BQ00sRUFBRTtRQUNsQjs7V0FFRztRQUNILElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQXdCLENBQUE7UUFDM0QsQ0FBQztRQUVELElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQXlCLENBQUE7UUFDN0QsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixNQUFNLEVBQUUsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQ2xFLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBNEIsQ0FBQTtRQUUvRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM3QyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzFCLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQy9CLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsT0FBTyxJQUFJLENBQUMsQ0FBQTtZQUNuRSxDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDakcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNQLENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUUsV0FBNEIsRUFBRSxTQUFpQjtRQUNyRSxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sU0FBUyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUM1QyxDQUFDO1FBQ0QsSUFBSSxXQUFXLFlBQVksTUFBTSxFQUFFLENBQUM7WUFDaEMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ25FLENBQUM7Q0FDSiJ9
|
|
@@ -1,80 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import type {
|
|
3
|
-
import type { JsonCompatible } from '@wdio/types';
|
|
4
|
-
/**
|
|
5
|
-
* HTTP request data. (copied from the puppeteer-core package as there is currently
|
|
6
|
-
* no way to access these types otherwise)
|
|
7
|
-
*/
|
|
8
|
-
export type ResourcePriority = 'VeryLow' | 'Low' | 'Medium' | 'High' | 'VeryHigh';
|
|
9
|
-
export type MixedContentType = 'blockable' | 'optionally-blockable' | 'none';
|
|
10
|
-
export type ReferrerPolicy = 'unsafe-url' | 'no-referrer-when-downgrade' | 'no-referrer' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin';
|
|
11
|
-
export type ErrorReason = 'Failed' | 'Aborted' | 'TimedOut' | 'AccessDenied' | 'ConnectionClosed' | 'ConnectionReset' | 'ConnectionRefused' | 'ConnectionAborted' | 'ConnectionFailed' | 'NameNotResolved' | 'InternetDisconnected' | 'AddressUnreachable' | 'BlockedByClient' | 'BlockedByResponse';
|
|
12
|
-
export interface Request {
|
|
13
|
-
/**
|
|
14
|
-
* Request URL (without fragment).
|
|
15
|
-
*/
|
|
16
|
-
url: string;
|
|
17
|
-
/**
|
|
18
|
-
* Fragment of the requested URL starting with hash, if present.
|
|
19
|
-
*/
|
|
20
|
-
urlFragment?: string;
|
|
21
|
-
/**
|
|
22
|
-
* HTTP request method.
|
|
23
|
-
*/
|
|
24
|
-
method: string;
|
|
25
|
-
/**
|
|
26
|
-
* HTTP request headers.
|
|
27
|
-
*/
|
|
28
|
-
headers: Record<string, string>;
|
|
29
|
-
/**
|
|
30
|
-
* HTTP POST request data.
|
|
31
|
-
*/
|
|
32
|
-
postData?: string;
|
|
33
|
-
/**
|
|
34
|
-
* True when the request has POST data. Note that postData might still be omitted when this flag is true when the data is too long.
|
|
35
|
-
*/
|
|
36
|
-
hasPostData?: boolean;
|
|
37
|
-
/**
|
|
38
|
-
* The mixed content export type of the request.
|
|
39
|
-
*/
|
|
40
|
-
mixedContentType?: MixedContentType;
|
|
41
|
-
/**
|
|
42
|
-
* Priority of the resource request at the time request is sent.
|
|
43
|
-
*/
|
|
44
|
-
initialPriority: ResourcePriority;
|
|
45
|
-
/**
|
|
46
|
-
* The referrer policy of the request, as defined in https://www.w3.org/TR/referrer-policy/
|
|
47
|
-
*/
|
|
48
|
-
referrerPolicy: ReferrerPolicy;
|
|
49
|
-
/**
|
|
50
|
-
* Whether is loaded via link preload.
|
|
51
|
-
*/
|
|
52
|
-
isLinkPreload?: boolean;
|
|
53
|
-
}
|
|
54
|
-
export interface Matches extends Request {
|
|
55
|
-
/**
|
|
56
|
-
* body response of actual resource
|
|
57
|
-
*/
|
|
58
|
-
body: string | Buffer | JsonCompatible;
|
|
59
|
-
/**
|
|
60
|
-
* HTTP response headers.
|
|
61
|
-
*/
|
|
62
|
-
responseHeaders: Record<string, string>;
|
|
63
|
-
/**
|
|
64
|
-
* HTTP response status code.
|
|
65
|
-
*/
|
|
66
|
-
statusCode: number;
|
|
67
|
-
}
|
|
68
|
-
export type MockOverwriteFunction = (request: Matches, client: CDPSession) => Promise<string | Record<string, any>>;
|
|
69
|
-
export type MockOverwrite = string | Record<string, any> | MockOverwriteFunction;
|
|
70
|
-
export type MockResponseParams = {
|
|
71
|
-
statusCode?: number | ((request: Matches) => number);
|
|
72
|
-
headers?: Record<string, string> | ((request: Matches) => Record<string, string>);
|
|
73
|
-
/**
|
|
74
|
-
* fetch real response before responding with mocked data. Default: true
|
|
75
|
-
*/
|
|
76
|
-
fetchResponse?: boolean;
|
|
77
|
-
};
|
|
1
|
+
import type { local } from 'webdriver';
|
|
2
|
+
import type { Cookie } from '@wdio/protocols';
|
|
78
3
|
export type MockFilterOptions = {
|
|
79
4
|
method?: string | ((method: string) => boolean);
|
|
80
5
|
headers?: Record<string, string> | ((headers: Record<string, string>) => boolean);
|
|
@@ -83,13 +8,21 @@ export type MockFilterOptions = {
|
|
|
83
8
|
statusCode?: number | ((statusCode: number) => boolean);
|
|
84
9
|
postData?: string | ((payload: string | undefined) => boolean);
|
|
85
10
|
};
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
export interface
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
11
|
+
type Overwrite<T, Request> = T | ((request: Request) => T);
|
|
12
|
+
type Methods = 'POST' | 'GET' | 'DELETE' | 'PUT' | 'PATCH' | 'OPTIONS' | 'HEAD';
|
|
13
|
+
export interface RequestWithOptions {
|
|
14
|
+
body?: Overwrite<any, local.NetworkBeforeRequestSentParameters>;
|
|
15
|
+
cookies?: Overwrite<Cookie[], local.NetworkBeforeRequestSentParameters>;
|
|
16
|
+
headers?: Overwrite<Record<string, string>, local.NetworkBeforeRequestSentParameters>;
|
|
17
|
+
method?: Overwrite<Methods, local.NetworkBeforeRequestSentParameters>;
|
|
18
|
+
url?: Overwrite<string, local.NetworkBeforeRequestSentParameters>;
|
|
19
|
+
}
|
|
20
|
+
export interface RespondWithOptions extends Omit<RequestWithOptions, 'url' | 'method'> {
|
|
21
|
+
statusCode?: Overwrite<number, local.NetworkResponseCompletedParameters>;
|
|
22
|
+
}
|
|
23
|
+
export interface MockRequestOptions {
|
|
24
|
+
requestWith?: RequestWithOptions;
|
|
93
25
|
}
|
|
94
|
-
export type
|
|
26
|
+
export type MockOptions = MockFilterOptions & MockRequestOptions;
|
|
27
|
+
export {};
|
|
95
28
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/interception/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utils/interception/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C,MAAM,MAAM,iBAAiB,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAA;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,CAAA;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,CAAA;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,CAAA;IACzF,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,CAAA;IACvD,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,CAAA;CACjE,CAAA;AAED,KAAK,SAAS,CAAE,CAAC,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC,CAAC,CAAA;AAC3D,KAAK,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAE/E,MAAM,WAAW,kBAAkB;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAC/D,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACvE,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrF,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrE,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAA;CACpE;AAED,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,KAAK,GAAG,QAAQ,CAAC;IAClF,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAA;CAC3E;AAED,MAAM,WAAW,kBAAkB;IAC/B,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACnC;AAED,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { local, remote } from 'webdriver';
|
|
2
|
+
import type { RequestWithOptions, RespondWithOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* parse request or response overwrites to make it compatible with Bidis protocol
|
|
5
|
+
* @param overwrite request or response overwrite
|
|
6
|
+
* @returns object to pass to the protocol
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseOverwrite(overwrite: RequestWithOptions | RespondWithOptions, request: local.NetworkBeforeRequestSentParameters | local.NetworkResponseCompletedParameters): {
|
|
9
|
+
body: remote.NetworkBytesValue | undefined;
|
|
10
|
+
headers: remote.NetworkHeader[];
|
|
11
|
+
cookies: remote.NetworkSetCookieHeader[];
|
|
12
|
+
method: string | undefined;
|
|
13
|
+
statusCode: number | undefined;
|
|
14
|
+
url: string | undefined;
|
|
15
|
+
};
|
|
16
|
+
export declare function getPatternParam(pattern: URLPattern, key: keyof Omit<remote.NetworkUrlPatternPattern, 'type'>): string | undefined;
|
|
17
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/utils/interception/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAExE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,kCAAkC,GAAG,KAAK,CAAC,kCAAkC;;;;;;;EA6E9K;AAED,wBAAgB,eAAe,CAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,MAAM,CAAC,sBAU7G"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* parse request or response overwrites to make it compatible with Bidis protocol
|
|
3
|
+
* @param overwrite request or response overwrite
|
|
4
|
+
* @returns object to pass to the protocol
|
|
5
|
+
*/
|
|
6
|
+
export function parseOverwrite(overwrite, request) {
|
|
7
|
+
let body = undefined;
|
|
8
|
+
if ('body' in overwrite && overwrite.body) {
|
|
9
|
+
const bodyOverwrite = typeof overwrite.body === 'function'
|
|
10
|
+
? overwrite.body(request)
|
|
11
|
+
: overwrite.body;
|
|
12
|
+
body = typeof bodyOverwrite === 'string' ?
|
|
13
|
+
/**
|
|
14
|
+
* if body is a string we can pass it as is
|
|
15
|
+
*/
|
|
16
|
+
{
|
|
17
|
+
type: 'string',
|
|
18
|
+
value: bodyOverwrite
|
|
19
|
+
}
|
|
20
|
+
:
|
|
21
|
+
/**
|
|
22
|
+
* if body is an object we need to encode it
|
|
23
|
+
*/
|
|
24
|
+
{
|
|
25
|
+
type: 'base64',
|
|
26
|
+
value: globalThis.Buffer
|
|
27
|
+
? globalThis.Buffer.from(JSON.stringify(bodyOverwrite || '')).toString('base64')
|
|
28
|
+
: btoa(JSON.stringify(bodyOverwrite))
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
let headers = [];
|
|
32
|
+
const headersOverwrite = typeof overwrite.headers === 'function'
|
|
33
|
+
? overwrite.headers(request)
|
|
34
|
+
: overwrite.headers;
|
|
35
|
+
if (headersOverwrite) {
|
|
36
|
+
headers = Object.entries(headersOverwrite).map(([name, value]) => ({
|
|
37
|
+
name,
|
|
38
|
+
value: { type: 'string', value }
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
let cookies = [];
|
|
42
|
+
if ('cookies' in overwrite && overwrite.cookies) {
|
|
43
|
+
const cookieOverwrite = typeof overwrite.cookies === 'function'
|
|
44
|
+
? overwrite.cookies(request) || []
|
|
45
|
+
: overwrite.cookies;
|
|
46
|
+
cookies = cookieOverwrite.map((cookie) => ({
|
|
47
|
+
name: cookie.name,
|
|
48
|
+
value: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
value: cookie.value
|
|
51
|
+
},
|
|
52
|
+
domain: cookie.domain,
|
|
53
|
+
path: cookie.path,
|
|
54
|
+
expires: cookie.expiry,
|
|
55
|
+
httpOnly: cookie.httpOnly,
|
|
56
|
+
secure: cookie.secure,
|
|
57
|
+
sameSite: cookie.sameSite?.toLowerCase(),
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
let statusCode = undefined;
|
|
61
|
+
if ('statusCode' in overwrite && overwrite.statusCode) {
|
|
62
|
+
const statusCodeOverwrite = typeof overwrite.statusCode === 'function'
|
|
63
|
+
? overwrite.statusCode(request)
|
|
64
|
+
: overwrite.statusCode;
|
|
65
|
+
statusCode = statusCodeOverwrite;
|
|
66
|
+
}
|
|
67
|
+
const method = 'method' in overwrite
|
|
68
|
+
? typeof overwrite.method === 'function'
|
|
69
|
+
? overwrite.method(request)
|
|
70
|
+
: overwrite.method
|
|
71
|
+
: undefined;
|
|
72
|
+
const url = 'url' in overwrite
|
|
73
|
+
? typeof overwrite.url === 'function'
|
|
74
|
+
? overwrite.url(request)
|
|
75
|
+
: overwrite.url
|
|
76
|
+
: undefined;
|
|
77
|
+
return { body, headers, cookies, method, statusCode, url };
|
|
78
|
+
}
|
|
79
|
+
export function getPatternParam(pattern, key) {
|
|
80
|
+
if (key !== 'pathname' && pattern[key] === '*') {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (key === 'port' && pattern.port === '') {
|
|
84
|
+
return pattern.protocol === 'https' ? '443' : '80';
|
|
85
|
+
}
|
|
86
|
+
return pattern[key].replaceAll('*', '\\*');
|
|
87
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refetchElement.d.ts","sourceRoot":"","sources":["../../src/utils/refetchElement.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAA8B,cAAc,CACxC,cAAc,EAAE,WAAW,CAAC,OAAO,EACnC,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"refetchElement.d.ts","sourceRoot":"","sources":["../../src/utils/refetchElement.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAA8B,cAAc,CACxC,cAAc,EAAE,WAAW,CAAC,OAAO,EACnC,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CA8B9B"}
|
|
@@ -5,14 +5,18 @@ import implicitWait from './implicitWait.js';
|
|
|
5
5
|
*/
|
|
6
6
|
export default async function refetchElement(currentElement, commandName) {
|
|
7
7
|
const selectors = [];
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Crawl back to the browser object, and cache all selectors
|
|
10
|
+
*/
|
|
9
11
|
while (currentElement.elementId && currentElement.parent) {
|
|
10
12
|
selectors.push({ selector: currentElement.selector, index: currentElement.index || 0 });
|
|
11
13
|
currentElement = currentElement.parent;
|
|
12
14
|
}
|
|
13
15
|
selectors.reverse();
|
|
14
16
|
const length = selectors.length;
|
|
15
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Beginning with the browser object, re-chain
|
|
19
|
+
*/
|
|
16
20
|
return selectors.reduce(async (elementPromise, { selector, index }, currentIndex) => {
|
|
17
21
|
const resolvedElement = await elementPromise;
|
|
18
22
|
let nextElement = index > 0 ? (await resolvedElement.$$(selector))[index] : null;
|
|
@@ -24,4 +28,3 @@ export default async function refetchElement(currentElement, commandName) {
|
|
|
24
28
|
return await implicitWait(nextElement, currentIndex + 1 < length ? '$' : commandName);
|
|
25
29
|
}, Promise.resolve(currentElement));
|
|
26
30
|
}
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXRjaEVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvcmVmZXRjaEVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLE1BQU0sbUJBQW1CLENBQUE7QUFHNUM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUN4QyxjQUFtQyxFQUNuQyxXQUFtQjtJQUVuQixNQUFNLFNBQVMsR0FHVCxFQUFFLENBQUE7SUFFUiwyREFBMkQ7SUFDM0QsT0FBTyxjQUFjLENBQUMsU0FBUyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2RCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN2RixjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQTZCLENBQUE7SUFDakUsQ0FBQztJQUNELFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVuQixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFBO0lBRS9CLDZDQUE2QztJQUM3QyxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRTtRQUNoRixNQUFNLGVBQWUsR0FBRyxNQUFNLGNBQWMsQ0FBQTtRQUM1QyxJQUFJLFdBQVcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sZUFBZSxDQUFDLEVBQUUsQ0FBQyxRQUFrQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO1FBQzFGLFdBQVcsR0FBRyxXQUFXLElBQUksTUFBTSxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlEOzs7V0FHRztRQUNILE9BQU8sTUFBTSxZQUFZLENBQUMsV0FBVyxFQUFFLFlBQVksR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBQ3pGLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7QUFDdkMsQ0FBQyJ9
|
|
@@ -268,4 +268,3 @@ export default function querySelectorAllDeep(findMany, s, r) {
|
|
|
268
268
|
}
|
|
269
269
|
return _querySelectorDeep(s, r || document);
|
|
270
270
|
}
|
|
271
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnlTZWxlY3RvclNoYWRvd0RvbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy90aGlyZFBhcnR5L3F1ZXJ5U2VsZWN0b3JTaGFkb3dEb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0NBQWdDO0FBQ2hDLDhCQUE4QjtBQUM5QiwwQkFBMEI7QUFDMUI7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxvQkFBb0IsQ0FBRSxRQUFpQixFQUFFLENBQVMsRUFBRSxDQUFxQjtJQUM3RixTQUFTLGlCQUFpQixDQUFFLEdBQVc7UUFDbkMsOEJBQThCO1FBQzlCLFNBQVMsYUFBYTtZQUNsQixJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNaLHNDQUFzQztnQkFDdEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDakUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDcEIsQ0FBQztnQkFFRCxzQkFBc0I7Z0JBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDMUIsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBYSxFQUFFLEVBQ3ZCLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUNYLG1CQUFtQixHQUFHLGlDQUFpQyxFQUN2RCxrQkFBa0IsR0FBRyxPQUFPLEVBQzVCLGNBQWMsR0FBRztZQUNiLHFCQUFxQixFQUFFLFVBQVU7WUFDakMscUJBQXFCLEVBQUUsV0FBVztZQUNsQyxxQkFBcUIsRUFBRSxXQUFXO1lBQ2xDLElBQUksRUFBRSwrQkFBK0I7WUFDckMsT0FBTyxFQUFFLFVBQVU7U0FDVixDQUFBO1FBQ2pCLElBQUksS0FBSyxFQUNMLFNBQWlCLEVBQ2pCLEtBQWEsRUFDYixj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
|