在 java 工程中,执行下面代码是成功的,可以把 sdcard 下的 aaa.mp4 拷贝到电脑 e 盘
但是在 Robotium 工程中,执行下面代码,其中 Runtime.getRuntime().exec("adb pull /sdcard/aaa.mp4 e:/aaa.mp4"); 一句并没有什么效果。
本来想更加自动化一点,让手机的文件自动拷贝到 PC 端,方便查看,没想到在 java 工程上运行 ok 的代码,到 Robotium 的安卓工程中就出现了问题,无论如何都执行没有效果,不会拷贝任何文件到 PC,不知道为什么,已经搞了很久了,网上也没查到对应的资料,还望各位大神解答!!!
public void CopyTest(){
try {
solo.sleep(10000);
System.out.println("执行命令start");
Runtime.getRuntime().exec("adb pull /sdcard/aaa.mp4 e:/aaa.mp4");
System.out.println("执行命令end");
} catch (IOException e) {
System.out.println("出错了");
e.printStackTrace();
}
}
建议你直接在外围做 SHELL 脚本进行操作。
ROBOTIUM 是基于 APK 的,因此有用户权限的问题,如访问 SDCARD 需要 APK 有 SDCARD 的读写权限。
#1 楼 @yangchengtest 用 shell 直接拷贝是没问题的,但是我一个单元测试中有好多个 case,每执行一个 case,就要恢复现场,我要在恢复现场前把文件拷贝到 PC。如果用 shell,怎么能做到每执行一个 case,就拷贝一次的操作呢?
@missgong0 你要在进程里面一个一个文件保存到 PC,没有试过。~
我个人建议:你在 SDCARD 搞个临时文件夹吧,然后全部运行完,最后拉个脚本一起 COPY 出来不就好了么。
我同意 yangchengtest 的建议,写个 shell 脚本来做传文件的事,然后再 case 中调用就好。
java 工程-(运行在)->windows-(执行 PC 上的)->adb.exe
robotium-(运行在)->
#5 楼 @sanlengjingvv shell 脚本运行在 Android 上,robotium 也是运行在 Android 上的。
#3 楼 @yangchengtest 是卖阳澄湖螃蟹网站的测试吗?
@pighero001 。。。。。
专供大闸蟹,1K/1g,送货上门。~~~~
#8 楼 @yangchengtest 这里什么时候开始做广告了,被恒温他们知道了,该批评了
#8 楼 @yangchengtest 1k/1g,比切糕还贵。。。
太想当然了。
pull 命令,是在 PC 端执行 adb pull , 你在应用里面去执行,没卵用,其没办法调用这样的命令。
robotium 执行的时候,其实是在 Android 设备上执行一个 Android 应用,尽管连接了数据线,但怎么也无法通过一个手机上的应用,通过 adb pull 命令将手机里面的内容 pull 到 PC 端。
spoon 中有这样一段代码,可以参考
/** Download all screenshots from a single device to the local machine. */
private void pullScreenshotsFromDevice(IDevice device) throws Exception {
// Screenshot path on private internal storage, for KitKat and below.
FileEntry internalDir = getScreenshotDirOnInternalStorage();
logDebug(debug, "Internal path is " + internalDir.getFullPath());
// Screenshot path on public external storage, for Lollipop and above.
FileEntry externalDir = getScreenshotDirOnExternalStorage(device);
logDebug(debug, "External path is " + externalDir.getFullPath());
// Sync device screenshots to the local filesystem.
// TODO only pull from one location, based on android version of device
logDebug(debug, "Pulling screenshots from external dir on [%s]", serial);
String localDirName = work.getAbsolutePath();
adbPull(device, externalDir, localDirName);
logDebug(debug, "Pulling screenshots from internal dir on [%s]", serial);
adbPull(device, internalDir, localDirName);
logDebug(debug, "Done pulling screenshots from [%s]", serial);
}
private void adbPull(IDevice device, FileEntry remoteDirName, String localDirName) {
try {
device.getSyncService()
.pull(new FileEntry[] {remoteDirName}, localDirName,
SyncService.getNullProgressMonitor());
} catch (Exception e) {
logDebug(debug, e.getMessage(), e);
}
}
private FileEntry getScreenshotDirOnInternalStorage() {
String appPackage = instrumentationInfo.getApplicationPackage();
String internalPath = "/data/data/" + appPackage + "/" + SCREENSHOT_DIR;
return obtainDirectoryFileEntry(internalPath);
}
private static FileEntry getScreenshotDirOnExternalStorage(IDevice device) throws Exception {
String externalPath = getExternalStoragePath(device) + "/" + SCREENSHOT_DIR;
return obtainDirectoryFileEntry(externalPath);
}
private static String getExternalStoragePath(IDevice device) throws Exception {
CollectingOutputReceiver pathNameOutputReceiver = new CollectingOutputReceiver();
device.executeShellCommand("echo $EXTERNAL_STORAGE", pathNameOutputReceiver);
return pathNameOutputReceiver.getOutput().trim();
}
而且 adb pull /sdcard/aaa.mp4 e:/aaa.mp4 这个不叫 bat 文件
adb pull /sdcard/aaa.mp4 e:/aaa.mp4
这个能成功吗?win 下面是反斜杠吧
adb pull /sdcard/aaa.mp4 e:\aaa.mp4
#15 楼 @zjb861107 我刚试了斜杠 反斜杠都是没报错的,反斜杠的话在 java 中要两道反斜杠才可以。 但是也是不能执行拷贝操作。感觉 11 楼正解。Robotium 这个框架导致的。
写个 终端控制工具,pc 连手机(usb or wifi),通知 pc 上的工具去 pull 到本地硬盘
#18 楼 @ganyunxiao 这个主意好,可以往这个方向研究下。
你不觉得很搞笑么?在测试程序里调用 ADB Runtime.getRuntime().exec("adb pull /sdcard/aaa.mp4 e:/aaa.mp4");
ADB 只是在 PC 端运行,Android 里面怎么可能调用
推荐使用 Python 脚本,启动,push,pull,install 命令都可以一起管理