在Android Studio中创建UI测试的最简单方法是什么,可以在需要时截取屏幕截图?

时间:2015-02-17 21:10:47

标签: android-studio screenshot uiautomator ui-testing

我正在尝试在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测试的其他方法...

......我真的很感激。我花了好几天试图弄清楚如何做到这一点,我很沮丧。很多人都提出了类似的问题,但答案要么太模糊,要么问题与我自己的问题不够接近。

谢谢!

2 个答案:

答案 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,您可以自动生成与您的应用交互的测试用例,并在您指明时完全截取屏幕截图。