android-espresso 相关问题

Espresso是一个用于编写Android UI测试的库。也被称为Google的Android测试工具

是否可以在--test-targets命令中指定多个注释

根据firebase文档,我应该能够指定多个测试目标过滤器 - https://cloud.google.com/sdk/gcloud/reference/firebase/test/android/run#--test-targets 我已经指定...

回答 1 投票 0

Android Espresso 在 ActionBar 中将文本键入 EditText

我的 ActionBar 中有一个由 XML 扩充的 SearchView 我的 ActionBar 中有一个 SearchView,它是从 XML 中膨胀的 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_menu_search" android:showAsAction="always|collapseActionView" android:icon="@drawable/action_bar_search_icon" android:actionViewClass="android.widget.SearchView"/> </menu> 我用这种方式在我的片段中将其充气: @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.search, menu); final MenuItem item = menu.findItem(R.id.action_menu_search); searchView = (SearchView) item.getActionView(); searchView.setOnQueryTextListener(this); } 我的测试: onView(withId(R.id.catalog_filter_indicator_header_text)).perform(click()); //enter text and wait for suggestions onView(withId(R.id.action_menu_search)).perform(click()); onViewisAssignableFrom(AutoCompleteTextView.class)).perform(click(), typeText("test")); 看起来该字段在开始输入时失去了焦点。而且我也不知道为什么。 找到所有视图,并且 typeText 语句顺利通过,但文本未出现在字段中。我也尝试过使用简单的 EditText 和自定义 android:actionLayout,但结果相同。 我有什么遗漏的吗? 此代码适用于我的 SerachView 中的 ActionBar,因为 SearchView 是我的 EditText 中唯一的 Fragment : onView(withId(R.id.action_search)).perform(click()); onView(isAssignableFrom(EditText.class)).perform(typeText("test"), pressKey(KeyEvent.KEYCODE_ENTER)); KeyEvent.KEYCODE_ENTER 是按下提交按钮的代码。 搜索视图有默认 ID。 你可以用这种方式在 Espresso 中得到它。 onView(withId(androidx.appcompat.R.id.search_src_text)).perform(typeText("example"), pressKey(KeyEvent.KEYCODE_ENTER)); 在 AndroidX 之前,ID 为 android.support.design.R.id.search_src_text 希望这有用。 最后,我决定创建自己的自定义操作,因为我无法输入文本工作。这是我的代码: public static ViewAction setText(final String text){ return new ViewAction(){ @Override public Matcher<View> getConstraints() { return allOf(isDisplayed(), isAssignableFrom(TextView.class)); } @Override public String getDescription() { return "Change view text"; } @Override public void perform(UiController uiController, View view) { ((TextView) view).setText(text); } }; } 此代码对于在 TextView 的所有子级中编写代码很有用。 F. 前,EditText。 我从https://stackoverflow.com/a/32850190/1360815获取此代码 SearchView中EditText的id是search_src_text onView(withId(R.id.action_menu_search)).perform(click()); onView(withId(R.id.search_src_text)).perform(typeText("test")); 接受的答案很好,但不再需要了,因为官方 Espresso 库包含与 replaceText 功能相同的功能。 您可以像下面这样使用它,而无需自定义实现 onView(withId(R.id.search_src_text)).perform(replaceText("test")) 这两个 ViewInteraction 提供对 SearchView 及其 EditText 的访问: /** @return {@link ViewInteraction} {@link SearchView}. */ private ViewInteraction onSearchView() { return Espresso.onView(ViewMatchers.withId(R.id.menu_action_search_view)); } /** @return {@link ViewInteraction} {@link SearchView} {@link EditText}. */ private ViewInteraction onSearchEditText() { return Espresso.onView(CoreMatchers.allOf( ViewMatchers.isDescendantOfA(ViewMatchers.withId(R.id.menu_action_search_view)), ViewMatchers.isAssignableFrom(EditText.class) )); } 像这样使用: @Test public void testSearchView() { onSearchView() .perform(ViewActions.click()); onSearchEditText() .perform(ViewActions.clearText() ,ViewActions.typeText("test")); }

回答 6 投票 0

Gradle:上传 app-local-debug.apk 时出错:未知失败([CDS]close[0])

我正在尝试使用 gradlew cat 命令与我的 Android 手机执行连接的 Android 测试。但我收到以下错误日志,并且无法安装该应用程序。 如果 adb comm...

回答 6 投票 0

如何将 Espresso Idling Resource 与 Kakao 一起使用?

我使用以下空闲资源实现来等待元素出现在屏幕上,然后再执行检查。 私有类 ViewPropertyChangeCallback(私有 val 匹配器: Matcher 我使用以下空闲资源实现来等待元素出现在屏幕上,然后再执行检查。 private class ViewPropertyChangeCallback(private val matcher: Matcher<View>, private val view: View) : IdlingResource, ViewTreeObserver.OnDrawListener { private lateinit var callback: IdlingResource.ResourceCallback private var matched = false override fun getName() = "View property change callback" override fun isIdleNow() = matched override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback) { this.callback = callback } override fun onDraw() { matched = matcher.matches(view) callback.onTransitionToIdle() } } fun waitUntil(matcher: Matcher<View>): ViewAction = object : ViewAction { override fun getConstraints(): Matcher<View> { return Matchers.any(View::class.java) } override fun getDescription(): String { return StringDescription().let { matcher.describeTo(it) "wait until: $it" } } override fun perform(uiController: UiController, view: View) { if (!matcher.matches(view)) { ViewPropertyChangeCallback(matcher, view).run { try { IdlingRegistry.getInstance().register(this) view.viewTreeObserver.addOnDrawListener(this) uiController.loopMainThreadUntilIdle() } finally { view.viewTreeObserver.removeOnDrawListener(this) IdlingRegistry.getInstance().unregister(this) } } } } } fun waitForElement(matcher: Matcher<View>) { onView(isRoot()) .perform(waitUntil(hasDescendant(matcher))) } fun waitElement(element: Matcher<View>, matching: Matcher<View> = isDisplayed()) { waitForElement(Matchers.allOf(element, matching)) } 我可以这样使用它: fun waitForButton() { waitElement(withId(R.id.buttonId)) } 我想要实现的是使用空闲资源与Kakao KBaseView<*> 喜欢: private val buttonElement = KButton {withId(R.id.buttonId)} fun waitForButton() { buttonElement.waitElement() } 我刚刚开始在 Android 上进行自动化测试,因此我将不胜感激任何有关如何执行此操作的示例或技巧 由于Kakao没有内置的等待机制,我们可以使用空闲资源逻辑来扩展KBaseView。方法如下: open class KBaseViewWithIdlingResource<T>(private val viewMatcher: Matcher<View>) : KBaseView<T>() { private var callback: IdlingResource.ResourceCallback? = null private fun registerIdlingResource() { val idlingResource = ViewPropertyChangeCallback(viewMatcher, view) IdlingRegistry.getInstance().register(idlingResource) idlingResource.registerIdleTransitionCallback { callback?.onTransitionToIdle() IdlingRegistry.getInstance().unregister(idlingResource) } } fun waitUntilDisplayed() { registerIdlingResource() Espresso.onView(withId(id)).perform(waitForView()) } }

回答 1 投票 0

Espresso - 获取元素文本

如果我有一个“AppCompatTextView”元素,我可以通过以下方式访问: onView(withId(R.id.allergies_text)) 来自布局检查器: 有没有办法可以访问 Android Studio 中元素的文本? (到

回答 5 投票 0

Android Gradle 托管设备 - 无法检索设备错误

当尝试运行多个 gradle 托管设备时,在一台机器上我们收到错误 “无法检索 2 个设备,只有 1 个可用。继续在 1 个分片上运行测试。” 使用这个运行

回答 2 投票 0

Espresso 意向阴性检查

我正在学习一些使用 Espresso 的测试,并且我已经了解如何检查意图是否已启动。 我不明白的是我如何检查意图是否未启动。 我尝试过...

回答 1 投票 0

Espresso 与找到的意图不符

我尝试在 Android Espresso 上使用 Matcher 来模拟以下内容: Intent { act=android.intent.action.CHOOSER (has extras) } 处理包:[[android, com.android.systemui]],额外内容: [

回答 1 投票 0

如何使用 Espresso 测试操作栏上的主页按钮?

我已启用主页按钮以返回到上一个视图。简单地说,这样做: getActionBar().setDisplayHomeAsUpEnabled(true); 我正在使用最新版本的 com.android.support:appcompat-v7:2...

回答 5 投票 0

如何让 JUnit4 在运行测试之前“等待”异步作业完成

我正在尝试为与云服务通信的 Android 应用程序编写一个测试。 理论上测试流程应该是这样的: 在工作线程中向服务器发送请求 哇...

回答 2 投票 0

如何使用 Espresso 单独测试片段?

我有一个要测试的片段。我创建了一个测试活动,向其中添加此片段并运行一些 Espresso 测试。 但是,Espresso 在 Fragment 内找不到任何视图。它...

回答 6 投票 0

Android Espresso:如何将文本输入到嵌入 TextInputLayout 的 editText 中

寻找一种方法将 Text 或 typeText 替换为嵌入 TextInputLayout 中的编辑文本。 我尝试过一些这样的事情: 执行(ViewActions.typeTextIntoFocusedView(“字符串”)); ...

回答 4 投票 0

用 Espresso 单击弹出菜单按钮?

有没有办法单击锚定到 ListView 项目的膨胀 PopupMenu 中的项目? 我有一个通过单击 ListView 内的按钮创建的 PopupMenu。我需要单击 p 内的一个项目...

回答 1 投票 0

Gradle 托管设备 - 蓝牙不断停止

通过运行 gradle 管理的设备时 ./gradlew Pixel4api32DebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.xxx.xxx.xxx.Suites.CITestSuite -Pandroid.experimental.androidTest.

回答 1 投票 0

Android Studio 中未启用“记录浓缩咖啡测试”选项

“记录浓缩咖啡测试”选项在 Android Studio 中显示为灰色。 造成这种情况的可能原因有哪些? 我已经安装了 Espresso 测试依赖项并且正在运行模拟器。

回答 1 投票 0

使用 Orchestrator 时在 Android 中使用 Jacoco 实现代码覆盖率

我正在尝试从我们的测试套件获取覆盖率报告,该测试套件需要与 Android Test Orchestrator 一起运行。 有一个固定问题引用了另一个固定问题。 按照他们的建议,我...

回答 1 投票 0

在 Android Studio 中的 UI 测试中等待函数而不使用 Thread.Sleep() 的最佳方法是什么?

我正在使用 Espresso 为我开发的 Android 应用程序编写一些自动化测试。所有测试都是自动化的,并且根据 UI 发生的情况来通过/失败。我已经运行了代码

回答 1 投票 0

Android:将 JSON 解析为 gradle 参数

我需要将 JSON 解析为 gradle 参数,以通过该数据提供 UI 测试。我目前在 build.gradle 中做什么: def getJson() { 项目.getProperties().get('getJson') } 然后我...

回答 1 投票 0

由于 AnimatedVectorDrawableCompat 导致的 AppNotIdleException

我有以下动画矢量可绘制: 我有以下动画矢量可绘制: <?xml version="1.0" encoding="utf-8"?> <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_ventilation" > <target android:name="fan_group" android:animation="@animator/fan_rotation_animation" /> </animated-vector> 它只是使用旋转动画为风扇设置动画。 我在 ImageView 中设置此图标并调用以下方法控制开始/停止动画(nnly 在 Lollipop 和 high 中): public void setStopped(boolean stopped) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { this.setImageResource(R.drawable.ic_ventilation_animated); Drawable drawable = this.getDrawable(); if (drawable instanceof AnimatedVectorDrawableCompat) { if(stopped) { ((AnimatedVectorDrawableCompat) drawable).stop(); } else { ((AnimatedVectorDrawableCompat) drawable).start(); } } } } 但是我遇到以下异常: android.support.test.espresso.AppNotIdleException: Looped for 3654 iterations over 60 SECONDS. The following Idle Conditions failed . at dalvik.system.VMStack.getThreadStackTrace(Native Method) at java.lang.Thread.getStackTrace(Thread.java:580) at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:88) at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:51) at android.support.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:312) at android.support.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:173) at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:114) 我在开发者选项菜单中禁用了动画,如此处所述。 禁用动画后,我发现调用 ((AnimatedVectorDrawableCompat) drawable).start(); 后图标不再有动画效果。但是,会引发异常。 即使动画被禁用,调用((AnimatedVectorDrawableCompat) drawable).start();方法时是否有问题?我该如何解决这个问题,以便我可以运行我的测试而无需关心动画? 在我的例子中,这个问题是由设置为无限重复动画的objectAnimator引起的(android:repeatCount="infinite")。 该问题也仅存在于较旧的平台版本上。测试在 Android 9 上完美运行,而问题在 Android 5 和 6 上重现(目前不确定 7 和 8)。 我相信,问题的根本原因与不确定的进度条相同(在此问题中涵盖)。但是,我还没有找到任何好的解决方案,只有解决方法。 解决方法之一是检测设置中动画已关闭(动画师持续时间为 0),并且不启动动画。当然,这只适用于动画不自动启动的平台版本。 private fun startIconAnimation(imageView: ImageView) { if (areAnimationsEnabled()) { (imageView.drawable as Animatable).start() } } private fun areAnimationsEnabled(): Boolean { val animatorDurationScale = Settings.Global.getFloat( requireContext().contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1.0f ) return animatorDurationScale != 0.0f } 注意:API 级别 26 引入了静态方法ValueAnimator.areAnimatorsEnabled(),如果问题不仅仅发生在旧平台版本上,这会很方便。

回答 1 投票 0

Android Espresso:java.lang.NoClassDefFoundError:解析失败:Landroidx/test/platform/io/FileTestStorage;

对于我正在制作的应用程序,我添加了以下 UI 测试代码: @LargeTest @RunWith(AndroidJUnit4::class) 类MainActivityTest { @规则 @JvmField var mActivityTestRule = ActivityTestR...

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.