feat(launchServer): accept wsPath option (#8353)
This commit is contained in:
parent
0997c13151
commit
25a4c7b3df
|
|
@ -284,6 +284,18 @@ const { chromium } = require('playwright'); // Or 'webkit' or 'firefox'.
|
||||||
|
|
||||||
Port to use for the web socket. Defaults to 0 that picks any available port.
|
Port to use for the web socket. Defaults to 0 that picks any available port.
|
||||||
|
|
||||||
|
### option: BrowserType.launchServer.wsPath
|
||||||
|
- `wsPath` <[string]>
|
||||||
|
|
||||||
|
Path at which to serve the Browser Server. For security, this defaults to an
|
||||||
|
unguessable string.
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Any process or web page (including those running in Playwright) with knowledge
|
||||||
|
of the `wsPath` can take control of the OS user. For this reason, you should
|
||||||
|
use an unguessable token when using this option.
|
||||||
|
:::
|
||||||
|
|
||||||
## method: BrowserType.name
|
## method: BrowserType.name
|
||||||
- returns: <[string]>
|
- returns: <[string]>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,9 +52,13 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher {
|
||||||
env: options.env ? envObjectToArray(options.env) : undefined,
|
env: options.env ? envObjectToArray(options.env) : undefined,
|
||||||
}, toProtocolLogger(options.logger));
|
}, toProtocolLogger(options.logger));
|
||||||
|
|
||||||
|
let path = `/${createGuid()}`;
|
||||||
|
if (options.wsPath)
|
||||||
|
path = options.wsPath.startsWith('/') ? options.wsPath : `/${options.wsPath}`;
|
||||||
|
|
||||||
// 2. Start the server
|
// 2. Start the server
|
||||||
const delegate: PlaywrightServerDelegate = {
|
const delegate: PlaywrightServerDelegate = {
|
||||||
path: '/' + createGuid(),
|
path,
|
||||||
allowMultipleClients: true,
|
allowMultipleClients: true,
|
||||||
onClose: () => {},
|
onClose: () => {},
|
||||||
onConnect: this._onConnect.bind(this, playwright, browser),
|
onConnect: this._onConnect.bind(this, playwright, browser),
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@ export type LaunchServerOptions = {
|
||||||
downloadsPath?: string,
|
downloadsPath?: string,
|
||||||
chromiumSandbox?: boolean,
|
chromiumSandbox?: boolean,
|
||||||
port?: number,
|
port?: number,
|
||||||
|
wsPath?: string,
|
||||||
logger?: Logger,
|
logger?: Logger,
|
||||||
} & FirefoxUserPrefs;
|
} & FirefoxUserPrefs;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,26 @@ it.describe('launch server', () => {
|
||||||
await browserServer.close();
|
await browserServer.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should work with wsPath', async ({browserType, browserOptions}) => {
|
||||||
|
const wsPath = '/unguessable-token';
|
||||||
|
const browserServer = await browserType.launchServer({ ...browserOptions, wsPath });
|
||||||
|
expect(browserServer.wsEndpoint()).toMatch(/:\d+\/unguessable-token$/);
|
||||||
|
await browserServer.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should work when wsPath is missing leading slash', async ({browserType, browserOptions}) => {
|
||||||
|
const wsPath = 'unguessable-token';
|
||||||
|
const browserServer = await browserType.launchServer({ ...browserOptions, wsPath });
|
||||||
|
expect(browserServer.wsEndpoint()).toMatch(/:\d+\/unguessable-token$/);
|
||||||
|
await browserServer.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should default to random wsPath', async ({browserType, browserOptions}) => {
|
||||||
|
const browserServer = await browserType.launchServer({ ...browserOptions });
|
||||||
|
expect(browserServer.wsEndpoint()).toMatch(/:\d+\/[a-f\d]{32}$/);
|
||||||
|
await browserServer.close();
|
||||||
|
});
|
||||||
|
|
||||||
it('should provide an error when ws endpoint is incorrect', async ({browserType, browserOptions}) => {
|
it('should provide an error when ws endpoint is incorrect', async ({browserType, browserOptions}) => {
|
||||||
const browserServer = await browserType.launchServer(browserOptions);
|
const browserServer = await browserType.launchServer(browserOptions);
|
||||||
const error = await browserType.connect({ wsEndpoint: browserServer.wsEndpoint() + '-foo' }).catch(e => e);
|
const error = await browserType.connect({ wsEndpoint: browserServer.wsEndpoint() + '-foo' }).catch(e => e);
|
||||||
|
|
|
||||||
8
types/types.d.ts
vendored
8
types/types.d.ts
vendored
|
|
@ -8725,6 +8725,14 @@ export interface BrowserType<Unused = {}> {
|
||||||
* If specified, traces are saved into this directory.
|
* If specified, traces are saved into this directory.
|
||||||
*/
|
*/
|
||||||
tracesDir?: string;
|
tracesDir?: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path at which to serve the Browser Server. For security, this defaults to an unguessable string.
|
||||||
|
*
|
||||||
|
* > NOTE: Any process or web page (including those running in Playwright) with knowledge of the `wsPath` can take control
|
||||||
|
* of the OS user. For this reason, you should use an unguessable token when using this option.
|
||||||
|
*/
|
||||||
|
wsPath?: string;
|
||||||
}): Promise<BrowserServer>;
|
}): Promise<BrowserServer>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue