当前位置: 首页 > 知识库问答 >
问题:

在AsyncTask中获取浓缩咖啡截图

谷梁振
2023-03-14

我目前正在使用Espresso对一个Android应用程序进行编程截图。我正在成功地使用

android.support.test.runner.screenshot.Screenshot

问题是,根据官方浓缩咖啡文档的以下假设:

  • 消息队列为空。
  • 当前没有正在执行任务的AsyncTask实例。
  • 所有开发人员定义的空闲资源都是空闲的。

通过执行这些检查,Espresso大大增加了在任何给定时间只能发生一个UI操作或断言的可能性。此功能为您提供了更可靠和可靠的测试结果。

AsyncTask运行时,我无法执行任何测试。当我的AsyncTask运行时,我需要拍摄一些截图,但我无法理解如何执行这样的任务。我发现的最相似的SO线程似乎不起作用,不知道这是否是因为AsyncTask太快而无法进行截图。

// Start the async task    
onView(withId(R.id.start_task_button)).perform(click());

// Then "press" the back button (in the ui thread of the app under test)
mActivityTestRule.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        mScreenshotWatcher.captureScreenshot("screenshot1");
    }
});

关于这有线索吗?这是正确的方法,还是应该在我的AsyncTask中实现IdlingResource

谢谢尼古拉

共有1个答案

公孙阳羽
2023-03-14

从我对您的问题的理解来看,您希望在有AsyncTask正在进行时进行截图。

我创建了一个最小的Android应用程序来验证您的场景,但当使用来自Espresso的click()时,它就不起作用了。问题是,一旦Espresso执行click(),它就会在之后调用loopMainThreadUntilIdle()。由于AsyncTask此时已经启动,uicontrollerImpl#loopMainThreadUntilidle()中的循环将一遍又一遍地运行,直到AsyncTask完成。

克服这一问题的最简单方法是使用自定义ViewMatcher,单击并立即返回。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.test_edit_text).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            v.setVisibility(View.INVISIBLE);
            new AsyncTask<Object, Object, Object>() {
                @Override
                protected Object doInBackground(Object... objects) {
                    SystemClock.sleep(20000000);
                    return null;
                }

                @Override
                protected void onPostExecute(Object o) { 
                    findViewById(R.id.test_edit_text)
                    .setVisibility(View.VISIBLE);
                }
            }.execute();
        }});
    }
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.question.stackoverflow"
      xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

MainActivityTest.java

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Rule
    public ActivityTestRule<MainActivity> activityActivityTestRule = new ActivityTestRule<MainActivity>(MainActivity.class);
    @Test
    public void testTakeScreenshot() throws Exception {
        Espresso.onView(withId(R.id.test_edit_text)).check(matches(isDisplayed()));
        // use a custom ViewAction here because this call has be non-blocking                           
        Espresso.onView(withId(R.id.test_edit_text)).perform(new ViewAction() {
            @Override
            public Matcher<View> getConstraints() {
                return isDisplayingAtLeast(90);
            }
            @Override
            public String getDescription() {
                return "NonBlockingTap";
            }
            @Override
            public void perform(UiController uiController, View view) {
                view.performClick();
            }
        });
        ScreenCapture screenCapture = Screenshot.capture();
        screenCapture.setFormat(Bitmap.CompressFormat.PNG);
        screenCapture.setName("test.png");
        screenCapture.process(); 
        Espresso.onView(withId(R.id.test_edit_text)).check(matches(isDisplayed()));       
    }
}
 类似资料:
  • 在我的主要活动中,我有initUi函数,它将触发对webviewActivity的意图,在webviewActivity中,有一个FragWebView,其中加载了url。 以下是来自FragWebView的示例代码: 我从我的主要活动中传递打开webview的意图是: 请让我知道如何解决这个问题。 问候

  • null 动画/转换被禁用,但这不会阻止CircularProgressLayout动画化。 我尝试,但即使这样,在第一次单击和第二次单击之间也要等待2秒。 我还试图滥用作为黑客来确认退出应用程序。这确实有效,但这是一个黑客。我只想让浓缩咖啡点击两次。 有什么建议如何使浓缩咖啡点击两次而不等待动画?

  • 当我试图编写一个与listview项交互的代码时,我得到了一个OmbyuousViewMatcherException异常。场景如下。 我有一个包含两个视图的listview 文本视图 按钮查看 我在列表中有将近250行。所有按钮都有文本“预订”或“取消”。他们在一个洗牌的顺序。我想直接点击列表中的第一个“预订它”按钮。我已经尝试了很多方案,但仍然无法找到解决方案。拜托谁帮帮我。 下面是我现在的代

  • 我试着用“浓缩咖啡”写简单的测试 但我有个错误: 我正在尝试不同的框架进行测试,对我来说是最好的,但如果有人能帮助修复这个错误,我将非常感激

  • 我正在使用espresso进行测试,在一个页面中有多个AdapterViews,例如,ID:r.id.list1,r.id.list2 如何选择特定的listview并在其上尝试onData?

  • 本文向大家介绍Android 设置意式浓缩咖啡,包括了Android 设置意式浓缩咖啡的使用技巧和注意事项,需要的朋友参考一下 示例 在build.gradle您的Android应用模块的文件中,添加下一个依赖项: 在文件中AndroidJUnitRunner为testInstrumentationRunner参数指定build.gradle。 此外,添加此依赖项以提供意图模拟支持 并将其添加为w