某些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

你可能感兴趣的:(Appium)