首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为以编程方式创建的编辑文本执行文本类型

为以编程方式创建的编辑文本执行文本类型
EN

Stack Overflow用户
提问于 2017-03-16 07:06:11
回答 2查看 1K关注 0票数 1

我是使用浓缩咖啡的新手,现在我正在为我的应用程序开发自动化测试。

我有如下所示的布局,在id (R.id.parameter_layout)的线性布局中,我创建并以编程方式将文本作为子视图进行编辑。

代码语言:javascript
代码运行次数:0
运行
复制
 <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>

我可以使用下面的代码获得子视图:

代码语言:javascript
代码运行次数:0
运行
复制
onView(withId(R.id.parameter_layout)).check(matches(withChildHint("areaPath")));

但是,当我试图像下面这样绑定执行类型文本时,我得到了错误。

代码语言:javascript
代码运行次数:0
运行
复制
onView(allOf(withId(R.id.parameter_layout),withChildHint("areaPath"))).perform(typeText("aaa"), closeSoftKeyboard());

这是我的withChildHint方法:

代码语言:javascript
代码运行次数:0
运行
复制
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: ");
            }
        };
    }

这是我发现的错误:

代码语言:javascript
代码运行次数:0
运行
复制
 >  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)

请告知我所缺少的东西,并非常感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-16 07:48:11

在你的日志里,上面写着:

由: java.lang.RuntimeException: Action引起的操作将不会执行,因为目标视图不匹配以下一个或多个约束:(在屏幕上显示给用户)和(支持输入方法或可从类:类android.widget.SearchView分配)) 目标视图:"LinearLayout{id=2131558549,res-name=参数型_layout,visibility=VISIBLE,width=1208,height=378,has focus=true,has enabled=true,has聚焦=true,is-id=2131558549=true,is-id=2131558549=false,is-enabled=false,is-layout=false,is-false,root-is-root requested=false,has root connection=false,x=0.0,y=20.0,子-count=2}“

似乎您正在以typeText的形式在LinearLayout上执行target view

尝试this solutionidea,让您的EditText执行typeText(...)

代码语言:javascript
代码运行次数:0
运行
复制
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);
  }
};
票数 1
EN

Stack Overflow用户

发布于 2017-03-16 08:33:10

谢谢你的帮助,它真的帮了我很多:)

我把这个答案放在这里,对任何可能面临同样问题的人来说。我按照John的建议将代码放在上面,并使用如下:

代码语言:javascript
代码运行次数:0
运行
复制
onView(nthChildOf(withId(R.id.parameter_layout),0)).perform(typeText("aaa"), closeSoftKeyboard());

我可以得到编辑文本并正确地执行类型文本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42827387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档