Android:通过自动化测试

时间:2016-01-14 12:15:13

标签: android linux file-permissions uiautomator

目标: 在设备上进行自动测试期间拍摄屏幕截图。测试完成后,使用adb拉取屏幕截图文件。

背景:

我目前正在尝试编写自动化测试来拍摄设备屏幕的快照。使用UiDevice进行导航,我想在测试过程中截取屏幕截图。 UiDevice有一个方法takeScreenshot,当我想要快照时,我会调用它。

经过一番调查后,我意识到负责将图像写入文件UiAutomatorBridge的类会遇到异常:

  

java.io.FileNotFoundException:   /data/local/tmp/screenshots/screen2.png:打开失败:EACCES   (许可被拒绝)

使用adb,我创建了该文件并为所有用户设置了所有权限。

adb shell touch /data/local/tmp/screenshots/screen1.png
adb shell chmod 777 /data/local/tmp/screenshots

完成后,我可以截取屏幕截图:

@Test
public void takeSnapShot() {
    String filename = "/data/local/tmp/screenshots/screen1.png";
    File file = new File(filename);
    assertEquals(true, mDevice.takeScreenshot(file));
}

问题:

我希望能够在测试执行时直接创建文件,而无需使用adb。 我尝试使用createNewFile直接从Java创建文件。

try {
     file.createNewFile();
} catch (IOException e) {
     e.printStackTrace();
}

但是我得到了一个IOException

  

java.io.IOException:open failed:EACCES(Permission denied)

有谁知道发生了什么?我对Linux很陌生,所以即使看起来很明显,也不要犹豫不决;)

我应该在superuser上发布此内容吗?

修改

目录 / data 具有这些权限

drwxrwx--x system   system            2016-01-14 14:03 data

我无法列出 / data 的内容,这让我相信用户" shell"不属于该组"系统"。我无法列出 / data / local 的内容。

但是, / data / local / tmp 归" shell"所有。

drwxrwx--x shell    shell             2016-01-14 12:20 . (tmp)

/ data / local / tmp 为所有用户提供+ x权限。

最后,目录"截图"属于具有权限777的shell。

drwxrwxrwx shell    shell             2016-01-14 11:46 screenshots

据我了解,任何用户都应该能够访问 / data / local / tmp / screenshots

1 个答案:

答案 0 :(得分:1)

使用Environment.getExternalStorageDirectory()而不是在 / data / local / tmp / 下保存。 您需要读/写权限才能执行此操作。您必须将这两行添加到应用程序的清单中! (我尝试将这些行添加到/androidTest/Manifest.xml文件中,但它没有任何效果。)

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

虽然它解决了查找保存/读取屏幕截图的公共目录的问题,但它也带来了一个新的。

如果你已经拥有它们,那么必须添加这两个权限并不是什么大问题。但是,如果您不想要求用户提供这些权限,则每次测试/签署应用程序时都必须添加/删除这些行,这远非理想。

编辑:

this post中,有人建议使用构建差异(调试,发布)来拥有两个不同的清单。

最后,我有3个清单:

  • 发布清单(没有外部读/写权限)
  • 调试清单(具有外部读/写权限)
  • AndroidTest Manifest for
  

工具:overrideLibrary =&#34; android.support.test.uiautomator.v18&#34;