api: introduce Browser.version() (#3177)
This commit is contained in:
parent
e406119f0c
commit
97c10002e7
10
docs/api.md
10
docs/api.md
|
|
@ -155,6 +155,7 @@ See [ChromiumBrowser], [FirefoxBrowser] and [WebKitBrowser] for browser-specific
|
||||||
- [browser.isConnected()](#browserisconnected)
|
- [browser.isConnected()](#browserisconnected)
|
||||||
- [browser.newContext([options])](#browsernewcontextoptions)
|
- [browser.newContext([options])](#browsernewcontextoptions)
|
||||||
- [browser.newPage([options])](#browsernewpageoptions)
|
- [browser.newPage([options])](#browsernewpageoptions)
|
||||||
|
- [browser.version()](#browserversion)
|
||||||
<!-- GEN:stop -->
|
<!-- GEN:stop -->
|
||||||
|
|
||||||
#### event: 'disconnected'
|
#### event: 'disconnected'
|
||||||
|
|
@ -266,6 +267,12 @@ Creates a new page in a new browser context. Closing this page will close the co
|
||||||
|
|
||||||
This is a convenience API that should only be used for the single-page scenarios and short snippets. Production code and testing frameworks should explicitly create [browser.newContext](#browsernewcontextoptions) followed by the [browserContext.newPage](#browsercontextnewpage) to control their exact life times.
|
This is a convenience API that should only be used for the single-page scenarios and short snippets. Production code and testing frameworks should explicitly create [browser.newContext](#browsernewcontextoptions) followed by the [browserContext.newPage](#browsercontextnewpage) to control their exact life times.
|
||||||
|
|
||||||
|
#### browser.version()
|
||||||
|
|
||||||
|
- returns: <[string]>
|
||||||
|
|
||||||
|
Returns the browser version.
|
||||||
|
|
||||||
### class: BrowserContext
|
### class: BrowserContext
|
||||||
|
|
||||||
* extends: [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter)
|
* extends: [EventEmitter](https://nodejs.org/api/events.html#events_class_eventemitter)
|
||||||
|
|
@ -4180,6 +4187,7 @@ await browser.stopTracing();
|
||||||
- [browser.isConnected()](#browserisconnected)
|
- [browser.isConnected()](#browserisconnected)
|
||||||
- [browser.newContext([options])](#browsernewcontextoptions)
|
- [browser.newContext([options])](#browsernewcontextoptions)
|
||||||
- [browser.newPage([options])](#browsernewpageoptions)
|
- [browser.newPage([options])](#browsernewpageoptions)
|
||||||
|
- [browser.version()](#browserversion)
|
||||||
<!-- GEN:stop -->
|
<!-- GEN:stop -->
|
||||||
|
|
||||||
#### chromiumBrowser.newBrowserCDPSession()
|
#### chromiumBrowser.newBrowserCDPSession()
|
||||||
|
|
@ -4387,6 +4395,7 @@ Firefox browser instance does not expose Firefox-specific features.
|
||||||
- [browser.isConnected()](#browserisconnected)
|
- [browser.isConnected()](#browserisconnected)
|
||||||
- [browser.newContext([options])](#browsernewcontextoptions)
|
- [browser.newContext([options])](#browsernewcontextoptions)
|
||||||
- [browser.newPage([options])](#browsernewpageoptions)
|
- [browser.newPage([options])](#browsernewpageoptions)
|
||||||
|
- [browser.version()](#browserversion)
|
||||||
<!-- GEN:stop -->
|
<!-- GEN:stop -->
|
||||||
|
|
||||||
### class: WebKitBrowser
|
### class: WebKitBrowser
|
||||||
|
|
@ -4402,6 +4411,7 @@ WebKit browser instance does not expose WebKit-specific features.
|
||||||
- [browser.isConnected()](#browserisconnected)
|
- [browser.isConnected()](#browserisconnected)
|
||||||
- [browser.newContext([options])](#browsernewcontextoptions)
|
- [browser.newContext([options])](#browsernewcontextoptions)
|
||||||
- [browser.newPage([options])](#browsernewpageoptions)
|
- [browser.newPage([options])](#browsernewpageoptions)
|
||||||
|
- [browser.version()](#browserversion)
|
||||||
<!-- GEN:stop -->
|
<!-- GEN:stop -->
|
||||||
|
|
||||||
### Environment Variables
|
### Environment Variables
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ export interface Browser extends EventEmitter {
|
||||||
newPage(options?: BrowserContextOptions): Promise<Page>;
|
newPage(options?: BrowserContextOptions): Promise<Page>;
|
||||||
isConnected(): boolean;
|
isConnected(): boolean;
|
||||||
close(): Promise<void>;
|
close(): Promise<void>;
|
||||||
|
version(): string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export abstract class BrowserBase extends EventEmitter implements Browser {
|
export abstract class BrowserBase extends EventEmitter implements Browser {
|
||||||
|
|
@ -61,6 +62,7 @@ export abstract class BrowserBase extends EventEmitter implements Browser {
|
||||||
abstract contexts(): BrowserContext[];
|
abstract contexts(): BrowserContext[];
|
||||||
abstract isConnected(): boolean;
|
abstract isConnected(): boolean;
|
||||||
abstract _disconnect(): void;
|
abstract _disconnect(): void;
|
||||||
|
abstract version(): string;
|
||||||
|
|
||||||
async newPage(options?: BrowserContextOptions): Promise<Page> {
|
async newPage(options?: BrowserContextOptions): Promise<Page> {
|
||||||
const context = await this.newContext(options);
|
const context = await this.newContext(options);
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ export class CRBrowser extends BrowserBase {
|
||||||
_serviceWorkers = new Map<string, CRServiceWorker>();
|
_serviceWorkers = new Map<string, CRServiceWorker>();
|
||||||
_devtools?: CRDevTools;
|
_devtools?: CRDevTools;
|
||||||
_isMac = false;
|
_isMac = false;
|
||||||
|
private _version = '';
|
||||||
|
|
||||||
private _tracingRecording = false;
|
private _tracingRecording = false;
|
||||||
private _tracingPath: string | null = '';
|
private _tracingPath: string | null = '';
|
||||||
|
|
@ -53,6 +54,7 @@ export class CRBrowser extends BrowserBase {
|
||||||
const session = connection.rootSession;
|
const session = connection.rootSession;
|
||||||
const version = await session.send('Browser.getVersion');
|
const version = await session.send('Browser.getVersion');
|
||||||
browser._isMac = version.userAgent.includes('Macintosh');
|
browser._isMac = version.userAgent.includes('Macintosh');
|
||||||
|
browser._version = version.product.substring(version.product.indexOf('/') + 1);
|
||||||
if (!options.persistent) {
|
if (!options.persistent) {
|
||||||
await session.send('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true });
|
await session.send('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true });
|
||||||
return browser;
|
return browser;
|
||||||
|
|
@ -110,6 +112,10 @@ export class CRBrowser extends BrowserBase {
|
||||||
return Array.from(this._contexts.values());
|
return Array.from(this._contexts.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
version(): string {
|
||||||
|
return this._version;
|
||||||
|
}
|
||||||
|
|
||||||
_onAttachedToTarget({targetInfo, sessionId, waitingForDebugger}: Protocol.Target.attachedToTargetPayload) {
|
_onAttachedToTarget({targetInfo, sessionId, waitingForDebugger}: Protocol.Target.attachedToTargetPayload) {
|
||||||
if (targetInfo.type === 'browser')
|
if (targetInfo.type === 'browser')
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -33,12 +33,14 @@ export class FFBrowser extends BrowserBase {
|
||||||
readonly _ffPages: Map<string, FFPage>;
|
readonly _ffPages: Map<string, FFPage>;
|
||||||
readonly _contexts: Map<string, FFBrowserContext>;
|
readonly _contexts: Map<string, FFBrowserContext>;
|
||||||
private _eventListeners: RegisteredListener[];
|
private _eventListeners: RegisteredListener[];
|
||||||
|
private _version = '';
|
||||||
|
|
||||||
static async connect(transport: ConnectionTransport, options: BrowserOptions): Promise<FFBrowser> {
|
static async connect(transport: ConnectionTransport, options: BrowserOptions): Promise<FFBrowser> {
|
||||||
const connection = new FFConnection(SlowMoTransport.wrap(transport, options.slowMo), options.loggers);
|
const connection = new FFConnection(SlowMoTransport.wrap(transport, options.slowMo), options.loggers);
|
||||||
const browser = new FFBrowser(connection, options);
|
const browser = new FFBrowser(connection, options);
|
||||||
const promises: Promise<any>[] = [
|
const promises: Promise<any>[] = [
|
||||||
connection.send('Browser.enable', { attachToDefaultContext: !!options.persistent }),
|
connection.send('Browser.enable', { attachToDefaultContext: !!options.persistent }),
|
||||||
|
browser._initVersion(),
|
||||||
];
|
];
|
||||||
if (options.persistent) {
|
if (options.persistent) {
|
||||||
browser._defaultContext = new FFBrowserContext(browser, null, options.persistent);
|
browser._defaultContext = new FFBrowserContext(browser, null, options.persistent);
|
||||||
|
|
@ -62,6 +64,11 @@ export class FFBrowser extends BrowserBase {
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async _initVersion() {
|
||||||
|
const result = await this._connection.send('Browser.getInfo');
|
||||||
|
this._version = result.version.substring(result.version.indexOf('/') + 1);
|
||||||
|
}
|
||||||
|
|
||||||
isConnected(): boolean {
|
isConnected(): boolean {
|
||||||
return !this._connection._closed;
|
return !this._connection._closed;
|
||||||
}
|
}
|
||||||
|
|
@ -81,6 +88,10 @@ export class FFBrowser extends BrowserBase {
|
||||||
return Array.from(this._contexts.values());
|
return Array.from(this._contexts.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
version(): string {
|
||||||
|
return this._version;
|
||||||
|
}
|
||||||
|
|
||||||
_onDetachedFromTarget(payload: Protocol.Browser.detachedFromTargetPayload) {
|
_onDetachedFromTarget(payload: Protocol.Browser.detachedFromTargetPayload) {
|
||||||
const ffPage = this._ffPages.get(payload.targetId)!;
|
const ffPage = this._ffPages.get(payload.targetId)!;
|
||||||
this._ffPages.delete(payload.targetId);
|
this._ffPages.delete(payload.targetId);
|
||||||
|
|
|
||||||
|
|
@ -284,7 +284,9 @@ export type BrowserServerKillParams = {};
|
||||||
export type BrowserServerKillResult = void;
|
export type BrowserServerKillResult = void;
|
||||||
|
|
||||||
// ----------- Browser -----------
|
// ----------- Browser -----------
|
||||||
export type BrowserInitializer = {};
|
export type BrowserInitializer = {
|
||||||
|
version: string,
|
||||||
|
};
|
||||||
export interface BrowserChannel extends Channel {
|
export interface BrowserChannel extends Channel {
|
||||||
on(event: 'close', callback: (params: BrowserCloseEvent) => void): this;
|
on(event: 'close', callback: (params: BrowserCloseEvent) => void): this;
|
||||||
close(params?: BrowserCloseParams): Promise<BrowserCloseResult>;
|
close(params?: BrowserCloseParams): Promise<BrowserCloseResult>;
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,10 @@ export class Browser extends ChannelOwner<BrowserChannel, BrowserInitializer> {
|
||||||
return [...this._contexts];
|
return [...this._contexts];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
version(): string {
|
||||||
|
return this._initializer.version;
|
||||||
|
}
|
||||||
|
|
||||||
async newPage(options: types.BrowserContextOptions & { logger?: LoggerSink } = {}): Promise<Page> {
|
async newPage(options: types.BrowserContextOptions & { logger?: LoggerSink } = {}): Promise<Page> {
|
||||||
const context = await this.newContext(options);
|
const context = await this.newContext(options);
|
||||||
const page = await context.newPage();
|
const page = await context.newPage();
|
||||||
|
|
|
||||||
|
|
@ -362,6 +362,9 @@ BrowserServer:
|
||||||
Browser:
|
Browser:
|
||||||
type: interface
|
type: interface
|
||||||
|
|
||||||
|
initializer:
|
||||||
|
version: string
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
|
|
||||||
close:
|
close:
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ import { headersArrayToObject } from '../serializers';
|
||||||
|
|
||||||
export class BrowserDispatcher extends Dispatcher<Browser, BrowserInitializer> implements BrowserChannel {
|
export class BrowserDispatcher extends Dispatcher<Browser, BrowserInitializer> implements BrowserChannel {
|
||||||
constructor(scope: DispatcherScope, browser: BrowserBase) {
|
constructor(scope: DispatcherScope, browser: BrowserBase) {
|
||||||
super(scope, browser, 'Browser', {}, true);
|
super(scope, browser, 'Browser', { version: browser.version() }, true);
|
||||||
browser.on(Events.Browser.Disconnected, () => {
|
browser.on(Events.Browser.Disconnected, () => {
|
||||||
this._dispatchEvent('close');
|
this._dispatchEvent('close');
|
||||||
this._dispose();
|
this._dispose();
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ import { kPageProxyMessageReceived, PageProxyMessageReceivedPayload, WKConnectio
|
||||||
import { WKPage } from './wkPage';
|
import { WKPage } from './wkPage';
|
||||||
|
|
||||||
const DEFAULT_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15';
|
const DEFAULT_USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15';
|
||||||
|
const BROWSER_VERSION = '14.0';
|
||||||
|
|
||||||
export class WKBrowser extends BrowserBase {
|
export class WKBrowser extends BrowserBase {
|
||||||
private readonly _connection: WKConnection;
|
private readonly _connection: WKConnection;
|
||||||
|
|
@ -85,6 +86,10 @@ export class WKBrowser extends BrowserBase {
|
||||||
return Array.from(this._contexts.values());
|
return Array.from(this._contexts.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
version(): string {
|
||||||
|
return BROWSER_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
_onDownloadCreated(payload: Protocol.Playwright.downloadCreatedPayload) {
|
_onDownloadCreated(payload: Protocol.Playwright.downloadCreatedPayload) {
|
||||||
const page = this._wkPages.get(payload.pageProxyId);
|
const page = this._wkPages.get(payload.pageProxyId);
|
||||||
if (!page)
|
if (!page)
|
||||||
|
|
|
||||||
|
|
@ -38,3 +38,13 @@ describe('Browser.newPage', function() {
|
||||||
expect(error.message).toContain('Please use browser.newContext()');
|
expect(error.message).toContain('Please use browser.newContext()');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Browser.version', function() {
|
||||||
|
it('should work', async function({browser}) {
|
||||||
|
const version = browser.version();
|
||||||
|
if (CHROMIUM)
|
||||||
|
expect(version.match(/^\d+\.\d+\.\d+\.\d+$/)).toBeTruthy();
|
||||||
|
else
|
||||||
|
expect(version.match(/^\d+\.\d+$/)).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue