如何使用Android自动化修复“ UnsupportedCommandException:操作”错误

时间:2019-01-31 22:26:01

标签: java android automation appium

我正在尝试运行命令以在模拟器上滚动屏幕。我尝试了Action类中的一组action命令,但是它们不一致。我最终偶然发现了下面的代码。

是否需要导入或包含某些内容才能使这些操作正常运行?我的另一个困惑是,此代码在使用Espresso驱动程序时有效,但在UiAutomator2驱动程序下运行时却产生此错误消息。我尝试导入Action类,但这不能解决问题。同样,在UiAutomator2驱动程序上是否需要导入或专门用于这些命令的东西?

此代码在使用Espresso驱动程序时有效,但在UiAutomator2驱动程序下运行时会产生此错误消息。我尝试导入Action类,但这不能解决问题。

WebElement element1 = wait.until(ExpectedConditions.visibilityOfElementLocated(originLocator));
WebElement element2 = wait.until(ExpectedConditions.visibilityOfElementLocated(destinationLocator));

int startY = element1.getLocation().getY() + (element1.getSize().getHeight() / 2);
int startX = element1.getLocation().getX() + (element1.getSize().getWidth() / 2);

int endX = element2.getLocation().getX() + (element2.getSize().getWidth() / 2);
int endY = element2.getLocation().getY() + (element2.getSize().getHeight() / 2);

PointerInput input = new PointerInput(PointerInput.Kind.TOUCH, "input");
Sequence swipeTo = new Sequence(input, 0);
swipeTo.addAction(input.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), startX, startY)); 
swipeTo.addAction(input.createPointerDown(PointerInput.MouseButton.LEFT.asArg()));
swipeTo.addAction(input.createPointerMove(Duration.ofMillis(1000), PointerInput.Origin.viewport(), endX, endY));
swipeTo.addAction(input.createPointerUp(PointerInput.MouseButton.LEFT.asArg()));
driver.perform(Arrays.asList(swipeTo));

这应该在模拟器上滚动移动应用程序的可见页面,但是当前在使用UiAutomator2驱动程序运行时会导致以下错误(org.openqa.selenium.UnsupportedCommandException: actions)。

编辑:应用下面注释中的代码后,我得到以下代码,该代码始终与UiAutomator2驱动程序兼容,但与Espresso驱动程序不兼容(它在屏幕上定位了错误的空间,似乎点击了一个元素而不是触摸按住)。

    WebElement element1 = wait.until(ExpectedConditions.visibilityOfElementLocated(originLocator));
    WebElement element2 = wait.until(ExpectedConditions.visibilityOfElementLocated(destinationLocator));

    int startY = element1.getLocation().getY() + (element1.getSize().getHeight() / 2);
    int startX = element1.getLocation().getX() + (element1.getSize().getWidth() / 2);

    int endX = element2.getLocation().getX() + (element2.getSize().getWidth() / 2);
    int endY = element2.getLocation().getY() + (element2.getSize().getHeight() / 2);

    Dimension dim=driver.manage().window().getSize();
    int height=(int) dim.getHeight();
    int width=(int) dim.getWidth();
    int x= width/2;
    new TouchAction(driver)
            .press(PointOption.point(x,startY))
            .waitAction(WaitOptions.waitOptions(Duration.ofMillis(2000)))
            .moveTo(PointOption.point(x,endY))
            .release()
            .perform();

所以我确实为每个驱动程序提供了一个工作版本。有谁知道为什么这些根据所使用的驱动程序而具有不同的行为?

2 个答案:

答案 0 :(得分:2)

如果要在android应用上滚动,可以使用触摸动作类。下面的代码将向下滚动。如果要向上滚动,请相应地更改startY和startX。希望能帮助到你。

public void scrollDown() {
    Dimension dim=new Dimension();
    int height=(int) dim.getHeight();
    int width=(int) dim.getWidth();
    int x= width/2;
    int startY=(int) (height*0.80);
    int endY=(int) (height*0.20);
    new TouchAction(driver).press(x, startY).waitAction(Duration.ofMillis(2000)).moveTo(x, endY).release().perform();   
}

答案 1 :(得分:1)

您可以使用AndroidDriver驱动程序,并且AppiumDriver类中提供了一种支持滑动的方法,因此您无需使用Action类即可滑动页面。
我已经制作了一种通用的参数化方法,可以根据滑动类型垂直向上和向下滑动。
代码如下:

public enum SwipeType {
    VerticallyUp, VerticallyDown
}

public void swipeVertically(int swipeValue, SwipeType Move) {
Double swipeHeight = 0.0;
swipeHeight = (double) swipeValue;
Dimension screenSize = driver.manage().window().getSize();
Double screenWidth = Double.valueOf(String.valueOf(screenSize.getWidth())) / 2;
Double screenHeight = Double.valueOf(String.valueOf(screenSize.getHeight())) / 2;

    if (screenHeight + swipeValue > screenHeight * 2 || swipeValue == 0) {
    swipeHeight = screenHeight / 2;
    }
    switch (Move) {
    case VerticallyUp:

    driver.swipe(screenWidth.intValue(), screenHeight.intValue() + swipeHeight.intValue(), screenWidth.intValue(), screenHeight.intValue(), 2000);
    break;

    case VerticallyDown:
    driver.swipe(screenWidth.intValue(), screenHeight.intValue(), screenWidth.intValue(), screenHeight.intValue() + swipeHeight.intValue(), 2000);
    break;
    }
}

我已将swipeValue用作300,因为它非常适合我的应用。您可以根据自己的应用使用它。
希望对您有帮助!