社区首页 >问答首页 >无法使用Espresso在UI测试选项菜单中使用withId方法选择视图/菜单项

无法使用Espresso在UI测试选项菜单中使用withId方法选择视图/菜单项
EN

Stack Overflow用户
提问于 2020-04-04 23:34:54
回答 3查看 519关注 0票数 0

我正在做一个Android Kotlin项目。我正在将使用Espresso框架编写的UI测试添加到我的项目中。但是在我的测试中,我不能使用withId()方法在操作栏中选择options菜单的菜单项。

下面是我如何将菜单添加到活动中的操作栏中。

代码语言:javascript
代码运行次数:0
复制
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.event_list, menu)

        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
             R.id.action_logout -> {
                 ApplicationController.instance.clearLoginData()
                 finish()
             }
        }

        return super.onOptionsItemSelected(item)
    }

这是菜单资源文件夹中的event_list.xml

代码语言:javascript
代码运行次数:0
复制
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_logout"
        android:icon="@android:drawable/ic_lock_power_off"
        android:title="@string/menu_item_logout"
        app:showAsAction="never"/>
</menu>

这就是我的测试方法

代码语言:javascript
代码运行次数:0
复制
@Test
fun itWipesOutLoginDataWhenLogoutMenuItemIsTapped() {
    FakeEventService.SCENARIO_UNDER_TEST = 0
    this.eventListActivityRule.launchActivity(null)
    openActionBarOverflowOrOptionsMenu(ApplicationProvider.getApplicationContext<Context>())

    onView(withId(R.id.action_logout)).perform(click())
}

正如您在测试方法中看到的,我使用withId()方法选择菜单项。但是当我运行测试时,我得到了以下错误。

代码语言:javascript
代码运行次数:0
复制
androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.example.memento:id/action_logout
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:androidx.appcompat.widget.MenuPopupWindow$MenuDropDownListView{2582e16 VFED.VC.. ........ 0,0-686,168}

View Hierarchy:
+>PopupDecorView{id=-1, visibility=VISIBLE, width=686, height=168, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params={(740,98)(686x168) gr=TOP START CENTER DISPLAY_CLIP_VERTICAL sim={state=unchanged} ty=APPLICATION_SUB_PANEL fmt=TRANSLUCENT surfaceInsets=Rect(112, 112 - 112, 112) (manual)
fl=LAYOUT_NO_LIMITS ALT_FOCUSABLE_IM WATCH_OUTSIDE_TOUCH SPLIT_TOUCH HARDWARE_ACCELERATED FLAG_LAYOUT_ATTACHED_IN_DECOR
pfl=WILL_NOT_REPLACE_ON_RELAUNCH LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+->PopupBackgroundView{id=-1, visibility=VISIBLE, width=686, height=168, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.FrameLayout$LayoutParams@de56b69, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+-->MenuDropDownListView{id=-1, visibility=VISIBLE, width=686, height=168, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, layout-params=android.widget.FrameLayout$LayoutParams@4044e8f, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}
|
+--->ListMenuItemView{id=-1, visibility=VISIBLE, width=686, height=168, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.AbsListView$LayoutParams@393b6fa, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+---->AppCompatImageView{id=2131230882, res-name=group_divider, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@70144ab, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+---->LinearLayout{id=2131230818, res-name=content, visibility=VISIBLE, width=686, height=168, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@d648c6, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+----->RelativeLayout{id=-1, visibility=VISIBLE, width=574, height=76, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@4a503dd, tag=null, root-is-layout-requested=false, has-input-connection=false, x=56.0, y=46.0, child-count=2}

我的代码出了什么问题?我该如何修复它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-22 15:04:15

对于在这里搜索答案的人来说,与菜单交互的最简单方法是使用Barista库。它提供了像clickMenu(R.id.menu_item)openMenu()这样的方法来实现简单的菜单交互。即使项隐藏在溢出中,单击也可以工作。

我在我的Android UI testing tutorial中对它进行了示例测试。

票数 1
EN

Stack Overflow用户

发布于 2020-04-06 22:22:29

在选择菜单项时不能使用withId,因为菜单是用它们自己的视图和id放大的,因此您的id action_logout永远不会存在于视图层次结构(NoMatchingViewException)中:

尝试使用不同的视图匹配器,例如使用withText

代码语言:javascript
代码运行次数:0
复制
openActionBarOverflowOrOptionsMenu(ApplicationProvider.getApplicationContext<Context>())
onView(withText("your_menu_item_logout_string")).perform(click())

还请注意,当菜单打开(弹出)时,所有后续的测试交互都将在菜单中执行,直到它被清除,因此您不必担心背景视图中的冲突匹配。

票数 2
EN

Stack Overflow用户

发布于 2020-09-08 22:44:05

我遇到了这个问题,并尝试使用openActionBarOverflowOrOptionsMenu(),如Aaron的答案所示,但得到了一个"no overflowmenubutton“错误。然而,他的回答证实了我所认为的测试找不到我真正想要测试的菜单小部件的原因。因此,我尝试了其他一些我认为可以访问工具栏的东西,从而允许找到小部件,并通过以下操作获得了成功:

代码语言:javascript
代码运行次数:0
复制
onView(withId(R.id.my_toolbar)).check(matches(isDisplayed()));
onView(withId(R.id.my_toolbar)).check(matches(hasDescendant(withId(R.id.action_add))));
onView(withId(R.id.action_add)).perform(click());

我的猜测是,这个序列标识工具栏,然后允许小部件"action_add“按钮通过它的ID被找到。当我运行这个测试时,目标意图被打开,从而验证执行(action_add())确实点击了"action_add”小部件。

我希望这对处于同样困境的人有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61036163

复制
相关文章
Android使用Espresso实现UI自动化测试
谷歌2013年的时候开源了Espresso,谷歌的思路是,等到它足够成熟和稳定以后,将其迁移到Android SDK中,以此可见对他的重视。Google使用Espresso测试了他们自己的超过30个应用程序,包括G+、Maps和Drive。
蜻蜓队长
2018/08/03
1.5K0
Android使用Espresso实现UI自动化测试
WiX安装选项---开始菜单项
参考文档: How To: Create a Shortcut on the Start Menu,How To: Create an Uninstall Shortcut 制作的安装程序安装后,都要
张善友
2018/01/19
1.2K0
Android UI 测试 - Espresso
Android UI 测试框架,在真机运行,相比手动测试,相当于把流程自动化了,并且自动监测结果。
三流之路
2018/09/11
1.1K0
Android UI 测试 - Espresso
Espresso浅析和使用
[1510886666303_8428_1510886580252.jpg] Espresso是一个Google官方提供的Android应用UI自动化测试框架。Google希望,当Android的开发
QQ音乐技术团队
2017/11/17
2.4K0
Espresso浅析和使用
Android 单元测试和 UI 测试初步实践
对于大多数 Android 商业项目,基本都是处于高速迭代的开发阶段,这个阶段不仅仅是对项目的开发效率,也对项目的产品质量提出了更高的要求。
顾翔
2019/12/12
2.1K0
Android 单元测试和 UI 测试初步实践
Android测试入门-1
在本地执行的单元测试,不需要运行在物理设备或模拟器上,可以测试一些与Android框架无关的代码。
luciozhang
2023/04/22
7020
Android测试入门-1
android-espresso测试框架简单使用
参考文章 http://blog.csdn.net/qiang_xi/article/details/52933593 buid.gradle testCompile ‘junit:junit:4.12’ androidTestCompile ‘com.android.support.test.espresso:espresso-core:2.2.+’ androidTestCompile ‘com.android.support.test:runner:0.4.+’ androidTestCompile ‘com.android.support.test:rules:0.2’
tea9
2022/07/16
3350
android-espresso测试框架简单使用
基于Kotlin DSL的Espresso和UIAutomator的融合客户端自动化
最近小编在探索端对端测试相关的topic,在Android端的自动化测试上,可供我们选择的库并不是很多,而其中小编使用最多的两个库分别是Espresso和UIAutomator。尽管两者都可以达成我们的最终目的,但实现的过程还是有所区别的:
用户5521279
2020/05/08
2.3K0
Android开发者的UI自动化测试上手指南
开发人员测试自己所开发软件的行为就像学生在完成考试后对自己的成绩进行评估,所以可能会出现下面的问题:
蜻蜓队长
2018/08/03
8520
Android开发者的UI自动化测试上手指南
[译] Android 上一次编写,随处测试
在今年的 Google I/O 大会上,我们推出了 AndroidX Test,作为 Jetpack 的一部分。今天,我们很高兴地宣布 v1.0.0 最终版本和 Robolectric v4.0 一起发布。作为 1.0.0 版本的一部分,所有 AndroidX Test 现在都是开源的。
Android 开发者
2019/03/20
1.5K0
[译] Android 上一次编写,随处测试
13、Java菜单条、菜单、菜单项
13、Java菜单条、菜单、菜单项 一般用Java做界面时,都得牵涉到菜单条、菜单、菜单项的设计。菜单项放在菜单里,菜单放在菜单条里,且其字体均可设置。 13.1、菜单条(Menubar) Fram
YGingko
2017/12/28
3.2K0
bootstrap 下拉菜单 禁用菜单项
 <div class="dropdown"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> 下拉菜单<span class="caret"></span> </button> <ul class="dropdown-menu"> <li><a href="#">菜单项1</a></li> <li class="disabled"><a href="#">菜单项2</a></li> <li><a href="#">菜单项3</a></li> </ul> </div>
用户5760343
2019/07/05
2.3K0
Android编程权威指南笔记3:Android Fragment讲解与Android Studio中的依赖关系,如何添加依赖关系
片段是一个应用程序的用户界面或行为,可以放在一个Activity。与碎片的交互是通过FragmentManager,可以通过Activity.getFragmentManager()和 获得 Fragment.getFragmentManager()。
达达前端
2022/04/28
1.8K0
Android编程权威指南笔记3:Android Fragment讲解与Android Studio中的依赖关系,如何添加依赖关系
初学java之菜单条,菜单,菜单项的设置
1 package project; 2 import javax.swing.*; 3 4 import java.awt.event.KeyEvent; 5 import java.awt.event.InputEvent; 6 import static javax.swing.JFrame.*; 7 class WindowMenu extends JFrame //JFrame的子类 8 { 9 JMenuBar myBar ; 10 JMenu menu , su
Gxjun
2018/03/22
2.1K0
修复WordPress升级4.2外观菜单中显示选项无法点击问题
WordPress 升级 4.2 之后,目前发现存在如下 3 个问题: 有部分主题的前台会产生大量的 404 错误请求(站外资源); 评论表情名称变更导致表情无法显示或者无法通过钩子更改; 外观-->
张戈
2018/03/23
1K0
修复WordPress升级4.2外观菜单中显示选项无法点击问题
Android单元测试框架Espresso介绍
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,
顾翔
2019/12/12
1K0
安卓 topic-菜单 Menu
菜单是许多应用类型中常见的用户界面组件。要提供熟悉而一致的用户体验,您应使用 Menu API 呈现 Activity 中的用户操作和其他选项。 从 Android 3.0(API 级别 11)开始,采用 Android 技术的设备不必再提供一个专用“菜单”按钮。随着这种改变,Android 应用需摆脱对包含 6 个项目的传统菜单面板的依赖,取而代之的是要提供一个应用栏来呈现常见的用户操作。 尽管某些菜单项的设计和用户体验已发生改变,但定义一系列操作和选项所使用的语义仍是以 Menu API 为基础。本指南将介绍所有 Android 版本系统中三种基本菜单或操作呈现效果的创建方法:
acc8226
2022/05/17
2.7K0
安卓 topic-菜单 Menu
iOS选择器视图控件(UIPickerView)使用方法总结
UIPickerView是iOS中的原生选择器控件,使用方便,用法简单,效果漂亮。
珲少
2018/08/15
1.2K0
Material Design — 菜单(Menus)
自上次参加完回音分享会后,我下定决心要洗心革面乖乖打基础,于是开启了这个part,争取两个月不间断更新,写完Material Design与iOS中的组件(顺便学学英语),以便今后在使用的时候完全不虚
霖酱
2018/05/17
5.8K0
点击加载更多

相似问题

使用espresso测试Android NavigationView菜单项

11

安卓Espresso片状withId withText测试

23

Android - Espresso长选项菜单-单击不可见的选项菜单项

14

Espresso单击菜单项

74

如何使用Espresso在UI测试中模拟textwatcher?

114
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文