1. 程式人生 > 其它 >apk部分手機安裝失敗_部分手機adb install快速返回成功導致appium測試失敗的解決辦法...

apk部分手機安裝失敗_部分手機adb install快速返回成功導致appium測試失敗的解決辦法...

技術標籤: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方法同上。