我正在尝试在Android Studio中创建一个UI测试,它将浏览我的应用程序的各个屏幕,并在我告诉它时截取屏幕截图。
我是Android Studio和Android编程的新手;我对XML和Java有一个很好的理解,但我对构建文件了解不多,而且我似乎并不擅长使用Android Studio。
几个星期前我开始了这项工作,我尝试的第一个解决方案是使用uiautomator。但是,该页面上的文档(以及其他任何地方的文档)都是针对Eclipse的开发,如果可能的话,我希望避免使用它。
我接下来尝试的是Espresso。在我克服了将Espresso应用到我的项目中的一些问题后,我能够使用Espresso编写测试,该测试将浏览我的应用程序的屏幕。但是,与uiautomator不同,Espresso目前没有内置功能来截取屏幕截图。
我首先尝试通过编写自定义代码来解决无法使用Espresso截屏的问题;由于我还不熟悉Android,因此我不确定如何解决这个问题,因此我在互联网上寻求帮助(How to programmatically take a screenshot in Android?)。但是,我无法从测试文件中获得我发现的解决方案。
有人建议使用此工具:https://github.com/rtyley/android-screenshot-lib但我无法弄清楚如何将其导入我的项目。
我最终回到了uiautomator;我在将它导入我的项目时仍然遇到很多麻烦,有些人说Robotium会对此有所帮助。我让Robotium工作,但我还是无法导入uiautomator。
自从我开始使用Android Studio以来已经有一个月了,在那段时间里,我只是让软件无法正常运行。为了简洁起见,我已经省略了我自己设法解决的所有问题,但是,直截了当地说,我耐心地结束了。
TL; DR
如果有人可以:
- 以最简单的方式解释如何将uiautomator导入Android Studio项目(我已经阅读了很多关于如何将外部库导入项目的文档,但它们都告诉我添加一个' libs& #39;文件夹到我的项目,但是没有指定要使用哪种类型的文件夹[Java资源文件夹?资产文件夹?模块?等],和/或他们告诉我进入项目结构,选择我的应用程序,转到依赖关系,并选择"导入为模块,"这不起作用...)
OR
-explain如何最好地从Espresso测试中获取屏幕截图,包括有关如何导入任何所需库的任何说明
OR
-explain详细解释了创建可以截取屏幕截图的UI测试的其他方法...
......我真的很感激。我花了好几天试图弄清楚如何做到这一点,我很沮丧。很多人都提出了类似的问题,但答案要么太模糊,要么问题与我自己的问题不够接近。
谢谢!
答案 0 :(得分:3)
好吧,经过多次麻烦,我找到了一个非常简单的解决方案。我需要很长时间才能解决问题,但是如果其他人需要做类似的事情,我会在这里得出结论。
首先,最容易与Android Studio一起使用的测试框架是Espresso。设置Espresso非常简单;大多数说明都可以在这里找到:https://code.google.com/p/android-test-kit/wiki/EspressoSetupInstructions请务必仔细阅读 - 它基本上告诉您需要知道的一切,但我错过了一些重要的细节,这给我带来了很多麻烦。
如果您浏览Espresso网站,它会告诉您有关如何编写Espresso测试的所有信息。这对我来说有点令人沮丧,因为如果我写了一个测试并且测试失败了,那么我的设备就会出现与我的笔记本电脑的连接问题,我将不得不断开连接并重新连接我正在使用的USB线。我认为这与我使用带有Windows 8笔记本电脑的Nexus 7这一事实有关,这在其他方面给了我一些问题,所以你可能不会遇到这个问题。
现在,与uiautomator不同,其声称支持截屏的文档,Espresso没有内置支持截屏。这意味着您必须找出一种不同的截屏方式。我的解决方案是在我的androidTest包中创建一个新类(在我的例子中称为HelperClass)并将此方法添加到其中。
public static void takeScreenshot(String name, Activity activity)
{
//slightly modified version of solution from http://www.ssaurel.com/blog/how-to-programmatically-take-a-screenshot-in-android/
//I added "/Pictures/" to my path because that's the folder where I wanted to store my screenshots -- you might not have that folder on your device, so you might want to replace "/Pictures/" with just "/" until you decide where you want to store the screenshots
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/" + name;
View v = activity.getWindow().getDecorView().getRootView();
v.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(v.getDrawingCache());
v.setDrawingCacheEnabled(false);
OutputStream out = null;
File imageFile = new File(path);
//the following line will help you find where the screen will be stored on your device
Log.v("Screenshot", "The image file path is " + imageFile.getPath());
try {
out = new FileOutputStream(imageFile);
// choose JPEG format
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
} catch (FileNotFoundException e) {
// manage exception
} catch (IOException e) {
// manage exception
} finally {
try {
if (out != null) {
out.close();
}
} catch (Exception exc) {
}
}
}
为了使此功能起作用,您还必须将以下行添加到清单文件中。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如果没有它,上面的函数每次运行时都会抛出一个FileNotFoundException。
最后,要从Espresso测试代码中调用takeScreenshot函数,请使用此行(假设您调用了类HelperClass ...如果没有,请改用您的类的名称。
HelperClass.takeScreenshot("Whatever you want to call the file", getActivity());
如果您不知道要查看的位置,查找屏幕截图的存储位置会有点困难。我在takeScreenshot函数中添加了一行代码,用于将文件路径打印到LogCat,但是我在我的计算机上使用文件浏览器来查找我的Nexus(当然,它连接到计算机)上的屏幕截图,以及我找不到那条路。但是,我在平板电脑上安装了一个文件浏览器应用程序,这样就可以很容易地找到文件所在的位置。
我的解决方案可能不是最简单的,当然也不是最好的 - 如果您不小心删除不再需要的屏幕截图,不久就会在屏幕上显示您的设备,而且我我不知道如何直接将屏幕截图保存到通过USB连接到平板电脑的计算机上。那肯定会有所帮助。但是,如果你真的需要一个简单的UI测试来截取屏幕截图,并且你像我一样感到沮丧,那么这个解决方案可能会有所帮助。我当然觉得它很有用。
我希望这有助于其他人 - 这绝对解决了我的问题,至少目前是这样。
当然如果你没有我在编写截图的UI测试时所做的所有限制,那么此线程中的其他帖子可能会更好。
答案 1 :(得分:0)
您应该尝试AndroidViewClient/culebra。使用culebra
GUI,您可以自动生成与您的应用交互的测试用例,并在您指明时完全截取屏幕截图。