in lib/cmds/start.ts [381:433]
function waitForAndroid(avdPort: number, avdName: string, appiumPort: string): Promise<void> {
let sdkPath = path.resolve(outputDir, androidSDK.executableFilename());
logger.info('Waiting for ' + avdName + '\'s emulator to start');
return adb(sdkPath, avdPort, 'wait-for-device', maxWait)
.then<void>(
() => {
logger.info('Waiting for ' + avdName + '\'s OS to boot up');
return waitFor(
() => {
return adb(
sdkPath, avdPort, 'shell', maxWait, ['getprop', 'sys.boot_completed']);
},
(status: string) => {
return status.trim() == '1';
},
avdName + '\'s OS');
},
(error: {code: string|number, message: string}) => {
return Promise.reject(
'Failed to wait for ' + avdName + '\'s emulator to start (' + error.code + ': ' +
error.message + ')');
})
.then<string>(() => {
logger.info('Waiting for ' + avdName + ' to be ready to launch chrome');
let version = AndroidSDK.VERSIONS[parseInt(avdName.slice('android-'.length))];
return request('POST', appiumPort, '/wd/hub/session', maxWait, {
desiredCapabilities: {
browserName: 'chrome',
platformName: 'Android',
platformVersion: version,
deviceName: 'Android Emulator'
}
})
.then(
(data) => {
return JSON.parse(data)['sessionId'];
},
(error: {code: string|number, message: string}) => {
return Promise.reject(
'Could not start chrome on ' + avdName + ' (' + error.code + ': ' +
error.message + ')');
});
})
.then<void>((sessionId: string) => {
logger.info('Shutting down dummy chrome instance for ' + avdName);
return request('DELETE', appiumPort, '/wd/hub/session/' + sessionId)
.then<void>(() => {}, (error: {code: string|number, message: string}) => {
return Promise.reject(
'Could not close chrome on ' + avdName + ' (' + error.code + ': ' +
error.message + ')');
});
});
}