我设置了一个webview.setOnKeyListener
,以便我的 WebView 可以在用户单击后退按钮时返回到上一页。
此 WebView 存在于 Fragment 上,在手动使用应用程序时,它在模拟器和真实手机上都能很好地工作。
我面临的问题是我不知道如何在仪器测试中模拟这种行为。
我尝试过的所有代码都会关闭我的 Fragment 而不是将 WebView 发送到上一页。
我觉得“按回”操作正在应用于 Activity 而不是我的 WebView?
至少日志显示在 WebView 中设置的关键侦听器没有捕获任何内容。
任何帮助/想法将不胜感激!
一些上下文:
我的测试正在运行@RunWith(AndroidJUnit4.class)
。
我用初始化活动
@Rule
public ActivityScenarioRule<TestActivity> activityRule = new ActivityScenarioRule<>(TestActivity.class);
并设置一些代码以在 WebView 中单击以确保它具有返回上一页的历史记录。(与我在模拟器或真实手机上使用它的流程相同,因此它应该可以工作)
我尝试了多种方法来模拟“按下后退按钮”动作,但它们都无法实现我的目标。
我试过的代码:
Espresso.pressBack();
Espresso.pressBackUnconditionally();
UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); mDevice.pressBack();
KeyEvent kdown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK); activityRule.getScenario().onActivity(activity -> {activity.onKeyDown(KeyEvent.KEYCODE_BACK, kdown);});
我用
KeyEvent.ACTION_UP
在我的setOnKeyListener
所以我稍微修改了前一个。
KeyEvent kdown = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK); activityRule.getScenario().onActivity(activity -> {activity.onKeyUp(KeyEvent.KEYCODE_BACK, kdown);});
onWebView().withElement(findElement(Locator.ID,"a_random_element")).perform(webKeys("javascript:keyUp(" + KeyEvent.KEYCODE_BACK + ")"));
onView(isRoot()).perform(ViewActions.pressBack());
onView(isRoot()).perform(pressKey(KeyEvent.KEYCODE_BACK));
onView(withTagValue(is("myWebView"))).perform(pressBack());
onView(withTagValue(is("myWebView"))).perform(pressKey(KeyEvent.KEYCODE_BACK));
getInstrumentation().sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));
找不到
activityRule.runOnUiThread()
(好像找不到这个方法)Instrumentation inst = new Instrumentation(); inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);