浓缩咖啡 - 设置SeekBar

Lus*_*r_k 11 testing user-interface android seekbar android-espresso

有谁知道,如何将seekBar设置为特定值或只是在Espresso UI测试中单击该视图?

我只是得到一个例外:在带有id的视图上执行"单击"时出错...

onView(withId(R.id.FilterPriceMax)).perform(click());
Run Code Online (Sandbox Code Playgroud)

Lui*_*ano 23

您可能想尝试以下代码:

首先,您可以匹配SeekBar其类名:

onView(withClassName(Matchers.equalTo(SeekBar.class.getName()))).perform(setProgress(progress));
Run Code Online (Sandbox Code Playgroud)

其中setProgress(final int progress)是您定义为的ViewAction:

public static ViewAction setProgress(final int progress) {
        return new ViewAction() {
            @Override
            public void perform(UiController uiController, View view) {
                SeekBar seekBar = (SeekBar) view;
                seekBar.setProgress(progress);
            }
            @Override
            public String getDescription() {
                return "Set a progress on a SeekBar";
            }
            @Override
            public Matcher<View> getConstraints() {
                return ViewMatchers.isAssignableFrom(SeekBar.class);
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案.遗憾的是,这些答案被投了票. (3认同)
  • 问题之一是它没有设置标志`fromUser`,因此如果您使用该标志它将不起作用。 (2认同)

rsi*_*lli 19

我有一个自定义的Seekbar,我的视图中也有多个Seekbars.我使用以下代码管理我的测试:

onView(withId(R.id.my_seek_bar)).perform(setProgress(10));
Run Code Online (Sandbox Code Playgroud)

public static ViewAction setProgress(final int progress) {
        return new ViewAction() {
            @Override
            public void perform(UiController uiController, View view) {
                ((MyCustomSeekBar) view).setSelectedProgress(progress);
                //or ((SeekBar) view).setProgress(progress);
            }

            @Override
            public String getDescription() {
                return "Set a progress";
            }

            @Override
            public Matcher<View> getConstraints() {
                return ViewMatchers.isAssignableFrom(RangeSeekBar.class);
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

  • 提到的 RangeSeekbar.class 是什么?你能回忆一下吗.. (2认同)

Mar*_*ues 9

如果您想检查进度值

  public static Matcher<View> withProgress(final int expectedProgress) {
    return new BoundedMatcher<View, SeekBar>(SeekBar.class) {
      @Override
      public void describeTo(Description description) {
        description.appendText("expected: ");
        description.appendText(""+expectedProgress);
      }

      @Override
      public boolean matchesSafely(SeekBar seekBar) {
        return seekBar.getProgress() == expectedProgress;
      }
    };
  }
Run Code Online (Sandbox Code Playgroud)


小智 7

我使用滑动操作来执行实际滑动SeekBar.这样可以确保调用callback方法(SeekBar.OnSeekBarChangeListener. onProgressChanged)并将其fromUser设置为true.它也更符合点击测试.

public static ViewAction scrubSeekBarAction(int progress) {
    return actionWithAssertions(new GeneralSwipeAction(
            Swipe.SLOW,
            new SeekBarThumbCoordinatesProvider(0),
            new SeekBarThumbCoordinatesProvider(progress),
            Press.PINPOINT));
}

private static class SeekBarThumbCoordinatesProvider implements CoordinatesProvider {
    int mProgress;

    public SeekBarThumbCoordinatesProvider(int progress) {
        mProgress = progress;
    }

    private static float[] getVisibleLeftTop(View view) {
        final int[] xy = new int[2];
        view.getLocationOnScreen(xy);
        return new float[]{ (float) xy[0], (float) xy[1] };
    }

    @Override
    public float[] calculateCoordinates(View view) {
        if (!(view instanceof SeekBar)) {
            throw new PerformException.Builder()
                    .withViewDescription(HumanReadables.describe(view))
                    .withCause(new RuntimeException(String.format("SeekBar expected"))).build();
        }
        SeekBar seekBar = (SeekBar) view;
        int width = seekBar.getWidth() - seekBar.getPaddingLeft() - seekBar.getPaddingRight();
        double progress = mProgress == 0 ? seekBar.getProgress() : mProgress;
        int xPosition = (int) (seekBar.getPaddingLeft() + width * progress / seekBar.getMax());
        float[] xy = getVisibleLeftTop(seekBar);
        return new float[]{ xy[0] + xPosition, xy[1] + 10 };
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您不需要特定值,我已经使用它对搜索栏 UI 组件进行了一些基本测试。它假定“check()”是基于 0-100 的百分比。

onView(withId(R.id.yourSeekBar)).perform(new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER_LEFT, Press.FINGER));
onView(withId(R.id.yourSeekBarUserFeedback)).check(matches(withText("0")));

onView(withId(R.id.yourSeekBar)).perform(new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER, Press.FINGER));
onView(withId(R.id.yourSeekBarUserFeedback)).check(matches(withText("50")));

onView(withId(R.id.yourSeekBar)).perform(new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER_RIGHT, Press.FINGER));
onView(withId(R.id.yourSeekBarUserFeedback)).check(matches(withText("100")));
Run Code Online (Sandbox Code Playgroud)

  • 采用 3 个参数的 `GeneralClickAction()` 被声明为已弃用。现在建议我们使用带有 5 个参数的 `GeneralClickAction()`,如下所示:/sf/ask/1552431331/#48446640 (2认同)