diff --git a/android-types-internal.d.ts b/android-types-internal.d.ts index a1bd5b253a..e835a5d364 100644 --- a/android-types-internal.d.ts +++ b/android-types-internal.d.ts @@ -27,7 +27,7 @@ export interface AndroidDevice exte model(): string; webViews(): AndroidWebView[]; webView(selector: { pkg: string }, options?: { timeout?: number }): Promise>; - shell(command: string): Promise; + shell(command: string): Promise; open(command: string): Promise; installApk(file: string | Buffer, options?: { args?: string[] }): Promise; launchBrowser(options?: BrowserContextOptions & { packageName?: string }): Promise; diff --git a/src/client/android.ts b/src/client/android.ts index 339c48180f..8f709fa4c9 100644 --- a/src/client/android.ts +++ b/src/client/android.ts @@ -198,10 +198,10 @@ export class AndroidDevice extends ChannelOwner { + async shell(command: string): Promise { return this._wrapApiCall('androidDevice.shell', async () => { const { result } = await this._channel.shell({ command }); - return result; + return Buffer.from(result, 'base64'); }); } diff --git a/src/dispatchers/androidDispatcher.ts b/src/dispatchers/androidDispatcher.ts index a952a8d32e..197345f9c1 100644 --- a/src/dispatchers/androidDispatcher.ts +++ b/src/dispatchers/androidDispatcher.ts @@ -137,7 +137,7 @@ export class AndroidDeviceDispatcher extends Dispatcher { - return { result: await this._object.shell(params.command) }; + return { result: (await this._object.shell(params.command)).toString('base64') }; } async open(params: channels.AndroidDeviceOpenParams, metadata?: channels.Metadata): Promise { diff --git a/src/protocol/channels.ts b/src/protocol/channels.ts index dd60c8adbd..ca6b387a24 100644 --- a/src/protocol/channels.ts +++ b/src/protocol/channels.ts @@ -2747,7 +2747,7 @@ export type AndroidDeviceShellOptions = { }; export type AndroidDeviceShellResult = { - result: string, + result: Binary, }; export type AndroidDeviceInstallApkParams = { file: Binary, diff --git a/src/protocol/protocol.yml b/src/protocol/protocol.yml index ad82b20c6d..98b4d4d220 100644 --- a/src/protocol/protocol.yml +++ b/src/protocol/protocol.yml @@ -2303,7 +2303,7 @@ AndroidDevice: parameters: command: string returns: - result: string + result: binary installApk: parameters: diff --git a/src/server/android/android.ts b/src/server/android/android.ts index 197861cfbd..ce7f8760c8 100644 --- a/src/server/android/android.ts +++ b/src/server/android/android.ts @@ -43,7 +43,7 @@ export interface DeviceBackend { status: string; close(): Promise; init(): Promise; - runCommand(command: string): Promise; + runCommand(command: string): Promise; open(command: string): Promise; } @@ -121,7 +121,7 @@ export class AndroidDevice extends EventEmitter { static async create(android: Android, backend: DeviceBackend): Promise { await backend.init(); const model = await backend.runCommand('shell:getprop ro.product.model'); - const device = new AndroidDevice(android, backend, model.trim()); + const device = new AndroidDevice(android, backend, model.toString().trim()); await device._init(); return device; } @@ -138,7 +138,7 @@ export class AndroidDevice extends EventEmitter { this._timeoutSettings.setDefaultTimeout(timeout); } - async shell(command: string): Promise { + async shell(command: string): Promise { const result = await this._backend.runCommand(`shell:${command}`); await this._refreshWebViews(); return result; @@ -288,7 +288,7 @@ export class AndroidDevice extends EventEmitter { } private async _refreshWebViews() { - const sockets = (await this._backend.runCommand(`shell:cat /proc/net/unix | grep webview_devtools_remote`)).split('\n'); + const sockets = (await this._backend.runCommand(`shell:cat /proc/net/unix | grep webview_devtools_remote`)).toString().split('\n'); if (this._isClosed) return; @@ -304,7 +304,7 @@ export class AndroidDevice extends EventEmitter { if (this._webViews.has(pid)) continue; - const procs = (await this._backend.runCommand(`shell:ps -A | grep ${pid}`)).split('\n'); + const procs = (await this._backend.runCommand(`shell:ps -A | grep ${pid}`)).toString().split('\n'); if (this._isClosed) return; let pkg = ''; diff --git a/src/server/android/backendAdb.ts b/src/server/android/backendAdb.ts index ea2b03c89d..2eaa9193c0 100644 --- a/src/server/android/backendAdb.ts +++ b/src/server/android/backendAdb.ts @@ -46,7 +46,7 @@ class AdbDevice implements DeviceBackend { async close() { } - runCommand(command: string): Promise { + runCommand(command: string): Promise { return runCommand(command, this.serial); } @@ -57,7 +57,7 @@ class AdbDevice implements DeviceBackend { } } -async function runCommand(command: string, serial?: string): Promise { +async function runCommand(command: string, serial?: string): Promise { debug('pw:adb:runCommand')(command, serial); const socket = new BufferedSocketWrapper(command, net.createConnection({ port: 5037 })); if (serial) { @@ -70,9 +70,9 @@ async function runCommand(command: string, serial?: string): Promise { assert(status.toString() === 'OKAY', status.toString()); if (!command.startsWith('shell:')) { const remainingLength = parseInt((await socket.read(4)).toString(), 16); - return (await socket.read(remainingLength)).toString(); + return (await socket.read(remainingLength)); } - return (await socket.readAll()).toString(); + return (await socket.readAll()); } async function open(command: string, serial?: string): Promise {