@@ -145,7 +145,7 @@ export class AndroidDevice extends EventEmitter {
145
145
}
146
146
147
147
async open ( command : string ) : Promise < SocketBackend > {
148
- return await this . _backend . open ( `shell: ${ command } ` ) ;
148
+ return await this . _backend . open ( `${ command } ` ) ;
149
149
}
150
150
151
151
private async _driver ( ) : Promise < Transport > {
@@ -167,18 +167,7 @@ export class AndroidDevice extends EventEmitter {
167
167
168
168
debug ( 'pw:android' ) ( 'Starting the new driver' ) ;
169
169
this . shell ( `am instrument -w com.microsoft.playwright.androiddriver.test/androidx.test.runner.AndroidJUnitRunner` ) ;
170
-
171
- debug ( 'pw:android' ) ( 'Polling the socket' ) ;
172
- let socket ;
173
- while ( ! socket ) {
174
- try {
175
- socket = await this . _backend . open ( `localabstract:playwright_android_driver_socket` ) ;
176
- } catch ( e ) {
177
- await new Promise ( f => setTimeout ( f , 100 ) ) ;
178
- }
179
- }
180
-
181
- debug ( 'pw:android' ) ( 'Connected to driver' ) ;
170
+ const socket = await this . _waitForLocalAbstract ( 'playwright_android_driver_socket' ) ;
182
171
const transport = new Transport ( socket , socket , socket , 'be' ) ;
183
172
transport . onmessage = message => {
184
173
const response = JSON . parse ( message ) ;
@@ -197,6 +186,20 @@ export class AndroidDevice extends EventEmitter {
197
186
return this . _driverPromise ;
198
187
}
199
188
189
+ private async _waitForLocalAbstract ( socketName : string ) : Promise < SocketBackend > {
190
+ let socket : SocketBackend | undefined ;
191
+ debug ( 'pw:android' ) ( `Polling the socket localabstract:${ socketName } ` ) ;
192
+ while ( ! socket ) {
193
+ try {
194
+ socket = await this . _backend . open ( `localabstract:${ socketName } ` ) ;
195
+ } catch ( e ) {
196
+ await new Promise ( f => setTimeout ( f , 250 ) ) ;
197
+ }
198
+ }
199
+ debug ( 'pw:android' ) ( `Connected to localabstract:${ socketName } ` ) ;
200
+ return socket ;
201
+ }
202
+
200
203
async send ( method : string , params : any ) : Promise < any > {
201
204
const driver = await this . _driver ( ) ;
202
205
const id = ++ this . _lastId ;
@@ -224,20 +227,11 @@ export class AndroidDevice extends EventEmitter {
224
227
debug ( 'pw:android' ) ( 'Force-stopping' , pkg ) ;
225
228
await this . _backend . runCommand ( `shell:am force-stop ${ pkg } ` ) ;
226
229
227
- const socketName = createGuid ( ) ;
230
+ const socketName = 'playwright-' + createGuid ( ) ;
228
231
const commandLine = `_ --disable-fre --no-default-browser-check --no-first-run --remote-debugging-socket-name=${ socketName } ` ;
229
232
debug ( 'pw:android' ) ( 'Starting' , pkg , commandLine ) ;
230
233
await this . _backend . runCommand ( `shell:echo "${ commandLine } " > /data/local/tmp/chrome-command-line` ) ;
231
234
await this . _backend . runCommand ( `shell:am start -n ${ pkg } /com.google.android.apps.chrome.Main about:blank` ) ;
232
-
233
- debug ( 'pw:android' ) ( 'Polling for socket' , socketName ) ;
234
- while ( true ) {
235
- const net = await this . _backend . runCommand ( `shell:cat /proc/net/unix | grep ${ socketName } $` ) ;
236
- if ( net )
237
- break ;
238
- await new Promise ( f => setTimeout ( f , 100 ) ) ;
239
- }
240
- debug ( 'pw:android' ) ( 'Got the socket, connecting' ) ;
241
235
return await this . _connectToBrowser ( socketName , options ) ;
242
236
}
243
237
@@ -249,8 +243,9 @@ export class AndroidDevice extends EventEmitter {
249
243
}
250
244
251
245
private async _connectToBrowser ( socketName : string , options : types . BrowserContextOptions = { } ) : Promise < BrowserContext > {
252
- const androidBrowser = new AndroidBrowser ( this , socketName ) ;
253
- await androidBrowser . _open ( ) ;
246
+ const socket = await this . _waitForLocalAbstract ( socketName ) ;
247
+ const androidBrowser = new AndroidBrowser ( this , socket ) ;
248
+ await androidBrowser . _init ( ) ;
254
249
this . _browserConnections . add ( androidBrowser ) ;
255
250
256
251
const browserOptions : BrowserOptions = {
@@ -357,17 +352,22 @@ export class AndroidDevice extends EventEmitter {
357
352
358
353
class AndroidBrowser extends EventEmitter {
359
354
readonly device : AndroidDevice ;
360
- readonly socketName : string ;
361
- private _socket : SocketBackend | undefined ;
355
+ private _socket : SocketBackend ;
362
356
private _receiver : stream . Writable ;
363
357
private _waitForNextTask = makeWaitForNextTask ( ) ;
364
358
onmessage ?: ( message : any ) => void ;
365
359
onclose ?: ( ) => void ;
366
360
367
- constructor ( device : AndroidDevice , socketName : string ) {
361
+ constructor ( device : AndroidDevice , socket : SocketBackend ) {
368
362
super ( ) ;
369
363
this . device = device ;
370
- this . socketName = socketName ;
364
+ this . _socket = socket ;
365
+ this . _socket . on ( 'close' , ( ) => {
366
+ this . _waitForNextTask ( ( ) => {
367
+ if ( this . onclose )
368
+ this . onclose ( ) ;
369
+ } ) ;
370
+ } ) ;
371
371
this . _receiver = new ( ws as any ) . Receiver ( ) as stream . Writable ;
372
372
this . _receiver . on ( 'message' , message => {
373
373
this . _waitForNextTask ( ( ) => {
@@ -377,14 +377,7 @@ class AndroidBrowser extends EventEmitter {
377
377
} ) ;
378
378
}
379
379
380
- async _open ( ) {
381
- this . _socket = await this . device . _backend . open ( `localabstract:${ this . socketName } ` ) ;
382
- this . _socket . on ( 'close' , ( ) => {
383
- this . _waitForNextTask ( ( ) => {
384
- if ( this . onclose )
385
- this . onclose ( ) ;
386
- } ) ;
387
- } ) ;
380
+ async _init ( ) {
388
381
await this . _socket . write ( Buffer . from ( `GET /devtools/browser HTTP/1.1\r
389
382
Upgrade: WebSocket\r
390
383
Connection: Upgrade\r
0 commit comments