使用Barista测试Android应用时,如何获取ImageView对象验证QR码内容?
获取Barista测试中的ImageView对象并验证QR码内容
你可以结合Espresso(Barista基于Espresso封装)来获取目标ImageView对象,进而提取Bitmap验证QR码内容,具体步骤如下:
1. 获取ImageView对象
方法一:自定义ViewAction
先写一个自定义的ViewAction用来捕获ImageView实例:
public static ViewAction captureImageView(final ImageView[] holder) { return new ViewAction() { @Override public Matcher<View> getConstraints() { return isAssignableFrom(ImageView.class); } @Override public String getDescription() { return "捕获ImageView对象"; } @Override public void perform(UiController uiController, View view) { holder[0] = (ImageView) view; } }; }
然后在测试代码中调用:
// 先确认QR码已显示 BaristaVisibilityAssertions.assertDisplayed(R.id.qrCode); // 用数组存储ImageView(匿名内部类仅能访问final变量) ImageView[] qrImageViewHolder = new ImageView[1]; onView(withId(R.id.qrCode)).perform(captureImageView(qrImageViewHolder)); ImageView qrImageView = qrImageViewHolder[0];
方法二:通过ViewAssertion直接获取
也可以用更简洁的方式,借助check方法直接获取View:
BaristaVisibilityAssertions.assertDisplayed(R.id.qrCode); final ImageView[] qrImageView = new ImageView[1]; onView(withId(R.id.qrCode)).check(new ViewAssertion() { @Override public void check(View view, NoMatchingViewException exception) { qrImageView[0] = (ImageView) view; } });
2. 提取Bitmap并验证QR码内容
获取到ImageView后,提取其显示的Bitmap,再用QR码识别库(比如ZXing)解析内容:
// 从ImageView中获取Bitmap Bitmap qrBitmap = ((BitmapDrawable) qrImageView.getDrawable()).getBitmap(); // 用ZXing解析QR码 MultiFormatReader reader = new MultiFormatReader(); try { Result result = reader.decode(new BitmapLuminanceSource(qrBitmap)); // 验证解析出的内容是否符合预期 assertEquals("你预期的QR码内容", result.getText()); } catch (NotFoundException e) { fail("无法识别QR码内容"); }
注意事项
- 必须在获取ImageView前,通过
assertDisplayed确认View已加载完成,避免空指针异常。 - 如果使用ZXing,需要在测试模块的build.gradle中添加依赖:
androidTestImplementation 'com.google.zxing:core:3.5.2'
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

