待测试的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-package
和app-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 |
你要测试的手机操作系统 | iOS , Android , 或 FirefoxOS |
platformVersion |
手机操作系统版本 | 例如: 7.1 , 4.4 |
deviceName |
使用的手机类型或模拟器类型 | iPhone Simulator , iPad Simulator , iPhone Retina 4-inch , Android Emulator , Galaxy S4 , 等。在 iOS 上,这个关键字的值必须是使用 instruments -s devices 得到的可使用的设备名称之一。在 Android 上,这个关键字目前不起作用。 |
app |
.ipa or .apk 文件所在的本地绝对路径或者远程路径,也可以是一个包括两者之一的.zip 。 Appium会先尝试安装路径对应的应用在适当的真机或模拟器上。针对Android系统,如果你指定app-package 和app-activity (具体见下面)的话,那么就可以不指定app 。 会与browserName 冲突 |
比如/abs/path/to/my.apk 或http://myapp.com/app.ipa |
browserName |
需要进行自动化测试的手机 web 浏览器名称。如果是对应用进行自动化测试,这个关键字的值应为空。 | iOS 系统上可以用 'Safari' ,Android 系统上可以用 'Chrome', 'Chromium', 或 'Browser'。 |
newCommandTimeout |
设置命令超时时间,单位:秒。达到超时时间仍未接收到新的命令时 Appium 会假设客户端退出然后自动结束会话。 | 比如 60 |
autoLaunch |
Appium是否需要自动安装和启动应用。默认值true |
true , false |
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 、 |
true , false |
noReset |
不要在会话前重置应用状态。默认值false 。 |
true , false |
fullReset |
(iOS) 删除整个模拟器目录。(Android) 通过卸载——而不是清空数据——来重置应用状态。在 Android 上,这也会在会话结束后自动清除被测应用。默认值 false |
true , false |
appActivity |
你要从你的应用包中启动的 Android Activity 名称。它通常需要在前面添加 . (如:使用.MainActivity 而不是 MainActivity ) |
MainActivity , .Settings |
appPackage |
你想运行的Android应用的包名 | 比如com.example.android.myApp , com.android.settings |