示例场景
点击一个 Native 的按钮之后,触发一个打开 Webview 的动作
示例源码
//注意,此示例的场景为在a Activity上有一个按钮,点了之后,触发打开一个新的Activity(b), 在b结束时,无需给a返回值及其他信息
public static void buyingMembers(Activity mContext) {
Intent intent = new Intent(mContext, WebActivity.class);
// 1-购买会员
String url = CommonUtil.getUrlParams(Constant.URL_BUY_VIP);
intent.putExtra(“示例extra的key”, url);
mContext.startActivity(intent);
}
测试代码
注:仅检验 app 前端会去用 webview 打开正确的 url 地址
@Rule
public IntentsTestRule<MainActivity> mActivityRule = new IntentsTestRule<>(MainActivity.class);
@Test
public void MembershipCenterSuccess(){
onView(withId(R.id.tv_main_username)).perform(click());
onView(withId(R.id.et_username)).perform(replaceText("你的账号"));
onView(withId(R.id.et_password)).perform(replaceText("你的密码"));
IdlingResource idlingResource = new MainIdlingResource(mActivityRule.getActivity());
onView(withId(R.id.bt_user_login)).perform(click());
//异步,在登录成功或超时之前,用于阻塞测试主进程
IdlingRegistry.getInstance().register(idlingResource);
onView(withId(R.id.tv_main_username)).perform(click());
IdlingRegistry.getInstance().unregister(idlingResource);
String url = getUrlParams("示例url");
String webActivityName = "你的新打开的webactivity名称";
//构造(官网为stub)intent - 可以理解为activity之间通信的桥
Matcher expectedIntent = allOf(hasExtra("extra的key",url), hasComponent(hasShortClassName(webActivityName)));
//这里根据具体场景,如果你需要b Activity给a Activity返回值(比如b在关闭之后,a页面相应的控件文本会做更新),用来做校验
//那么用下面的;否则, 不用写intending
//intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(int resultCode, Intent resultData));
onView(withId(R.id.tv_vip)).perform(click());
//检验a Activity会发送这个构造的expectedIntent给b Activity
//如果校验不通过,会抛出AssertionFailedError
intended(expectedIntent);
}
由此可见
个人推荐,可能不完美
如何校验从 Native 的 Activity 到 Webview 的 Activity,这个目前为止,我还没有找到正确的方式 (有看到的大佬请推荐下),不过我这里有一个已经实现了的可以校验的办法, 大概就是分两步:
参考文献
Android 自动化测试框架 Espresso(四)——intent 测试
Android 官网 Espresso 测试 Intent