我有一个测试一直失败,因为Error performing 'single click - At Coordinates: 191, 325 and precision: 16, 16' on view 'with text: is "Weight"'.
测试代码;
@Before
fun openFragment() {
launchFragmentInContainer<SettingsFragment>()
}
@Test
fun changeWeight() {
//Espresso.onView(ViewMatchers.withText("Weight")).check(matches(isDisplayed()))
Espresso.onView(ViewMatchers.withText("Weight")).perform(ViewActions.click())
//Espresso.onView(ViewMatchers.withText("Pounds (lb)")).inRoot(isDialog()).check(matches(isDisplayed()))
}
此处有完整的堆栈跟踪信息;
androidx.test.espresso.PerformException: Error performing 'single click - At Coordinates: 191, 325 and precision: 16, 16' on view 'with text: is "Weight"'.
at androidx.test.espresso.PerformException$Builder.build(PerformException.java:86)
at androidx.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:87)
at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:59)
at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:322)
at androidx.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:178)
at androidx.test.espresso.ViewInteraction.perform(ViewInteraction.java:119)
at com.example.SettingsTest.changeWeight(SettingsTest.kt:53)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853)
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x0
at android.content.res.Resources.getValue(Resources.java:1266)
at android.content.res.Resources.loadXmlResourceParser(Resources.java:2649)
at android.content.res.Resources.getLayout(Resources.java:1082)
at android.view.LayoutInflater.inflate(LayoutInflater.java:412)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at androidx.appcompat.app.AlertController$AlertParams.createListView(AlertController.java:989)
at androidx.appcompat.app.AlertController$AlertParams.apply(AlertController.java:965)
at androidx.appcompat.app.AlertDialog$Builder.create(AlertDialog.java:984)
at androidx.preference.PreferenceDialogFragmentCompat.onCreateDialog(PreferenceDialogFragmentCompat.java:157)
at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:419)
at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1484)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:320)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1187)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1497)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:447)
at androidx.fragment.app.FragmentManager.executeOps(FragmentManager.java:2169)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1992)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1947)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1849)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:413)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at androidx.test.espresso.base.Interrogator.loopAndInterrogate(Interrogator.java:148)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:525)
at androidx.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:484)
at androidx.test.espresso.base.UiControllerImpl.injectMotionEvent(UiControllerImpl.java:236)
at androidx.test.espresso.action.MotionEvents.sendUp(MotionEvents.java:162)
at androidx.test.espresso.action.MotionEvents.sendUp(MotionEvents.java:139)
at androidx.test.espresso.action.Tap.sendSingleTap(Tap.java:170)
at androidx.test.espresso.action.Tap.access$100(Tap.java:31)
at androidx.test.espresso.action.Tap$1.sendTap(Tap.java:47)
at androidx.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:137)
at androidx.test.espresso.ViewInteraction$SingleExecutionViewAction.perform(ViewInteraction.java:366)
at androidx.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:255)
at androidx.test.espresso.ViewInteraction.access$100(ViewInteraction.java:65)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:158)
at androidx.test.espresso.ViewInteraction$1.call(ViewInteraction.java:155)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Test running failed: Instrumentation run failed due to 'android.content.res.Resources$NotFoundException'
这是我的app.gradle文件的局部视图;
androidTestImplementation 'androidx.test:core-ktx:1.2.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.2.0'
debugImplementation('androidx.fragment:fragment-testing:1.2.4') {
// exclude androidx.test:core while fragment_testing depends on 1.1.0
exclude group: 'androidx.test', module: 'core'
}
SettingsFragment.kt;
的代码class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.root_preferences, rootKey)
}
}
我的首选项对象的xml;
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory app:title="@string/settings_measures">
<ListPreference
app:defaultValue="kilograms"
app:entries="@array/weight_entries"
app:entryValues="@array/weight_values"
app:key="weight"
app:title="@string/settings_weight"
app:useSimpleSummaryProvider="true" />
<ListPreference
app:defaultValue="liters"
app:entries="@array/volume_entries"
app:entryValues="@array/volume_values"
app:key="volume"
app:title="@string/settings_volume"
app:useSimpleSummaryProvider="true" />
<ListPreference
app:defaultValue="centimeters"
app:entries="@array/length_entries"
app:entryValues="@array/length_values"
app:key="length"
app:title="@string/settings_length"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
<PreferenceCategory app:title="@string/settings_duration">
<ListPreference
app:defaultValue="12hours"
app:entries="@array/time_entries"
app:entryValues="@array/time_values"
app:key="time"
app:title="@string/settings_time"
app:useSimpleSummaryProvider="true" />
<ListPreference
app:defaultValue="dayDash"
app:entries="@array/date_entries"
app:entryValues="@array/date_values"
app:key="date"
app:title="@string/settings_date"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
</PreferenceScreen>
有趣的是,此代码是从导航到应用程序中的设置片段的版本中重构的,可以工作,但是我想删除导航依赖项,发现可以使用launchFragmentInContainer()
独立地启动片段。
这引入了导入测试库androidx.fragment:fragment-testing:1.2.4
的问题,我发现解决方法是排除其中的一部分。这样做的副作用是,被测试的片段通常以黑色背景启动,通常这是不常见的-片段打开后,我可以通过Thread.sleep(6000)
来证明这一点。
我还注意到,在(新)布局管理器中,似乎仅针对此测试启动了两个过程,这两个实例是: com.example
和com.example.test
的.test版本似乎未在布局管理器中加载任何内容,而另一版本则加载了黑色背景版本。
最后,我测试了带有“ check”的“ Weight”视图,在此版本的代码中将其注释掉,用于演示。
我在另一个问题上发现了类似的问题,但是它的stacktrace版本似乎比我的更为冗长,而且我似乎无法获得类似的冗长版本。
知道为什么会发生此错误以及如何阻止它发生吗?
编辑:经过更多测试后,我发现其他元素(“体积”和“长度”)也提供相同的错误。
编辑:而且longClick()
也给出相同的错误。
EDIT1:我也将launchFragmentInContainer()
移到了changeWeight()
的正文中,同样的错误。
EDIT2:我已经开始使用其他两个片段对此进行测试。顶部的测试代码将打开一个对话框,而我测试的另一个则替换了一个Fragment,这两个操作均无效。但是,当我尝试仅选中一个执行ViewActions
的复选框时,它就可以正常工作,并且不会抛出任何错误。在我看来,与窗口互动的操作无法与launchFragmentInContainer()
一起使用。