Android测试片段点击失败

时间:2020-06-04 14:47:21

标签: android android-fragments android-instrumentation

我有一个测试一直失败,因为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.examplecom.example.test的.test版本似乎未在布局管理器中加载任何内容,而另一版本则加载了黑色背景版本。

最后,我测试了带有“ check”的“ Weight”视图,在此版本的代码中将其注释掉,用于演示。

我在另一个问题上发现了类似的问题,但是它的stacktrace版本似乎比我的更为冗长,而且我似乎无法获得类似的冗长版本。

知道为什么会发生此错误以及如何阻止它发生吗?

编辑:经过更多测试后,我发现其他元素(“体积”和“长度”)也提供相同的错误。

编辑:而且longClick()也给出相同的错误。

EDIT1:我也将launchFragmentInContainer()移到了changeWeight()的正文中,同样的错误。

EDIT2:我已经开始使用其他两个片段对此进行测试。顶部的测试代码将打开一个对话框,而我测试的另一个则替换了一个Fragment,这两个操作均无效。但是,当我尝试仅选中一个执行ViewActions的复选框时,它就可以正常工作,并且不会抛出任何错误。在我看来,与窗口互动的操作无法与launchFragmentInContainer()一起使用。

0 个答案:

没有答案