apk部分手機安裝失敗_部分手機adb install快速返回成功導致appium測試失敗的解決辦法...
阿新 • • 發佈:2021-01-09
技術標籤:apk部分手機安裝失敗
我們可以在命令列中執行adb install安裝某個應用,會發現快速返回Success了,而實際應用正在安裝中,這種情況下,appium會誤以為被測應用已經安裝上了,然後去啟動這個app,結果發現app不存在(appium重重試一次,仍然失敗),這種情況下,appium測試100%會失敗。
事故手機:OPPO R9sk
測試的Appium版本:1.12.1
解決方案
找到安裝app的地方,安裝完後,檢測app是否真正安裝成功了,如果沒成功,則等待,直到超時或者成功安裝。
實施辦法
針對UIAutomator1,我們需要更改appium-android-driver,我們找到lib/driver.js的initAUT方法,在程式碼await helpers.installApk(this.adb, this.opts);後加上這個檢測過程:
await helpers.installApk(this.adb, this.opts);
log.info('安裝應用後,檢查被測應用是否存在');
await this.waitPackagePresent(60000);
waitPackagePresent就是這個檢測過程的方法,程式碼如下:
/** * 一定時間內等待某包出現 */ async waitPackagePresent (timeout) { log.info(`waitPackagePresent: ${timeout}`); let start = new Date().getTime(); while (new Date().getTime() - start < timeout) { const appState = await this.adb.getApplicationInstallState(this.opts.app, this.opts.appPackage); log.info(`app state is ${appState} 1`); switch (appState) { case 'notInstalled': log.info(`檢測到${this.opts.appPackage}尚未安裝上,等待1s,繼續檢測`); await sleep(1000); break; default: log.info('被測應用已安裝上'); return true; } } log.errorAndThrow(`Could not find package ${this.opts.appPackage} on the device in ${timeout}`); }
而針對UIAutomator2的話,同樣我們找到UIAutomator2的nodejs驅動工程:appium-uiautomator2-driver,然後找到lib/driver.js,同樣也是在initAUT方法中:
if (this.opts.app) { if (!this.opts.noSign && !await this.adb.checkApkCert(this.opts.app, this.opts.appPackage)) { await helpers.signApp(this.adb, this.opts.app); } await helpers.installApk(this.adb, this.opts); await this.waitPackagePresent(60000); // 這是新增 }
waitPackagePresent方法同上。