我是使用espresso的新手,现在我正在为我的应用程序开发自动化测试。
我有如下所示的布局,并且在带有id(R.id.parameter_layout)的线性布局中,我以编程方式创建和膨胀作为子视图编辑文本。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/parameter_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:orientation="vertical"/>
</ScrollView>
</LinearLayout>
我可以使用以下代码获取子视图:
onView(withId(R.id.parameter_layout)).check(matches(withChildHint("areaPath")));
但是当我尝试绑定下面的执行类型文本时,我收到了错误。
onView(allOf(withId(R.id.parameter_layout),withChildHint("areaPath"))).perform(typeText("aaa"), closeSoftKeyboard());
这是我的withChildHint方法:
static Matcher<View> withChildHint(final String string) {
return new BoundedMatcher<View, LinearLayout>(LinearLayout.class) {
@Override
public boolean matchesSafely(LinearLayout view) {
View child = view.getChildAt(0);
if (child != null && child instanceof EditText) {
return ((EditText) child).getHint().toString().equals(string);
}`
return false;
}
@Override
public void describeTo(Description description) {
description.appendText("with child text: ");
}
};
}
蚂蚁这是我得到的错误:
> android.support.test.espresso.PerformException: Error performing 'type text(/axon-v3/portal/areas/1)' on view '(with id: com.greenwavesystems.axon.lib.testapp:id/parameter_layout and with child text: )'.
at android.support.test.espresso.PerformException$Builder.build(PerformException.java:83)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:70)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:53)
at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
at com.greenwavesystems.axon.lib.testapp.MethodActivityTest.testMethod(MethodActivityTest.java:95)
at java.lang.reflect.Method.invoke(Native Method)
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 android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
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 android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:59)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:262)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1959)
Caused by: java.lang.RuntimeException: Action will not be performed because the target view does not match one or more of the following constraints:
((is displayed on the screen to the user) and (supports input methods or is assignable from class: class android.widget.SearchView))
Target view: "LinearLayout{id=2131558549, res-name=parameter_layout, visibility=VISIBLE, width=1208, height=378, has-focus=true, 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, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=20.0, child-count=2}"
at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
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:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
请告知我缺少的东西,非常感谢任何帮助。
答案 0 :(得分:1)
在你的logcat中,它说:
引起:java.lang.RuntimeException:由于目标视图与一个或多个目标视图不匹配,因此不会执行操作 以下约束: ((在屏幕上显示给用户)和(支持输入方法或可从类中分配:class android.widget.SearchView))
目标视图:“LinearLayout {id = 2131558549,res-name = parameter_layout,visibility = VISIBLE,width = 1208,height = 378, has-focus = true,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, root-is-layout-requested = false,has-input-connection = false,x = 0.0, y = 20.0,child-count = 2}“
似乎您在typeText
上LinearLayout
正在target view
上执行EditText
。
尝试this solution的想法来获取typeText(...)
然后执行public static Matcher<View> nthChildOf(final Matcher<View> parentMatcher, final int childPosition) {
return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText("with "+childPosition+" child view of type parentMatcher");
}
@Override
public boolean matchesSafely(View view) {
if (!(view.getParent() instanceof ViewGroup)) {
return parentMatcher.matches(view.getParent());
}
ViewGroup group = (ViewGroup) view.getParent();
return parentMatcher.matches(view.getParent()) && group.getChildAt(childPosition).equals(view);
}
};
String param = "{\"a\":\"[\\\"x\\\",\\\"y\\\"]\",\"b\":\"{\\\"z\\\":1}\"}";
答案 1 :(得分:1)
感谢您的帮助,这对我很有帮助:))
我把这个答案放在这里,对于任何可能遇到同样问题的人。 我按照约翰建议的方式输入代码并使用如下:
onView(nthChildOf(withId(R.id.parameter_layout),0)).perform(typeText("aaa"), closeSoftKeyboard());
我可以正确获取编辑文本并执行文本类型。