Robotium Robotium 执行 bat 文件,使得自动拷贝手机文件到 PC,执行了没效果,已经搞了很久了

missgong0 · July 14, 2015 · Last by 木月 replied at November 10, 2015 · 2161 hits

在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();
}
}
共收到 21 条回复 时间 点赞

建议你直接在外围做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端。

missgong0 #12 · July 15, 2015 作者

#11楼 @xuxu 感觉正解,robotium执行的时候,会安装一个安卓应用,安装完之后,其实把数据线断开也是可以执行脚本的,这才是pull命令执行了无效的原因。我用appium的时候,就是可以用pull的,断开数据线,脚本也就不执行了。
看来这两个框架真的有太多的不同。
有高手可以解答Robotium如何解决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

missgong0 #16 · July 16, 2015 作者

#14楼 @shixue33 多谢提醒,这个的确不叫bat文件,只是命令,但是我试了bat文件也是一样的没效果,如 Runtime.getRuntime().exec("cmd /k start e:\pullfile.bat"); 11楼是正解

missgong0 #17 · July 16, 2015 作者

#15楼 @zjb861107 我刚试了斜杠 反斜杠都是没报错的,反斜杠的话在java中要两道反斜杠才可以。 但是也是不能执行拷贝操作。感觉11楼正解。Robotium这个框架导致的。

写个 终端控制工具,pc连手机(usb or wifi),通知pc上的工具去pull 到本地硬盘

missgong0 #19 · July 16, 2015 作者

#18楼 @ganyunxiao 这个主意好,可以往这个方向研究下。

你不觉得很搞笑么?在测试程序里调用ADB Runtime.getRuntime().exec("adb pull /sdcard/aaa.mp4 e:/aaa.mp4");
ADB只是在PC端运行,Android里面怎么可能调用

推荐使用Python脚本,启动,push,pull,install命令都可以一起管理

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up