gpt4 book ai didi

android-studio - 在 Android Studio 中创建可以在需要时截屏的 UI 测试的最简单方法是什么?

转载 作者:行者123 更新时间:2023-12-03 17:50:00 26 4
gpt4 key购买 nike

我正在尝试在 Android Studio 中创建一个 UI 测试,它将在我的应用程序的各个屏幕中导航,并在我告诉它时截取屏幕截图。

我一般是 Android Studio 和 Android 编程的新手;我对 XML 和 Java 有相当的了解,但我对构建文件了解不多,而且我似乎不太擅长使用 Android Studio。

几周前我开始了这项工作,我尝试的第一个解决方案是使用 uiautomator。但是,该页面上的文档(并且似乎几乎在其他任何地方)都是针对使用 Eclipse 进行开发的,如果可能的话,我想避免在这个项目中使用它。

我尝试的下一件事是浓缩咖啡。在我克服了在项目中实现 Espresso 的一些问题后,我能够使用 Espresso 编写测试,该测试将在我的应用程序屏幕中导航。但是,与 uiautomator 不同的是,Espresso 目前没有内置的截图功能。

我首先尝试通过编写自定义代码来解决 Espresso 无法截图的问题;由于我对 Android 还不熟悉,所以我不确定如何去做,所以我在 Internet 上搜索了帮助 (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”文件夹,但不指定使用哪种类型的文件夹 [Java 资源文件夹? Assets 文件夹?模块?等],和/或他们告诉我进入项目结构,选择我的应用程序,进入依赖项,然后选择“作为模块导入”,这不起作用...)

或者

-解释如何最好地从 Espresso 测试内部截取屏幕截图,包括有关如何导入任何所需库的任何说明

或者

- 详细解释一些其他方法来创建可以截屏的 UI 测试......

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

谢谢!

最佳答案

好吧,经过很多麻烦,我找到了一个非常简单的解决方案。我花了很长时间才解决,但如果其他人需要做类似的事情,我会在这里提出我的结论。

首先,似乎最容易与 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) {
}

}
}

为了使此功能起作用,您还必须将以下行添加到 list 文件中。
<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 测试时所做的所有限制,那么该线程中的其他帖子可能会更好。

关于android-studio - 在 Android Studio 中创建可以在需要时截屏的 UI 测试的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28571185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com