首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我覆盖了espresso ViewAction中的perform方法,但它不起作用,这个方法甚至不会在代码执行时调用

问题描述: 我覆盖了espresso ViewAction中的perform方法,但它不起作用,这个方法甚至不会在代码执行时调用。

回答: 在使用Espresso进行UI测试时,我们可以通过自定义ViewAction来执行特定的操作。覆盖perform方法是实现自定义ViewAction的关键步骤之一。然而,如果perform方法不起作用,或者在代码执行时没有被调用,可能有以下几个原因:

  1. 未正确绑定ViewAction: 确保你在使用ViewAction时,将其正确绑定到目标View上。可以通过使用ViewInteraction.perform()方法来执行自定义的ViewAction。例如:
  2. 未正确绑定ViewAction: 确保你在使用ViewAction时,将其正确绑定到目标View上。可以通过使用ViewInteraction.perform()方法来执行自定义的ViewAction。例如:
  3. perform方法中的逻辑错误: 检查你在perform方法中的逻辑是否正确。确保你在perform方法中实现了你想要的操作,并且没有遗漏任何关键步骤。
  4. ViewAction与目标View不兼容: 确保你的自定义ViewAction与目标View兼容。例如,如果你的ViewAction是针对Button的,但你尝试将其应用于TextView,那么它可能不起作用。确保你的ViewAction与目标View的类型匹配。
  5. Espresso版本不兼容: 检查你使用的Espresso版本是否与你的代码兼容。有时,某些Espresso版本可能与特定的Android版本或库不兼容,导致perform方法不起作用。尝试更新Espresso版本或检查相关的兼容性问题。

如果以上方法都没有解决问题,可以尝试以下步骤来进一步调试和排查问题:

  1. 检查日志: 查看日志输出,看是否有任何与perform方法相关的错误或警告信息。这可能会提供有关问题的更多线索。
  2. 使用断点调试: 在perform方法中设置断点,并使用调试器来跟踪代码执行过程。这样可以确定perform方法是否被调用,以及在执行过程中是否出现任何异常。
  3. 确认View的可见性: 确保目标View在执行perform方法时是可见的。如果View不可见,perform方法可能不会被调用。可以使用Espresso的ViewAssertions来验证View的可见性。

总结: 当覆盖espresso ViewAction中的perform方法时,如果方法不起作用或者不被调用,需要检查绑定、逻辑错误、兼容性、Espresso版本以及其他可能的问题。通过调试和排查,可以找到问题的根本原因并解决它。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android UI 测试 - Espresso

要是真的去写这测试,还得写许多代码,考虑许多过程,然后再编译,怎么觉得,还不如 Instant Run 加自己手动操作测试来得快呢。...View 上执行操作 // 执行点击 onView(...).perform(click()); // 执行多个操作 onView(...).perform(typeText("Hello"), click...()); // 如果在 ScrollView 里,要先滚动使 View 在当前页面显示出来,然后再执行其它动作 // 如果 View 本身就在页面显示,srollTo 不起作用 onView(......).perform(scrollTo(), click()); 可执行操作参见 https://developer.android.com/reference/android/support/test.../espresso/action/ViewActions 检查状态 主要通过 .check(matches()) 方法,matches 里是寻找 View 那些过滤方法, // 断言 View 没有显示

1.1K10

Espresso浅析和使用

) .perform(ViewAction) .check(ViewAssertion); 其中,onView是用来定位View控件perform是操作控件,check是校验View控件状态...1.2 完整测试用例代码 这是一个非常简单测试用例,通过R.id.button定位控件,对它调用了一下click,最后校验控件是不是enabled状态。...这个视频中提到了2个写测试用例注意项: 避免Activity层级跳转,测试用例尽量只在单个Activity内完成。...Activity层级跳转越多,越容易出错 强烈不推荐,直接获取View对象,调用View方法来模拟用户操作。...原因是,Espresso用例运行过程是只有当UI线程IDLE和UI队列没有需要执行事件Espresso测试代码才会被执行。使用方无需写Sleep逻辑等待UI绘制完成。

2.4K00
  • Android使用Espresso实现UI自动化测试

    所以当你想直接测试某个界面,你可以把那个界面填到这个参数里,这样就直接打开你指定界面进行测试了。...@Test @Test public void testLogin() { ... } 定义一个测试方法,当你测试类运行时,所执行代码就是Test注解下方法(Espresso还提供了其他一些注解...: 比如@After,@Before等,具体用法可以去上面写android官网上查看),当然上面那段代码对应就是testLogin测试方法,testLogin方法里所定义就是要测试内容。...ViewActions 执行事件 对View操作:perform()方法 方式是onView(...).perform()。...也可以执行多个操作在一个perform如:perform(click(),clearText())。 所有的操作都有一个前提 ———— 就是要执行view必须在当前界面上显示出来(有且可见)。

    1.5K20

    Android利用Espresso进行UI自动化测试方法详解

    所以当你想直接测试某个界面,你可以把那个界面填到这个参数里,这样就直接打开你指定界面进行测试了。...@Test @Test public void testLogin() { ... } 定义一个测试方法,当你测试类运行时,所执行代码就是Test注解下方法(Espresso还提供了其他一些注解...: 比如@After,@Before等,具体用法可以去上面写android官网上查看),当然上面那段代码对应就是testLogin测试方法,testLogin方法里所定义就是要测试内容。...ViewActions 执行事件 对View操作:perform()方法 方式是onView(...).perform() 。...也可以执行多个操作在一个perform如:perform(click(),clearText()) 。

    2.4K10

    基于Kotlin DSLEspresso和UIAutomator融合客户端自动化

    然而,如果我们想设计一套自顶向下,设备、接口、代码层级均可自动化执行且有一定校验框架或系统,就会发现这两个完全不同语法库融合一起后,可读性和可维护性几乎等于零。...EspressoEspresso,我们一般会处理三种类型对象:匹配器、ViewAction和ViewAssertions。...属于God对象,即每次调用都会需要用到UIDevice实例 4、定义UISelector,UISelector作用是可以通过资源ID查询想要UI组件,但是UIAutomator没有这种方法,所以我们需要用到步骤...而在Kotlin,DSL 则是对 Kotlin 所有语法糖一个大融合,它代码结构通常是链式调用、lambda 嵌套,并且接近于日常使用英语句子,我们可以愉悦使用 DSL 风格 API,同时,...我们如果要自行更新或增加Kotlin DSL库内容,可以将UIAutomator和Espresso相同操作通过Espresso实现,并集合在库

    2.3K50

    Android开发者UI自动化测试上手指南

    这里包含了三个流程: 找元素:找到UI上测试所针对元素; 做操作:给这个元素做一些操作; 检查结果:这个元素做出了期望行为。....check(matches(isDisplayed())); } 代码逻辑也是典型三步: 首先通过withId方法找到了id为name_fieldEditText组件,并且调用typeText方法对其进行设置...一些Espresso主要方法 UI自动化具体实例 这里建议参照官方文档给出步骤进行实践,示例给出自己在实践demo配置自动化测试基本步骤。...异步和延迟 有时点击一个按钮,ui操作后需要执行一个较为耗时事情通常会采用异步回调方式通知显示结果,这时进行UI自动化测试第三步验证结果时机就不能才能同步方式去执行,而是需要做异步回调通知执行或延迟执行...当方法执行完成,调用ResourceCallback.onTransitionToIdle();则会进行回调通知测试线程继续执行验证代码。 总结 一切能自动化完成测试操作就不要浪费时间用手动完成。

    84820

    The Clean Architecture in PHP 读书笔记(四)The Clean Architecture in PHP 读书笔记(四)

    ,根据SOLIDD(Dependency Inversion Principle)原则,这显然会导致代码不易重构 It makes it hard to test 由于内部生成使用类,...此时测试时候,我们只需要通过setter方法设置MockCustomerRepository即可。 这种方法有一个缺点:如果我们忘记了调用setter方法,那就完蛋了。...使用Constructor injection 此时代码这个样子: $controller = new CustomerController( new CustomerRepository() );...one component 当有多个地方都去new同一个类,并且构建需要一些额外动作时候,我们就要考虑将构建这个动作封装起来了,核心点是:代码复用 The dependency has...,有时间可以翻译下,通俗给讲一下

    32210

    正确使用 waitnotifynotify方法以及源码解析

    另外,当前线程必须持有对象监控器(也就是使用 synchronized 加锁) 必须把 wait 方法写在 synchronized 保护 while 代码,并始终判断执行条件是否满足,如果满足就往下继续执行...到生产者调用 give 方法,放入数据并视图唤醒消费者线程。可这个时候唤醒不起作用呀。消费者并没有在等待。 最后,消费者回去调用 wait 方法,就进入了无限等待。 看明白了吗?...第一步,消费者判断了 while 条件,但真正执行 wait 方法,生产者已放入数据,之前 buffer.isEmpty 结果已经过期了,因为这里 “判断 - 执行” 不是一个原子操作,它在中间被打断了...正确写法应该是这样子:以下写法就确保永远 notify 方法不会在 buffer.isEmpty 和 wait 方法之间被调用,也就不会有线程安全问题。...这个锁是对象级别的,而不是线程级别的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象 wait 方法就有意义了,它等待就是这个对象锁。

    1.3K20

    ThreadStatus(线程几种状态)

    阻塞状态是线程阻塞在进入synchronized关键字修饰方法代码块(获取锁)状态,但是阻塞在java.concurrent包Lock接口线程状态却是等待状态,因为java.concurrent...当调用notify()方法后,将从对象等待队列移走一个任意线程并放到锁标志等待池中,只有锁标志等待池中线程才可能够获取锁标志;如果等待队列没有线程,则notify()不起作用。...在A线程调用了B线程join()方法,表示只有当B线程执行完毕,A线程才能继续执行。如果有多个线程,除了A线程之外其他线程正常竞争cpu和锁。...sleep方法使当前线程(即调用方法线程)暂停执行一段时间,让其他线程有机会继续执行但它并不释放对象锁。...直到对应线程执行resume()方法后,被挂起线程才能继续,从而其它被阻塞在这个线程才可以继续执行

    92020

    Swift 中风味各异类型擦除

    继续从之前RequestQueue示例开始,我们首先创建该包装器类型——该包装器类型将捕获每个请求perform方法作为闭包,以及在请求完成后应调用处理程序: // 这将使我们将 Request...使用闭包擦除类型,其思想是捕获在闭包内部执行操作所需所有类型信息,并使该闭包仅接受非泛型(甚至是Void)输入。...,我们必须手动将其转换为RequestOperation——虽然这不会在每个调用点添加大量代码,但这取决于必须完成相同转换次数,它最终可能会有点像样板。...必须进行类型擦除最初看起来像是一件不必要杂务,但它也带来了一些好处——比如从不需要关心这些类型代码隐藏特定类型信息。...什么样类型擦除是最合适——无论是现在还是将来——当然很大程度上取决于上下文,以及我们功能是否可以在闭包轻松地执行,或者完整包装器类型或泛型是否更适合这个问题。 感谢阅读!? ?

    1.7K20

    Swift 风味各异类型擦除

    继续从之前RequestQueue示例开始,我们首先创建该包装器类型——该包装器类型将捕获每个请求perform方法作为闭包,以及在请求完成后应调用处理程序: // 这将使我们将 Request...使用闭包擦除类型,其思想是捕获在闭包内部执行操作所需所有类型信息,并使该闭包仅接受非泛型(甚至是Void)输入。...,我们必须手动将其转换为RequestOperation——虽然这不会在每个调用点添加大量代码,但这取决于必须完成相同转换次数,它最终可能会有点像样板。...必须进行类型擦除最初看起来像是一件不必要杂务,但它也带来了一些好处——比如从不需要关心这些类型代码隐藏特定类型信息。...什么样类型擦除是最合适——无论是现在还是将来——当然很大程度上取决于上下文,以及我们功能是否可以在闭包轻松地执行,或者完整包装器类型或泛型是否更适合这个问题。

    91420

    Java线程状态(生命周期)以及线程状态转换详解

    阻塞状态是线程阻塞在进入synchronized关键字修饰方法代码块(获取锁)状态,但是阻塞在java.concurrent包Lock接口线程状态却是等待状态,因为java.concurrent...当调用notify()方法后,将从对象等待队列移走一个任意线程并放到锁标志等待池中,只有锁标志等待池中线程才可能够获取锁标志;如果等待队列没有线程,则notify()不起作用。...join方法主要作用就是同步,它可以使得线程之间并行执行变为串行执行,有些类似于同步运行效果。在A线程调用了B线程join()方法,表示只有当B线程执行完毕,A线程才能继续执行。...join方法如果传入参数,则表示这样意思:如果A线程调用B线程join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行。...其他线程都无法访问被它占用锁。直到对应线程执行resume()方法后,被挂起线程才能继续,从而其它被阻塞在这个线程才可以继续执行

    66140

    小心!做UI自动化一定要跨过这些坑

    “测试框架自己有bug,改用例也没用啊……” “调试时候这个用例还是通,放到daily里面跑就不通,到底怎么回事嘛!”...1、优化测试代码框架 无论你选择appium、uiautomator、robotium还是espresso,刚入门,看到sample应该大致都是这样。 ?...拿上面的espresso来说: 1.假如action_save这个id开发改了,而你用例集中,有30个步骤用例到了这个id,一个个去改,是不是要疯?...其实,在框架层驱动测试开始前,框架会先调用如下图八所示setAllField来初始化所有的page页面。 1、如果被测应用未混淆资源,该方法只是将@FindBy值赋值给Field。...该方法可以在@BeforeClass或者RunListenertestRunStarted调用

    1.2K91

    小心!做 UI 自动化一定要跨过这些坑

    1 优化测试代码框架 无论你选择appium、uiautomator、robotium还是espresso,刚入门,看到sample应该大致都是这样。...拿上面的espresso来说: 假如action_save这个id开发改了,而你用例集中,有30个步骤用例到了这个id,一个个去改,是不是要疯?...这两个方法,基本解决了笔者遇到图一所有的设计类问题。 图三 框架设计建议 按照图三进行分层设计后,得到如图四测试代码包。...其实,在框架层驱动测试开始前,框架会先调用如下图八所示setAllField来初始化所有的page页面。 如果被测应用未混淆资源,该方法只是将@FindBy值赋值给Field。...该方法可以在@BeforeClass或者RunListenertestRunStarted调用

    4.5K11

    使用Calabash进行Android和iOS UI测试

    如果你一直在手动测试你应用程序,你可能会浪费大量时间来重复执行相同任务。你可以对代码进行一些修改,构建应用程序,在设备或模拟器运行它,并调整应用程序,以确定它是否符合预期。...官方文档甚至还推荐了用于测试特定框架。官方Android文档涵盖了有关Espresso一些主题,即Android UI测试框架。同样,Apple建议使用XCTest框架。...每一个意识到测试自动化开发人员都知道这是一个好主意。但是,当谈到坐下来写这些测试,许多开发人员开始质疑是否值得他们时间,因为“手动触碰按钮”会比编写一个自动“触碰这个按钮”代码要快得多。...Calabash:移动应用程序自动验收测试 大约一年前,开始寻找一个测试框架,这个框架对于那些不是软件开发人员的人来说很容易使用。而这是发现Calabash时候。...这个开源测试框架由Xamarin团队开发和维护,适用于Android和iOS。它允许您为移动应用程序编写和执行自动化验收测试。

    2K10

    COLA-statemachine事务失效踩坑

    以期望在后续操作更好利用Spring特性 简单改造后状态机代码可能如下 // 以下代码并不是定义状态机正确做法,错误使用方法造成了事务失效,后面在方法解析 @Component public...,无典型事务失效场景,搜索半天@TransactionalEventListener监听不起作用原因无果后,又仔细检查了StateMachine类when和perform调用,也都是通过@Autowired...代码改造后看起来很正常,按理来说不应该出现这个问题。 在百思不得其解时候,发现本地日志输出稍微和平时有些不一样,在执行上述Action逻辑,没有mybatis-plus事务相关日志。...execute 在状态机使用过程并没有直接调用方法,所以只能是由框架内部调用。...,用代理对象进行自身方法调用 很可惜,两种方法在当前场景都不适用,因为自调用在COLA框架内部,如果为了解决这个问题去再包装框架就有点大动干戈了。

    1.2K12

    自动化Telnet任务:用Linux脚本解析消息并退出

    问题 正在连接到一个 telnet 监听器。telnet 服务器每秒发送 '1234'。想读取这条消息 '1234' 并关闭 telnet 会话。 下面是代码但它不起作用。 #!...回答 如果你目标 telnet 服务端口是可访问,那么最简单和最容易方法就是: sleep | telnet n - 自动退出前等待时间,以秒为单位。...这个时间可以是小数,例如 0.5 秒。请注意,某些需要输出可能不会在指定等待时间内返回。因此,我们可能需要相应地增加等待时间。 server - 目标服务器IP或主机名。...,则上述方法可能不奏效。...在这种情况下,需使用以下方法: RESPONSE=$(timeout 5 telnet 192.168.10.24 1234) 参考 stackoverflow question 10172860 man

    15310

    Android 单元测试和 UI 测试初步实践

    它跟 @Rule 注解几乎相同,可以在所有类方法开始前进行一些相关初始化调用操作。使用这个注解,可以在执行测试用例时候加入特有的操作,而不影响原有用例代码,有效减少耦合程度。...所谓 mock 就是创建一个类虚假对象,在测试环境,用来替换掉真实对象,以达到验证对象方法调用情况,或是指定这个对象某些方法返回特定值等; @Before 注解方法会在执行测试用例之前执行...,所以在代码前两行笔者通过 Mockito when() 方法,在程序调用 DataManager#getNews() 方法返回一个空 NewsResultBean 实例。...执行操作:执行 P 层 NewsPresenter#getNews()。在业务逻辑执行方法之后,会先调用 DataManager#getNews(),然后将数据交给 V 层代理。...其实这个方法也是有输出,输出就是:调用了 DataManager#getNews() 方法,获取到数据后调用 NewsContract.View#showNews(news) 显示数据。

    2K10
    领券