@tramvai/test-pw 2.59.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/README.md +55 -0
- package/lib/constants.d.ts +2 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.es.js +163 -0
- package/lib/index.js +179 -0
- package/lib/launch.d.ts +22 -0
- package/lib/router.d.ts +11 -0
- package/lib/utils.d.ts +2 -0
- package/lib/wrapper.d.ts +15 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Tramvai test Playwright
|
|
2
|
+
|
|
3
|
+
Set of helpers for using [playwright](https://playwright.dev) in the integration tests
|
|
4
|
+
|
|
5
|
+
> `Playwright` should be installed separately
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm i --save-dev @tramvai/test-pw
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## How To
|
|
14
|
+
|
|
15
|
+
### Tests in browser
|
|
16
|
+
|
|
17
|
+
`Playwright` runs tests in headless Chrome browser, documentation can be found on [official site](https://pptr.dev/)
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { startCli } from '@tramvai/test-integration';
|
|
21
|
+
import { initPlaywright, wrapPlaywrightPage } from '@tramvai/test-pw';
|
|
22
|
+
|
|
23
|
+
beforeAll(async () => {
|
|
24
|
+
app = await startCli('bootstrap', {
|
|
25
|
+
env: {
|
|
26
|
+
SOME_ENV: 'test',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}, 80000);
|
|
30
|
+
|
|
31
|
+
afterAll(() => {
|
|
32
|
+
return app.close();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('Playwright', async () => {
|
|
36
|
+
const { browser } = await initPlaywright(app.serverUrl);
|
|
37
|
+
|
|
38
|
+
const page = await browser.newPage();
|
|
39
|
+
const wrapper = wrapPlaywrightPage(page);
|
|
40
|
+
|
|
41
|
+
await page.goto(app.serverUrl);
|
|
42
|
+
|
|
43
|
+
expect(
|
|
44
|
+
await page.$eval('.application', (node) => (node as HTMLElement).innerText)
|
|
45
|
+
).toMatchInlineSnapshot(`"Main Page click link"`);
|
|
46
|
+
|
|
47
|
+
await wrapper.router.navigate('./second');
|
|
48
|
+
|
|
49
|
+
expect(
|
|
50
|
+
await page.$eval('.application', (node) => (node as HTMLElement).innerText)
|
|
51
|
+
).toMatchInlineSnapshot(`"Second Page click link"`);
|
|
52
|
+
|
|
53
|
+
await browser.close();
|
|
54
|
+
});
|
|
55
|
+
```
|
package/lib/index.d.ts
ADDED
package/lib/index.es.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { chromium } from 'playwright-core';
|
|
2
|
+
export * from 'playwright-core';
|
|
3
|
+
import { stderr } from 'supports-color';
|
|
4
|
+
import consoleWithStyle from 'console-with-style';
|
|
5
|
+
import { sleep } from '@tramvai/test-integration';
|
|
6
|
+
|
|
7
|
+
const PLAYWRIGHT_DEFAULT_LAUNCH_OPTIONS = {
|
|
8
|
+
args: [
|
|
9
|
+
'--no-sandbox',
|
|
10
|
+
'--disable-setuid-sandbox',
|
|
11
|
+
'--disable-dev-shm-usage',
|
|
12
|
+
process.env.HTTPS_PROXY ? `--proxy-server=${process.env.HTTPS_PROXY}` : '',
|
|
13
|
+
].filter(Boolean),
|
|
14
|
+
headless: process.env.HEADLESS !== 'false',
|
|
15
|
+
timeout: 60 * 3 * 1000,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const wrapRouter = (page) => {
|
|
19
|
+
const navigate = async (options) => {
|
|
20
|
+
return page.evaluate((navigateOptions) => {
|
|
21
|
+
return window.contextExternal.di.get('router pageService').navigate(navigateOptions);
|
|
22
|
+
}, options);
|
|
23
|
+
};
|
|
24
|
+
const navigateThenWaitForReload = async (options) => {
|
|
25
|
+
return Promise.all([
|
|
26
|
+
page.evaluate((navigateOptions) => {
|
|
27
|
+
window.contextExternal.di.get('router pageService').navigate(navigateOptions);
|
|
28
|
+
}, options),
|
|
29
|
+
page.waitForNavigation(),
|
|
30
|
+
]);
|
|
31
|
+
};
|
|
32
|
+
const updateCurrentRoute = async (options) => {
|
|
33
|
+
return page.evaluate((navigateOptions) => {
|
|
34
|
+
return window.contextExternal.di
|
|
35
|
+
.get('router pageService')
|
|
36
|
+
.updateCurrentRoute(navigateOptions);
|
|
37
|
+
}, options);
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
navigate,
|
|
41
|
+
navigateThenWaitForReload,
|
|
42
|
+
updateCurrentRoute,
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// reference: https://github.com/vercel/next.js/blob/canary/packages/next/client/app-index.tsx#L162
|
|
47
|
+
const waitHydrated = (page) => {
|
|
48
|
+
return Promise.race([
|
|
49
|
+
page.waitForFunction(() => {
|
|
50
|
+
return (window.contextExternal &&
|
|
51
|
+
window.contextExternal.di.get({ token: '__TRAMVAI_HYDRATED', optional: true }));
|
|
52
|
+
}, { polling: 100 }),
|
|
53
|
+
sleep(10000),
|
|
54
|
+
]);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const checkSsrErrors = (text) => {
|
|
58
|
+
if (text.indexOf('Server: "%s" Client: "%s"%s') !== -1) {
|
|
59
|
+
throw new Error(`SSR breaking error: ${text}`);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const format = consoleWithStyle((stderr && stderr.level) || 0);
|
|
63
|
+
const { nativeConsole } = global;
|
|
64
|
+
const wrapPlaywrightPage = (page) => {
|
|
65
|
+
if (page.url() && page.url() !== 'about:blank') {
|
|
66
|
+
throw new Error(`You should wrap blank page before navigation, but page already has url "${page.url()}"`);
|
|
67
|
+
}
|
|
68
|
+
const originalGoto = page.goto;
|
|
69
|
+
// wait for page loading and hydration, because selective hydration ends later
|
|
70
|
+
// eslint-disable-next-line no-param-reassign
|
|
71
|
+
page.goto = async function goto(...args) {
|
|
72
|
+
const [response] = await Promise.all([
|
|
73
|
+
originalGoto.apply(page, args),
|
|
74
|
+
page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
|
|
75
|
+
]);
|
|
76
|
+
await waitHydrated(page);
|
|
77
|
+
return response;
|
|
78
|
+
};
|
|
79
|
+
page.on('requestfailed', (request) => nativeConsole.error('[PAGE REQUEST FAILED]', {
|
|
80
|
+
error: request.failure(),
|
|
81
|
+
url: request.url(),
|
|
82
|
+
headers: request.headers(),
|
|
83
|
+
}));
|
|
84
|
+
page.on('crash', (error) => {
|
|
85
|
+
nativeConsole.error(`[PAGE CRASHED]`, error);
|
|
86
|
+
});
|
|
87
|
+
page.on('pageerror', (error) => {
|
|
88
|
+
nativeConsole.error(`[PAGE ERROR]`, error.message);
|
|
89
|
+
});
|
|
90
|
+
page.on('console', async (consoleObj) => {
|
|
91
|
+
const args = consoleObj.args();
|
|
92
|
+
const text = consoleObj.text();
|
|
93
|
+
const messages = [];
|
|
94
|
+
checkSsrErrors(text);
|
|
95
|
+
for (let i = 0; i < args.length; i++) {
|
|
96
|
+
const arg = args[i];
|
|
97
|
+
const json = await arg.jsonValue().catch(() => null);
|
|
98
|
+
messages.push(json);
|
|
99
|
+
}
|
|
100
|
+
const logLevel = consoleObj.type() === 'error' ? 'error' : 'log';
|
|
101
|
+
const consoleArgs = messages.length ? messages : [text];
|
|
102
|
+
nativeConsole[logLevel](`[PAGE ${consoleObj.type().toUpperCase()}]`, format(...consoleArgs));
|
|
103
|
+
});
|
|
104
|
+
return {
|
|
105
|
+
page,
|
|
106
|
+
reset: (url = 'about:blank') => {
|
|
107
|
+
return page.goto(url);
|
|
108
|
+
},
|
|
109
|
+
waitForUrl: (url) => {
|
|
110
|
+
return page.waitForFunction((expectedUrl) => {
|
|
111
|
+
return window.location.href === expectedUrl;
|
|
112
|
+
}, url);
|
|
113
|
+
},
|
|
114
|
+
router: wrapRouter(page),
|
|
115
|
+
close: () => {
|
|
116
|
+
return page.close();
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
// проставляет данные в localStorage на домене, по факту не заходя ни на какую страницу
|
|
122
|
+
// идея взята из https://github.com/puppeteer/puppeteer/issues/3692#issuecomment-453186180
|
|
123
|
+
const enableBrowserLogger = async ({ browser, serverUrl, }) => {
|
|
124
|
+
const page = await browser.newPage();
|
|
125
|
+
page.route('**/*', (route) => {
|
|
126
|
+
route.fulfill({
|
|
127
|
+
status: 200,
|
|
128
|
+
contentType: 'text/plain',
|
|
129
|
+
body: 'tweak me.',
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
await page.goto(serverUrl, { timeout: 0 });
|
|
133
|
+
await page.evaluate(() => {
|
|
134
|
+
localStorage.setItem('_t_logger', '{"level":10,"enabledName":["command:*"],"enabledLevel":[50]}');
|
|
135
|
+
});
|
|
136
|
+
await page.close();
|
|
137
|
+
};
|
|
138
|
+
const initPlaywright = async (serverUrl, { enableLogging = true, ...options } = {}) => {
|
|
139
|
+
const browser = await chromium.launch({
|
|
140
|
+
...PLAYWRIGHT_DEFAULT_LAUNCH_OPTIONS,
|
|
141
|
+
...options,
|
|
142
|
+
});
|
|
143
|
+
if (enableLogging) {
|
|
144
|
+
await enableBrowserLogger({ browser, serverUrl });
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
browser,
|
|
148
|
+
getPageWrapper: async (url) => {
|
|
149
|
+
const page = await browser.newPage();
|
|
150
|
+
await page.setDefaultNavigationTimeout(60000);
|
|
151
|
+
const wrapper = wrapPlaywrightPage(page);
|
|
152
|
+
if (url) {
|
|
153
|
+
await page.goto(url);
|
|
154
|
+
}
|
|
155
|
+
return wrapper;
|
|
156
|
+
},
|
|
157
|
+
close: () => {
|
|
158
|
+
return browser.close();
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export { PLAYWRIGHT_DEFAULT_LAUNCH_OPTIONS, initPlaywright, waitHydrated, wrapPlaywrightPage };
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var playwrightCore = require('playwright-core');
|
|
6
|
+
var supportsColor = require('supports-color');
|
|
7
|
+
var consoleWithStyle = require('console-with-style');
|
|
8
|
+
var testIntegration = require('@tramvai/test-integration');
|
|
9
|
+
|
|
10
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
11
|
+
|
|
12
|
+
var consoleWithStyle__default = /*#__PURE__*/_interopDefaultLegacy(consoleWithStyle);
|
|
13
|
+
|
|
14
|
+
const PLAYWRIGHT_DEFAULT_LAUNCH_OPTIONS = {
|
|
15
|
+
args: [
|
|
16
|
+
'--no-sandbox',
|
|
17
|
+
'--disable-setuid-sandbox',
|
|
18
|
+
'--disable-dev-shm-usage',
|
|
19
|
+
process.env.HTTPS_PROXY ? `--proxy-server=${process.env.HTTPS_PROXY}` : '',
|
|
20
|
+
].filter(Boolean),
|
|
21
|
+
headless: process.env.HEADLESS !== 'false',
|
|
22
|
+
timeout: 60 * 3 * 1000,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const wrapRouter = (page) => {
|
|
26
|
+
const navigate = async (options) => {
|
|
27
|
+
return page.evaluate((navigateOptions) => {
|
|
28
|
+
return window.contextExternal.di.get('router pageService').navigate(navigateOptions);
|
|
29
|
+
}, options);
|
|
30
|
+
};
|
|
31
|
+
const navigateThenWaitForReload = async (options) => {
|
|
32
|
+
return Promise.all([
|
|
33
|
+
page.evaluate((navigateOptions) => {
|
|
34
|
+
window.contextExternal.di.get('router pageService').navigate(navigateOptions);
|
|
35
|
+
}, options),
|
|
36
|
+
page.waitForNavigation(),
|
|
37
|
+
]);
|
|
38
|
+
};
|
|
39
|
+
const updateCurrentRoute = async (options) => {
|
|
40
|
+
return page.evaluate((navigateOptions) => {
|
|
41
|
+
return window.contextExternal.di
|
|
42
|
+
.get('router pageService')
|
|
43
|
+
.updateCurrentRoute(navigateOptions);
|
|
44
|
+
}, options);
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
navigate,
|
|
48
|
+
navigateThenWaitForReload,
|
|
49
|
+
updateCurrentRoute,
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// reference: https://github.com/vercel/next.js/blob/canary/packages/next/client/app-index.tsx#L162
|
|
54
|
+
const waitHydrated = (page) => {
|
|
55
|
+
return Promise.race([
|
|
56
|
+
page.waitForFunction(() => {
|
|
57
|
+
return (window.contextExternal &&
|
|
58
|
+
window.contextExternal.di.get({ token: '__TRAMVAI_HYDRATED', optional: true }));
|
|
59
|
+
}, { polling: 100 }),
|
|
60
|
+
testIntegration.sleep(10000),
|
|
61
|
+
]);
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const checkSsrErrors = (text) => {
|
|
65
|
+
if (text.indexOf('Server: "%s" Client: "%s"%s') !== -1) {
|
|
66
|
+
throw new Error(`SSR breaking error: ${text}`);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const format = consoleWithStyle__default["default"]((supportsColor.stderr && supportsColor.stderr.level) || 0);
|
|
70
|
+
const { nativeConsole } = global;
|
|
71
|
+
const wrapPlaywrightPage = (page) => {
|
|
72
|
+
if (page.url() && page.url() !== 'about:blank') {
|
|
73
|
+
throw new Error(`You should wrap blank page before navigation, but page already has url "${page.url()}"`);
|
|
74
|
+
}
|
|
75
|
+
const originalGoto = page.goto;
|
|
76
|
+
// wait for page loading and hydration, because selective hydration ends later
|
|
77
|
+
// eslint-disable-next-line no-param-reassign
|
|
78
|
+
page.goto = async function goto(...args) {
|
|
79
|
+
const [response] = await Promise.all([
|
|
80
|
+
originalGoto.apply(page, args),
|
|
81
|
+
page.waitForNavigation({ waitUntil: 'domcontentloaded' }),
|
|
82
|
+
]);
|
|
83
|
+
await waitHydrated(page);
|
|
84
|
+
return response;
|
|
85
|
+
};
|
|
86
|
+
page.on('requestfailed', (request) => nativeConsole.error('[PAGE REQUEST FAILED]', {
|
|
87
|
+
error: request.failure(),
|
|
88
|
+
url: request.url(),
|
|
89
|
+
headers: request.headers(),
|
|
90
|
+
}));
|
|
91
|
+
page.on('crash', (error) => {
|
|
92
|
+
nativeConsole.error(`[PAGE CRASHED]`, error);
|
|
93
|
+
});
|
|
94
|
+
page.on('pageerror', (error) => {
|
|
95
|
+
nativeConsole.error(`[PAGE ERROR]`, error.message);
|
|
96
|
+
});
|
|
97
|
+
page.on('console', async (consoleObj) => {
|
|
98
|
+
const args = consoleObj.args();
|
|
99
|
+
const text = consoleObj.text();
|
|
100
|
+
const messages = [];
|
|
101
|
+
checkSsrErrors(text);
|
|
102
|
+
for (let i = 0; i < args.length; i++) {
|
|
103
|
+
const arg = args[i];
|
|
104
|
+
const json = await arg.jsonValue().catch(() => null);
|
|
105
|
+
messages.push(json);
|
|
106
|
+
}
|
|
107
|
+
const logLevel = consoleObj.type() === 'error' ? 'error' : 'log';
|
|
108
|
+
const consoleArgs = messages.length ? messages : [text];
|
|
109
|
+
nativeConsole[logLevel](`[PAGE ${consoleObj.type().toUpperCase()}]`, format(...consoleArgs));
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
page,
|
|
113
|
+
reset: (url = 'about:blank') => {
|
|
114
|
+
return page.goto(url);
|
|
115
|
+
},
|
|
116
|
+
waitForUrl: (url) => {
|
|
117
|
+
return page.waitForFunction((expectedUrl) => {
|
|
118
|
+
return window.location.href === expectedUrl;
|
|
119
|
+
}, url);
|
|
120
|
+
},
|
|
121
|
+
router: wrapRouter(page),
|
|
122
|
+
close: () => {
|
|
123
|
+
return page.close();
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// проставляет данные в localStorage на домене, по факту не заходя ни на какую страницу
|
|
129
|
+
// идея взята из https://github.com/puppeteer/puppeteer/issues/3692#issuecomment-453186180
|
|
130
|
+
const enableBrowserLogger = async ({ browser, serverUrl, }) => {
|
|
131
|
+
const page = await browser.newPage();
|
|
132
|
+
page.route('**/*', (route) => {
|
|
133
|
+
route.fulfill({
|
|
134
|
+
status: 200,
|
|
135
|
+
contentType: 'text/plain',
|
|
136
|
+
body: 'tweak me.',
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
await page.goto(serverUrl, { timeout: 0 });
|
|
140
|
+
await page.evaluate(() => {
|
|
141
|
+
localStorage.setItem('_t_logger', '{"level":10,"enabledName":["command:*"],"enabledLevel":[50]}');
|
|
142
|
+
});
|
|
143
|
+
await page.close();
|
|
144
|
+
};
|
|
145
|
+
const initPlaywright = async (serverUrl, { enableLogging = true, ...options } = {}) => {
|
|
146
|
+
const browser = await playwrightCore.chromium.launch({
|
|
147
|
+
...PLAYWRIGHT_DEFAULT_LAUNCH_OPTIONS,
|
|
148
|
+
...options,
|
|
149
|
+
});
|
|
150
|
+
if (enableLogging) {
|
|
151
|
+
await enableBrowserLogger({ browser, serverUrl });
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
browser,
|
|
155
|
+
getPageWrapper: async (url) => {
|
|
156
|
+
const page = await browser.newPage();
|
|
157
|
+
await page.setDefaultNavigationTimeout(60000);
|
|
158
|
+
const wrapper = wrapPlaywrightPage(page);
|
|
159
|
+
if (url) {
|
|
160
|
+
await page.goto(url);
|
|
161
|
+
}
|
|
162
|
+
return wrapper;
|
|
163
|
+
},
|
|
164
|
+
close: () => {
|
|
165
|
+
return browser.close();
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
exports.PLAYWRIGHT_DEFAULT_LAUNCH_OPTIONS = PLAYWRIGHT_DEFAULT_LAUNCH_OPTIONS;
|
|
171
|
+
exports.initPlaywright = initPlaywright;
|
|
172
|
+
exports.waitHydrated = waitHydrated;
|
|
173
|
+
exports.wrapPlaywrightPage = wrapPlaywrightPage;
|
|
174
|
+
Object.keys(playwrightCore).forEach(function (k) {
|
|
175
|
+
if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, {
|
|
176
|
+
enumerable: true,
|
|
177
|
+
get: function () { return playwrightCore[k]; }
|
|
178
|
+
});
|
|
179
|
+
});
|
package/lib/launch.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Browser } from 'playwright-core';
|
|
2
|
+
import { chromium } from 'playwright-core';
|
|
3
|
+
type PWOptions = Parameters<typeof chromium.launch>[0];
|
|
4
|
+
type Options = PWOptions & {
|
|
5
|
+
enableLogging?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare const initPlaywright: (serverUrl: string, { enableLogging, ...options }?: Options) => Promise<{
|
|
8
|
+
browser: Browser;
|
|
9
|
+
getPageWrapper: (url?: string) => Promise<{
|
|
10
|
+
page: import("playwright-core").Page;
|
|
11
|
+
reset: (url?: string) => Promise<import("playwright-core").Response | null>;
|
|
12
|
+
waitForUrl: (url: string) => Promise<import("playwright-core").JSHandle<false> | import("playwright-core").JSHandle<true>>;
|
|
13
|
+
router: {
|
|
14
|
+
navigate: (options: string | import("@tinkoff/router").NavigateOptions) => Promise<any>;
|
|
15
|
+
navigateThenWaitForReload: (options: string | import("@tinkoff/router").NavigateOptions) => Promise<[void, import("playwright-core").Response | null]>;
|
|
16
|
+
updateCurrentRoute: (options: import("@tinkoff/router").BaseNavigateOptions) => Promise<any>;
|
|
17
|
+
};
|
|
18
|
+
close: () => Promise<void>;
|
|
19
|
+
}>;
|
|
20
|
+
close: () => Promise<void>;
|
|
21
|
+
}>;
|
|
22
|
+
export {};
|
package/lib/router.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Page } from 'playwright-core';
|
|
2
|
+
import type { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router';
|
|
3
|
+
type PageService = typeof PAGE_SERVICE_TOKEN;
|
|
4
|
+
type NavigateOptions = Parameters<PageService['navigate']>[0];
|
|
5
|
+
type UpdateCurrentRouteOptions = Parameters<PageService['updateCurrentRoute']>[0];
|
|
6
|
+
export declare const wrapRouter: (page: Page) => {
|
|
7
|
+
navigate: (options: NavigateOptions) => Promise<any>;
|
|
8
|
+
navigateThenWaitForReload: (options: NavigateOptions) => Promise<[void, import("playwright-core").Response | null]>;
|
|
9
|
+
updateCurrentRoute: (options: UpdateCurrentRouteOptions) => Promise<any>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
package/lib/utils.d.ts
ADDED
package/lib/wrapper.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Page } from 'playwright-core';
|
|
2
|
+
declare global {
|
|
3
|
+
var nativeConsole: typeof console;
|
|
4
|
+
}
|
|
5
|
+
export declare const wrapPlaywrightPage: (page: Page) => {
|
|
6
|
+
page: Page;
|
|
7
|
+
reset: (url?: string) => Promise<import("playwright-core").Response | null>;
|
|
8
|
+
waitForUrl: (url: string) => Promise<import("playwright-core").JSHandle<false> | import("playwright-core").JSHandle<true>>;
|
|
9
|
+
router: {
|
|
10
|
+
navigate: (options: string | import("@tinkoff/router").NavigateOptions) => Promise<any>;
|
|
11
|
+
navigateThenWaitForReload: (options: string | import("@tinkoff/router").NavigateOptions) => Promise<[void, import("playwright-core").Response | null]>;
|
|
12
|
+
updateCurrentRoute: (options: import("@tinkoff/router").BaseNavigateOptions) => Promise<any>;
|
|
13
|
+
};
|
|
14
|
+
close: () => Promise<void>;
|
|
15
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tramvai/test-pw",
|
|
3
|
+
"version": "2.59.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"typings": "lib/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"lib"
|
|
9
|
+
],
|
|
10
|
+
"sideEffects": false,
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git@github.com:Tinkoff/tramvai.git"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tramvai-build --for-publish",
|
|
17
|
+
"watch": "tsc -w",
|
|
18
|
+
"build-for-publish": "true"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@tinkoff/utils": "^2.1.2",
|
|
22
|
+
"@tramvai/test-integration": "2.59.0",
|
|
23
|
+
"@tramvai/tokens-router": "2.59.0",
|
|
24
|
+
"console-with-style": "^1.1.0",
|
|
25
|
+
"supports-color": "8.1.1",
|
|
26
|
+
"tslib": "^2.4.0",
|
|
27
|
+
"playwright-core": "1.29.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/supports-color": "^8.1.1",
|
|
32
|
+
"playwright-core": "1.29.0"
|
|
33
|
+
},
|
|
34
|
+
"license": "Apache-2.0",
|
|
35
|
+
"module": "lib/index.es.js"
|
|
36
|
+
}
|