Как исправить ошибку «UnsupportedCommandException: действия» с помощью автоматизации Android - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь запустить команду для прокрутки экрана на эмуляторе.Я пробовал набор команд действия из класса 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));

Это должно прокрутить видимую страницу мобильного приложения в эмуляторе, но в настоящее время это вызывает следующую ошибку (org.openqa.selenium.UnsupportedCommandException: actions) при запуске с драйвером UiAutomator2.

Редактировать: после применения кода из комментария ниже, у меня есть следующий код, который работает с драйвером 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 голосов
/ 01 февраля 2019

Если вы хотите прокрутить приложение для 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();   
}
0 голосов
/ 01 февраля 2019

Вы можете использовать драйвер 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, поскольку он отлично работает для моего приложения.Вы можете использовать его в соответствии с вашим приложением.
Надеюсь, это поможет !!

...