web-dev-qa-db-fra.com

ClassCastException avec le nouvel Appium-Java TouchActions

Je reçois une erreur en dessous de la nouvelle classe TouchActions.

  • Version du JDK: 1.8
  • Appium: 1.7.2
  • appium.Java-client.version: 6.0.0-BETA2
  • Selenium.Java.version: 3.8.1

TouchActions actions = new TouchActions(appiumDriver);

Erreur d'exécution: 

Exception Java.lang.ClassCast: io.appium.Java_client.ios.IOSDriver ne peut pas être converti en org.openqa.Selenium.interactions.HasTouchScreen.

Considérant que, ancien ci-dessous fonctionne tout va bien:

TouchAction touchAction = new TouchAction(appiumDriver);
6
user2451016

La solution consiste à utiliser Appium TouchAction au lieu de Selenium TouchActions.

import io.appium.Java_client.TouchAction;

public AndroidDriver<MobileElement> driver = new TouchAction(driver);

public void tap(MobileElement element) {

  getTouchAction()
    .tap(
      new TapOptions().withElement(
        ElementOption.element(
          element)))
    .perform();
}

Appelez la méthode ():

tap(myMobileElement);
1
Zon

C'est apparemment toujours un problème en soi. À l'heure actuelle, la seule façon de le faire dans Android natif est d'utiliser une commande adb:

adb Shell input touchscreen swipe <x> <y> <x> <y> <durationMs>

En Java, vous pouvez implémenter cela en utilisant le code suivant:

    public static String swipe(int startx, int starty, int endx, int endy, int duration) {
        return executeAsString("adb Shell input touchscreen swipe "+startx+" "+starty+" "+endx+" "+endy+" "+duration);
    }

    private static String executeAsString(String command) {
        try {
            Process pr = execute(command);
            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = input.readLine()) != null) {
                if (!line.isEmpty()) {
                    sb.append(line);
                }
            }
            input.close();
            pr.destroy();
            return sb.toString();
        } catch (Exception e) {
            throw new RuntimeException("Execution error while executing command" + command, e);
        }
    }    

    private static Process execute(String command) throws IOException, InterruptedException {
        List<String> commandP = new ArrayList<>();
        String[] com = command.split(" ");
        for (int i = 0; i < com.length; i++) {
            commandP.add(com[i]);
        }
        ProcessBuilder prb = new ProcessBuilder(commandP);
        Process pr = prb.start();
        pr.waitFor(10, TimeUnit.SECONDS);
        return pr;
    }

Toutefois, si vous utilisez une application avec une vue Web, vous pouvez utiliser JavaScript pour faire défiler. Le code à faire défiler est:

((JavascriptExecutor)driver).executeScript("window.scrollBy(0,500)", "");

Ou faire défiler vers le haut:

((JavascriptExecutor)driver).executeScript("window.scrollBy(0,-500)", "");

Ou pour faire défiler jusqu'à un certain élément:

((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);

Assurez-vous de passer au contexte WebView avant de l'utiliser.

2
Simon Baars

Utilisez l'API Actions du W3C pour effectuer des gestes.

public void horizontalSwipingTest() throws Exception {
    login();
    driver.findElementByAccessibilityId("slider1").click();
    wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("slider")));
    MobileElement slider = driver.findElementByAccessibilityId("slider");

    Point source = slider.getLocation();

    PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger");
    Sequence dragNDrop = new Sequence(finger, 1);
    dragNDrop.addAction(finger.createPointerMove(Duration.ofMillis(0),
            PointerInput.Origin.viewport(), source.x, source.y));
    dragNDrop.addAction(finger.createPointerDown(PointerInput.MouseButton.MIDDLE.asArg()));
    dragNDrop.addAction(new Pause(finger, Duration.ofMillis(600)));
    dragNDrop.addAction(finger.createPointerMove(Duration.ofMillis(600),
            PointerInput.Origin.viewport(),
            source.x + 400, source.y));
    dragNDrop.addAction(finger.createPointerUp(PointerInput.MouseButton.MIDDLE.asArg()));
    driver.perform(Arrays.asList(dragNDrop));
}


public void verticalSwipeTest() throws InterruptedException {
    login();
    wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("verticalSwipe")));
    driver.findElementByAccessibilityId("verticalSwipe").click();
    wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.AccessibilityId("listview")));
    verticalSwipe("listview");
}

private void verticalSwipe(String locator) throws InterruptedException {
    Thread.sleep(3000);
    MobileElement slider = driver.findElementByAccessibilityId(locator);
    Point source = slider.getCenter();
    PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger");
    Sequence dragNDrop = new Sequence(finger, 1);
    dragNDrop.addAction(finger.createPointerMove(Duration.ofMillis(0),
            PointerInput.Origin.viewport(),
            source.x / 2, source.y + 400));
    dragNDrop.addAction(finger.createPointerDown(PointerInput.MouseButton.MIDDLE.asArg()));
    dragNDrop.addAction(finger.createPointerMove(Duration.ofMillis(600),
            PointerInput.Origin.viewport(), source.getX() / 2, source.y / 2));
    dragNDrop.addAction(finger.createPointerUp(PointerInput.MouseButton.MIDDLE.asArg()));
    driver.perform(Arrays.asList(dragNDrop));
}

Des exemples d'autres gestes peuvent être trouvés ici: https://github.com/saikrishna321/VodQaAdvancedAppium/blob/master/src/test/Java/com/appium/gesture/GestureTest.Java

La documentation est disponible sur: https://appiumpro.com/editions/29

0
Appu Mistri