Android 安卓浓缩咖啡:按下按钮时做出断言
我对安卓上的浓缩咖啡很陌生,我遇到了以下问题: 我想让Espresso在按钮上执行长点击(或其他…),当按钮一直按下时,我想检查不同视图的状态 在(或多或少)伪代码中:Android 安卓浓缩咖啡:按下按钮时做出断言,android,automated-tests,ui-automation,android-espresso,Android,Automated Tests,Ui Automation,Android Espresso,我对安卓上的浓缩咖啡很陌生,我遇到了以下问题: 我想让Espresso在按钮上执行长点击(或其他…),当按钮一直按下时,我想检查不同视图的状态 在(或多或少)伪代码中: onView(withId(button_id)).perform(pressButtonDown()); onView(withId(textBox_id)).check(matches(withText("Button is pressed"))); onView(withId(button_id)).perform(rel
onView(withId(button_id)).perform(pressButtonDown());
onView(withId(textBox_id)).check(matches(withText("Button is pressed")));
onView(withId(button_id)).perform(releaseButton());
我试着用MotionEvents.sendDown()和.sendUp()编写两个自定义点击,按下并释放,但没有成功。
如果这是正确的路径,我可以发布到目前为止的代码
编辑:
public class PressViewActions
{
public static ViewAction pressDown(){
return new GeneralClickAction(HoldTap.DOWN, GeneralLocation.CENTER, Press.THUMB);
}
public static ViewAction release() {
return new GeneralClickAction(HoldTap.UP, GeneralLocation.CENTER, Press.THUMB);
}
}
以及挺杆的代码:
public enum HoldTap implements Tapper {
DOWN {
@Override
public Tapper.Status sendTap(UiController uiController, float[] coordinates, float[] precision)
{
checkNotNull(uiController);
checkNotNull(coordinates);
checkNotNull(precision);
DownResultHolder res = MotionEvents.sendDown(uiController, coordinates, precision);
ResultHolder.setController(uiController);
ResultHolder.setResult(res);
return Status.SUCCESS;
}
},
UP{
@Override
public Tapper.Status sendTap(UiController uiController, float[] coordinates, float[] precision)
{
DownResultHolder res = ResultHolder.getResult();
UiController controller = ResultHolder.getController();
try {
if(!MotionEvents.sendUp(controller, res.down))
{
MotionEvents.sendCancel(controller, res.down);
return Status.FAILURE;
}
}
finally {
//res.down.recycle();
}
return Status.SUCCESS;
}
}
}
我得到的错误如下:
android.support.test.espresso.PerformException: Error performing 'up click' on view 'with id: de.test.app:id/key_ptt'.
...
...
Caused by: java.lang.RuntimeException: Couldn't click at: 281.5,1117.5 precision: 25.0, 25.0 . Tapper: UP coordinate provider: CENTER precision describer: THUMB. Tried 3 times. With Rollback? false
我希望,这会有帮助
任何帮助和想法都将不胜感激
坦克提前了很多 Android中的点击由两个事件组成,一个向下事件和一个向上/取消事件。如果你想把这两个分开,你就不能“轻敲”,因为它们已经包含了这两个部分 也就是说,您的想法是可行的,您只需要使用较低级别的api,即
UiController
以及MotionEvents
中的助手方法。但要注意:由于“释放”视图需要先保持它,如果不进行适当的清理,测试将相互依赖
示例:在一个测试中,您按下一个视图,您的测试失败,然后在另一个测试中,您在未单击的视图上发布:您的第二个测试将通过,而它本不应该通过
我上传了一个完整的样本。这里是关键点。首先是测试代码:
@Before
public void setUp() throws Exception {
super.setUp();
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
getActivity();
}
@After
public void tearDown() throws Exception {
super.tearDown();
LowLevelActions.tearDown();
}
@Test
public void testAssertWhilePressed() {
onView(withId(R.id.button)).perform(pressAndHold());
onView(withId(R.id.text)).check(matches(withText("Button is held down")));
onView(withId(R.id.button)).perform(release());
}
然后,采取以下行动:
public class LowLevelActions {
static MotionEvent sMotionEventDownHeldView = null;
public static PressAndHoldAction pressAndHold() {
return new PressAndHoldAction();
}
public static ReleaseAction release() {
return new ReleaseAction();
}
public static void tearDown() {
sMotionEventDownHeldView = null;
}
static class PressAndHoldAction implements ViewAction {
@Override
public Matcher<View> getConstraints() {
return isDisplayingAtLeast(90); // Like GeneralClickAction
}
@Override
public String getDescription() {
return "Press and hold action";
}
@Override
public void perform(final UiController uiController, final View view) {
if (sMotionEventDownHeldView != null) {
throw new AssertionError("Only one view can be held at a time");
}
float[] precision = Press.FINGER.describePrecision();
float[] coords = GeneralLocation.CENTER.calculateCoordinates(view);
sMotionEventDownHeldView = MotionEvents.sendDown(uiController, coords, precision).down;
// TODO: save view information and make sure release() is on same view
}
}
static class ReleaseAction implements ViewAction {
@Override
public Matcher<View> getConstraints() {
return isDisplayingAtLeast(90); // Like GeneralClickAction
}
@Override
public String getDescription() {
return "Release action";
}
@Override
public void perform(final UiController uiController, final View view) {
if (sMotionEventDownHeldView == null) {
throw new AssertionError("Before calling release(), you must call pressAndHold() on a view");
}
float[] coords = GeneralLocation.CENTER.calculateCoordinates(view);
MotionEvents.sendUp(uiController, sMotionEventDownHeldView, coords);
}
}
}
公共类低级操作{
静态运动事件sMotionEventDownHeldView=null;
公共静态按住操作按住()键{
返回新的按住操作();
}
公共静态发布Action发布(){
返回新的ReleaseAction();
}
公共静态void拆卸(){
sMotionEventDownHeldView=null;
}
静态类PressAndHoldAction实现ViewAction{
@凌驾
公共匹配器getConstraints(){
return isdisplayingatelast(90);//类似于GeneralClickAction
}
@凌驾
公共字符串getDescription(){
返回“按住操作”;
}
@凌驾
公共作废执行(最终UiController UiController,最终视图){
if(sMotionEventDownHeldView!=null){
抛出新的断言错误(“一次只能持有一个视图”);
}
float[]精度=Press.FINGER.describePrecision();
float[]坐标=GeneralLocation.CENTER.calculate坐标(视图);
sMotionEventDownHeldView=MotionEvents.sendDown(uiController、coords、precision).down;
//TODO:保存视图信息并确保release()位于同一视图上
}
}
静态类ReleaseAction实现ViewAction{
@凌驾
公共匹配器getConstraints(){
return isdisplayingatelast(90);//类似于GeneralClickAction
}
@凌驾
公共字符串getDescription(){
返回“释放动作”;
}
@凌驾
公共作废执行(最终UiController UiController,最终视图){
if(sMotionEventDownHeldView==null){
抛出新断言错误(“在调用release()之前,必须对视图调用pressAndHold());
}
float[]坐标=GeneralLocation.CENTER.calculate坐标(视图);
MotionEvents.sendUp(uiController、sMotionEventDownHeldView、coords);
}
}
}
我认为总体思路应该行得通,请发布定制磁带的代码。非常感谢!没有时间真正测试它,但它看起来很有希望!至少,它不会给出任何错误;)谢谢你的回答。它工作得很好!不过,有一件事我必须补充。在ReleaseAction类的perform方法中,我必须在方法的底部添加“sMotionEventDownHeldView=null;”。我唯一能想到的改进方法是将低级操作重命名为Finger