某些App通過appium進行安裝時安裝測試時報Error: packageAndLaunchActivityFromManifest failed. Original error的解決辦法

待測試的apk沒有安裝,並且通過appium運行時自動化安裝時報的錯誤提示信息如下:

[ADB] Using aapt.exe from D:\adt-bundle-windows-x86_64-20140702\sdk\build-tools\android-4.4W\aapt.exe
[ADB] Extracting package and launch activity from manifest
[ADB] Error: packageAndLaunchActivityFromManifest failed. Original error: Path must be a string. Received null

    at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
    at ADB.callee$0$0$ (lib/tools/android-manifest.js:88:9)
    at tryCatch (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:67:40)
    at GeneratorFunctionPrototype.invoke [as _invoke] (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\run
time.js:315:22)
    at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-ru
ntime\regenerator\runtime.js:100:21)
    at GeneratorFunctionPrototype.invoke (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:136:3
7)
    at run (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\node_modules\core-js\library\modules\es6.promise.js:104:47
)
    at C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\node_modules\core-js\library\modules\es6.promise.js:115:28
    at flush (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\node_modules\core-js\library\modules\$.microtask.js:19:5
)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)
 [Error: packageAndLaunchActivityFromManifest failed. Original error: Path must be a string. Received null]
[debug] [AndroidDriver] Shutting down Android driver
[AndroidDriver] Cannot shut down Android driver; it has already shut down
[MJSONWP] Encountered internal error running command: Error: packageAndLaunchActivityFromManifest failed. Original error: Path must be a string. Received null
    at Object.wrappedLogger.errorAndThrow (lib/logger.js:60:13)
    at ADB.callee$0$0$ (lib/tools/android-manifest.js:88:9)
    at tryCatch (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:67:40)
    at GeneratorFunctionPrototype.invoke [as _invoke] (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\run
time.js:315:22)
    at GeneratorFunctionPrototype.prototype.(anonymous function) [as next] (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-ru
ntime\regenerator\runtime.js:100:21)
    at GeneratorFunctionPrototype.invoke (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\regenerator\runtime.js:136:3
7)
    at run (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\node_modules\core-js\library\modules\es6.promise.js:104:47
)
    at C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\node_modules\core-js\library\modules\es6.promise.js:115:28
    at flush (C:\Users\Administrator\AppData\Roaming\npm\node_modules\appium\node_modules\babel-runtime\node_modules\core-js\library\modules\$.microtask.js:19:5
)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)
[HTTP] <-- POST /wd/hub/session 500 5933 ms - 234


解決辦法如下:

       1、手動安裝待測試的apk

       2、根據appium的服務關鍵字的說明,說明如下:

           關鍵字爲app的說明:針對Android系統,如果你指定app-packageapp-activity的話,那麼就可以不指定app 

     所以解決辦法就在這裏,我們不指定app而指定 appPackage和appActivity關鍵字,具體代碼如下:


public class TestAPP {
	private boolean isNeedInstall=false;
	
	@SuppressWarnings("rawtypes")
	private AppiumDriver driver=null;
	public void testZhihu(){
		DesiredCapabilities capabilities = new DesiredCapabilities();
		capabilities.setCapability("deviceName","Android");
		capabilities.setCapability("platformName","Android");
		capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
		capabilities.setCapability(CapabilityType.VERSION, "4.4");
		capabilities.setCapability(CapabilityType.PLATFORM, "WINDOWS");
		if(isNeedInstall){ //isNeedInstall爲真時appium需要解析本地的apk包來得到包名和mainActivity
			String appDir=System.getProperty("user.dir");
			File apppath=new File(appDir, "apps");
			File app = new File(apppath, "txxy.apk");
			capabilities.setCapability("app", app.getAbsolutePath());
		}else { //isNeedInstall爲假時通過appium不需要解析apk直接通過appPackage和appActivity服務關鍵字的設置在目標手機上查找啓動app
			capabilities.setCapability("appPackage", "com.pycredit.txxy");
			capabilities.setCapability("appActivity", ".StartupActivity");
		}
		//支持中文輸入
		capabilities.setCapability("unicodeKeyboard", "true");
		//重置輸入法爲系統默認
		capabilities.setCapability("resetKeyboard", "true");
		//安裝時是否對apk進行重簽名,爲true不進行重簽名
		capabilities.setCapability("noSign","true");
//		capabilities.setCapability("noReset","true");
		try {
			driver = new  AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
		try {
			Thread.sleep(15000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			if(driver!=null){
				driver.quit();
			}
		}
	}
	
	public static void main(String[] args) {
		new TestAPP().testZhihu();
	}
	
}



關鍵字 描述 實例
automationName 你想使用的自動化測試引擎 Appium (默認) 或 Selendroid
platformName 你要測試的手機操作系統 iOSAndroid, 或 FirefoxOS
platformVersion 手機操作系統版本 例如: 7.14.4
deviceName 使用的手機類型或模擬器類型 iPhone SimulatoriPad SimulatoriPhone Retina 4-inchAndroid EmulatorGalaxy S4, 等。在 iOS 上,這個關鍵字的值必須是使用 instruments -s devices得到的可使用的設備名稱之一。在 Android 上,這個關鍵字目前不起作用。
app .ipa or .apk文件所在的本地絕對路徑或者遠程路徑,也可以是一個包括兩者之一的.zip。 Appium會先嚐試安裝路徑對應的應用在適當的真機或模擬器上。針對Android系統,如果你指定app-packageapp-activity(具體見下面)的話,那麼就可以不指定app。 會與browserName 衝突 比如/abs/path/to/my.apkhttp://myapp.com/app.ipa
browserName 需要進行自動化測試的手機 web 瀏覽器名稱。如果是對應用進行自動化測試,這個關鍵字的值應爲空。 iOS 系統上可以用 'Safari' ,Android 系統上可以用 'Chrome', 'Chromium', 或 'Browser'。
newCommandTimeout 設置命令超時時間,單位:秒。達到超時時間仍未接收到新的命令時 Appium 會假設客戶端退出然後自動結束會話。 比如 60
autoLaunch Appium是否需要自動安裝和啓動應用。默認值true truefalse
language (Sim/Emu-only) 設定模擬器 ( simulator / emulator ) 的語言。 如: fr
locale (Sim/Emu-only) 設定模擬器 ( simulator / emulator ) 的區域設置。 如: fr_CA
udid 連接的物理設備的唯一設備標識 如: 1ae203187fc012g
orientation (Sim/Emu-only) 在一個設定的方向模式中開始測試 LANDSCAPE (橫向) 或 PORTRAIT (縱向)
autoWebview 直接轉換到 WebView 上下文。 默認值 false truefalse
noReset 不要在會話前重置應用狀態。默認值false truefalse
fullReset (iOS) 刪除整個模擬器目錄。(Android) 通過卸載——而不是清空數據——來重置應用狀態。在 Android 上,這也會在會話結束後自動清除被測應用。默認值 false truefalse


appActivity 你要從你的應用包中啓動的 Android Activity 名稱。它通常需要在前面添加 . (如:使用.MainActivity 而不是 MainActivity) MainActivity.Settings
appPackage 你想運行的Android應用的包名 比如com.example.android.myAppcom.android.settings

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章