chore: make Android host option configurable (#13685)

This commit is contained in:
Max Schmitt 2022-04-21 22:16:42 +02:00 committed by GitHub
parent 8c4fc62e8f
commit 4a3180aca9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 36 additions and 12 deletions

View file

@ -82,10 +82,15 @@ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D playwright
Returns the list of detected Android devices. Returns the list of detected Android devices.
### option: Android.devices.host
- `host` <[string]>
Optional host to establish ADB server connection. Default to `127.0.0.1`.
### option: Android.devices.port ### option: Android.devices.port
- `port` <[int]> - `port` <[int]>
Optional port to establish ADB server connection. Optional port to establish ADB server connection. Default to `5037`.
### option: Android.devices.omitDriverInstall ### option: Android.devices.omitDriverInstall
- `omitDriverInstall` <[boolean]> - `omitDriverInstall` <[boolean]>

View file

@ -3697,10 +3697,12 @@ export interface AndroidChannel extends AndroidEventTarget, Channel {
setDefaultTimeoutNoReply(params: AndroidSetDefaultTimeoutNoReplyParams, metadata?: Metadata): Promise<AndroidSetDefaultTimeoutNoReplyResult>; setDefaultTimeoutNoReply(params: AndroidSetDefaultTimeoutNoReplyParams, metadata?: Metadata): Promise<AndroidSetDefaultTimeoutNoReplyResult>;
} }
export type AndroidDevicesParams = { export type AndroidDevicesParams = {
host?: string,
port?: number, port?: number,
omitDriverInstall?: boolean, omitDriverInstall?: boolean,
}; };
export type AndroidDevicesOptions = { export type AndroidDevicesOptions = {
host?: string,
port?: number, port?: number,
omitDriverInstall?: boolean, omitDriverInstall?: boolean,
}; };

View file

@ -2852,6 +2852,7 @@ Android:
devices: devices:
parameters: parameters:
host: string?
port: number? port: number?
omitDriverInstall: boolean? omitDriverInstall: boolean?
returns: returns:

View file

@ -1308,6 +1308,7 @@ export function createScheme(tChannel: (name: string) => Validator): Scheme {
}); });
scheme.ElectronApplicationCloseParams = tOptional(tObject({})); scheme.ElectronApplicationCloseParams = tOptional(tObject({}));
scheme.AndroidDevicesParams = tObject({ scheme.AndroidDevicesParams = tObject({
host: tOptional(tString),
port: tOptional(tNumber), port: tOptional(tNumber),
omitDriverInstall: tOptional(tBoolean), omitDriverInstall: tOptional(tBoolean),
}); });

View file

@ -23,18 +23,27 @@ import { assert, createGuid } from '../../utils';
export class AdbBackend implements Backend { export class AdbBackend implements Backend {
async devices(options: types.AndroidDeviceOptions = {}): Promise<DeviceBackend[]> { async devices(options: types.AndroidDeviceOptions = {}): Promise<DeviceBackend[]> {
const port = options.port ? options.port : 5037; const result = await runCommand('host:devices', options.host, options.port);
const result = await runCommand('host:devices', port);
const lines = result.toString().trim().split('\n'); const lines = result.toString().trim().split('\n');
return lines.map(line => { return lines.map(line => {
const [serial, status] = line.trim().split('\t'); const [serial, status] = line.trim().split('\t');
return new AdbDevice(serial, status, port); return new AdbDevice(serial, status, options.host, options.port);
}); });
} }
} }
class AdbDevice implements DeviceBackend { class AdbDevice implements DeviceBackend {
constructor(readonly serial: string, readonly status: string, readonly port: number) { } serial: string;
status: string;
host: string | undefined;
port: number | undefined;
constructor(serial: string, status: string, host?: string, port?: number) {
this.serial = serial;
this.status = status;
this.host = host;
this.port = port;
}
async init() { async init() {
} }
@ -43,19 +52,19 @@ class AdbDevice implements DeviceBackend {
} }
runCommand(command: string): Promise<Buffer> { runCommand(command: string): Promise<Buffer> {
return runCommand(command, this.port, this.serial); return runCommand(command, this.host, this.port, this.serial);
} }
async open(command: string): Promise<SocketBackend> { async open(command: string): Promise<SocketBackend> {
const result = await open(command, this.port, this.serial); const result = await open(command, this.host, this.port, this.serial);
result.becomeSocket(); result.becomeSocket();
return result; return result;
} }
} }
async function runCommand(command: string, port: number = 5037, serial?: string): Promise<Buffer> { async function runCommand(command: string, host: string = '127.0.0.1', port: number = 5037, serial?: string): Promise<Buffer> {
debug('pw:adb:runCommand')(command, serial); debug('pw:adb:runCommand')(command, serial);
const socket = new BufferedSocketWrapper(command, net.createConnection({ port })); const socket = new BufferedSocketWrapper(command, net.createConnection({ host, port }));
if (serial) { if (serial) {
await socket.write(encodeMessage(`host:transport:${serial}`)); await socket.write(encodeMessage(`host:transport:${serial}`));
const status = await socket.read(4); const status = await socket.read(4);
@ -75,8 +84,8 @@ async function runCommand(command: string, port: number = 5037, serial?: string)
return commandOutput; return commandOutput;
} }
async function open(command: string, port: number = 5037, serial?: string): Promise<BufferedSocketWrapper> { async function open(command: string, host: string = '127.0.0.1', port: number = 5037, serial?: string): Promise<BufferedSocketWrapper> {
const socket = new BufferedSocketWrapper(command, net.createConnection({ port })); const socket = new BufferedSocketWrapper(command, net.createConnection({ host, port }));
if (serial) { if (serial) {
await socket.write(encodeMessage(`host:transport:${serial}`)); await socket.write(encodeMessage(`host:transport:${serial}`));
const status = await socket.read(4); const status = await socket.read(4);

View file

@ -369,6 +369,7 @@ export type APIResponse = {
}; };
export type AndroidDeviceOptions = { export type AndroidDeviceOptions = {
host?: string,
port?: number, port?: number,
omitDriverInstall?: boolean, omitDriverInstall?: boolean,
}; };

View file

@ -11108,13 +11108,18 @@ export interface Android {
* @param options * @param options
*/ */
devices(options?: { devices(options?: {
/**
* Optional host to establish ADB server connection. Default to `127.0.0.1`.
*/
host?: string;
/** /**
* Prevents automatic playwright driver installation on attach. Assumes that the drivers have been installed already. * Prevents automatic playwright driver installation on attach. Assumes that the drivers have been installed already.
*/ */
omitDriverInstall?: boolean; omitDriverInstall?: boolean;
/** /**
* Optional port to establish ADB server connection. * Optional port to establish ADB server connection. Default to `5037`.
*/ */
port?: number; port?: number;
}): Promise<Array<AndroidDevice>>; }): Promise<Array<AndroidDevice>>;