You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何提取Toast文本用于Espresso UI测试验证?

用Espresso验证错误登录的Toast提示

要捕获并验证Toast文本,Espresso本身没有内置的Toast匹配器,我们可以通过自定义Root匹配器来识别Toast窗口,然后验证其文本内容。

步骤1:自定义Toast匹配器

创建一个ToastMatcher类,用于识别Toast所在的窗口:

import android.view.WindowManager;
import androidx.test.espresso.Root;
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;

public class ToastMatcher extends TypeSafeMatcher<Root> {

    @Override
    public void describeTo(Description description) {
        description.appendText("is a toast");
    }

    @Override
    protected boolean matchesSafely(Root root) {
        int windowType = root.getWindowLayoutParams().get().type;
        // 判断是否为Toast类型的窗口
        return windowType == WindowManager.LayoutParams.TYPE_TOAST;
    }
}

步骤2:编写测试代码

在androidTest目录下的测试类中,模拟错误登录操作并验证Toast:

import androidx.test.espresso.Espresso;
import androidx.test.espresso.action.ViewActions;
import androidx.test.espresso.matcher.ViewMatchers;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import org.junit.Rule;
import org.junit.Test;

import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withText;

public class LoginActivityTest {

    // 启动LoginActivity的规则
    @Rule
    public ActivityScenarioRule<LoginActivity> activityRule = new ActivityScenarioRule<>(LoginActivity.class);

    @Test
    public void invalidLoginDisplaysCorrectToast() {
        // 输入错误用户名
        Espresso.onView(ViewMatchers.withId(R.id.et_username))
                .perform(ViewActions.typeText("invalid_user"));

        // 输入错误密码并关闭软键盘
        Espresso.onView(ViewMatchers.withId(R.id.et_password))
                .perform(ViewActions.typeText("wrong_password"), ViewActions.closeSoftKeyboard());

        // 点击登录按钮
        Espresso.onView(ViewMatchers.withId(R.id.btn_login))
                .perform(ViewActions.click());

        // 验证Toast显示指定文本
        Espresso.onView(withText("Incorrect username or password"))
                .inRoot(new ToastMatcher()) // 指定查找Toast窗口
                .check(matches(isDisplayed()));
    }
}

关键说明

  • inRoot(new ToastMatcher()):告诉Espresso去Toast的窗口中查找View,因为Toast不在当前Activity的View层级里。
  • 如果你需要提取Toast文本(而非仅验证),可以自定义一个ViewAction来获取文本内容,但通常测试中直接验证文本匹配即可满足需求:
    String[] toastText = new String[1];
    Espresso.onView(withText("Incorrect username or password"))
            .inRoot(new ToastMatcher())
            .perform(view -> toastText[0] = view.getText().toString());
    // 后续可使用toastText[0]做断言
    

注意事项

  • 确保布局中输入框、按钮的ID与代码中的一致(比如R.id.et_username、R.id.btn_login)。
  • 若Toast存在延迟显示,可添加Espresso.onIdle()等待UI操作完成后再执行验证。
  • 确保app/build.gradle中已添加必要的测试依赖:
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    

内容的提问来源于stack exchange,提问作者11_RT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:35:14