Android Espresso 执行 longClick 而不是点击
Android Espresso performs longClick instead of click
onData(anything()).inAdapterView(withId(R.id.ScheduleOrderListViewListView))
.atPosition(0).perform(click());
50% 的时间执行长触摸 - 有好的解决方法吗?
这是一个不幸的副作用,因为点击事件是如何通过 RPC 从您的测试代码传递到 Android 被测应用程序的。在 Espresso source code.
中可以找到有关为什么有时会执行长时间点击的最佳描述。
这个问题不太可能很快得到解决。避免此问题的最佳选择是 运行 在更高规格的设备上进行测试。这是因为发生问题的可能性取决于系统负载。
除了 Charles 所说的,我在这里找到了 3 个解决方法:https://github.com/misyobun/android-test-kit/issues/45
解决方法 1:(也许是最好的方法)是传递回滚操作,以防单击变成长按。如果发生这种情况,长按将是 "cancelled",espresso 将再次尝试点击。
/**
* Returns an action that performs a single click on the view.
*
* If the click takes longer than the 'long press' duration (which is possible) the provided
* rollback action is invoked on the view and a click is attempted again.
*
* This is only necessary if the view being clicked on has some different behaviour for long press
* versus a normal tap.
*
* For example - if a long press on a particular view element opens a popup menu -
* ViewActions.pressBack() may be an acceptable rollback action.
*
* <br>
* View constraints:
* <ul>
* <li>must be displayed on screen</li>
* <li>any constraints of the rollbackAction</li>
* <ul>
*/
public static ViewAction click(ViewAction rollbackAction) {
checkNotNull(rollbackAction);
return new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER, Press.FINGER,
rollbackAction);
}
解决方法 2:不是 "espresso way",但它可能适用于某些场景:
public class CallOnClickAction implements ViewAction {
@Override
public Matcher<View> getConstraints() {
return allOf(isClickable(), isDisplayed());
}
@Override
public String getDescription() {
return "CallOnClick";
}
@Override
public void perform(UiController uiController, View view) {
view.callOnClick();
}
}
解决方法 3:
如果您不使用双击该视图,在这种情况下它可能会有用。
我在启用动画时产生了这种效果。必须为浓缩咖啡禁用动画
另一个解决方法是 运行 在 API 级别 > 16
上执行以下命令
adb shell settings put secure long_press_timeout 1500
onData(anything()).inAdapterView(withId(R.id.ScheduleOrderListViewListView))
.atPosition(0).perform(click());
50% 的时间执行长触摸 - 有好的解决方法吗?
这是一个不幸的副作用,因为点击事件是如何通过 RPC 从您的测试代码传递到 Android 被测应用程序的。在 Espresso source code.
中可以找到有关为什么有时会执行长时间点击的最佳描述。这个问题不太可能很快得到解决。避免此问题的最佳选择是 运行 在更高规格的设备上进行测试。这是因为发生问题的可能性取决于系统负载。
除了 Charles 所说的,我在这里找到了 3 个解决方法:https://github.com/misyobun/android-test-kit/issues/45
解决方法 1:(也许是最好的方法)是传递回滚操作,以防单击变成长按。如果发生这种情况,长按将是 "cancelled",espresso 将再次尝试点击。
/**
* Returns an action that performs a single click on the view.
*
* If the click takes longer than the 'long press' duration (which is possible) the provided
* rollback action is invoked on the view and a click is attempted again.
*
* This is only necessary if the view being clicked on has some different behaviour for long press
* versus a normal tap.
*
* For example - if a long press on a particular view element opens a popup menu -
* ViewActions.pressBack() may be an acceptable rollback action.
*
* <br>
* View constraints:
* <ul>
* <li>must be displayed on screen</li>
* <li>any constraints of the rollbackAction</li>
* <ul>
*/
public static ViewAction click(ViewAction rollbackAction) {
checkNotNull(rollbackAction);
return new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER, Press.FINGER,
rollbackAction);
}
解决方法 2:不是 "espresso way",但它可能适用于某些场景:
public class CallOnClickAction implements ViewAction {
@Override
public Matcher<View> getConstraints() {
return allOf(isClickable(), isDisplayed());
}
@Override
public String getDescription() {
return "CallOnClick";
}
@Override
public void perform(UiController uiController, View view) {
view.callOnClick();
}
}
解决方法 3: 如果您不使用双击该视图,在这种情况下它可能会有用。
我在启用动画时产生了这种效果。必须为浓缩咖啡禁用动画
另一个解决方法是 运行 在 API 级别 > 16
上执行以下命令adb shell settings put secure long_press_timeout 1500