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

missgong0 · 2015年07月14日 · 最后由 木月 回复于 2015年11月10日 · 66 次阅读

在 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 端。

#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

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

#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 命令都可以一起管理

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册