0

我设置了一个webview.setOnKeyListener,以便我的 WebView 可以在用户单击后退按钮时返回到上一页。
此 WebView 存在于 Fragment 上,在手动使用应用程序时,它在模拟器和真实手机上都能很好地工作。

我面临的问题是我不知道如何在仪器测试中模拟这种行为。
我尝试过的所有代码都会关闭我的 Fragment 而不是将 WebView 发送到上一页。
我觉得“按回”操作正在应用于 Activity 而不是我的 WebView?
至少日志显示在 WebView 中设置的关键侦听器没有捕获任何内容。
任何帮助/想法将不胜感激!

一些上下文:
我的测试正在运行@RunWith(AndroidJUnit4.class)
我用初始化活动

@Rule
public ActivityScenarioRule<TestActivity> activityRule = new ActivityScenarioRule<>(TestActivity.class);

并设置一些代码以在 WebView 中单击以确保它具有返回上一页的历史记录。(与我在模拟器或真实手机上使用它的流程相同,因此它应该可以工作)
我尝试了多种方法来模拟“按下后退按钮”动作,但它们都无法实现我的目标。

我试过的代码:

  1. Espresso.pressBack();

  2. Espresso.pressBackUnconditionally();

  3. UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); mDevice.pressBack();

  4. KeyEvent kdown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK); activityRule.getScenario().onActivity(activity -> {activity.onKeyDown(KeyEvent.KEYCODE_BACK, kdown);});

  5. 我用KeyEvent.ACTION_UP在我的setOnKeyListener所以我稍微修改了前一个。
    KeyEvent kdown = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK); activityRule.getScenario().onActivity(activity -> {activity.onKeyUp(KeyEvent.KEYCODE_BACK, kdown);});

  6. onWebView().withElement(findElement(Locator.ID,"a_random_element")).perform(webKeys("javascript:keyUp(" + KeyEvent.KEYCODE_BACK + ")"));

  7. onView(isRoot()).perform(ViewActions.pressBack());

  8. onView(isRoot()).perform(pressKey(KeyEvent.KEYCODE_BACK));

  9. onView(withTagValue(is("myWebView"))).perform(pressBack());

  10. onView(withTagValue(is("myWebView"))).perform(pressKey(KeyEvent.KEYCODE_BACK));

  11. getInstrumentation().sendKeySync(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));

  12. 找不到activityRule.runOnUiThread()(好像找不到这个方法)

  13. Instrumentation inst = new Instrumentation(); inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

4

0 回答 0