web-dev-qa-db-ja.com

新しいAppium-Java TouchActionsでのClassCastException

新しいTouchActionsクラスでエラーが発生しています。

  • 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);

ランタイムエラー:

Java.lang.ClassCastException:io.appium.Java_client.ios.IOSDriverをorg.openqa.Selenium.interactions.HasTouchScreenにキャストできません

一方、以下の古いものはすべて正常に機能します。

TouchAction touchAction = new TouchAction(appiumDriver);
9
user2451016

W3C Actions APIを使用してジェスチャーを実行します。

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));
}

他のジェスチャーの例はここにあります: https://github.com/saikrishna321/VodQaAdvancedAppium/blob/master/src/test/Java/com/appium/gesture/GestureTest.Java

ドキュメントは次の場所にあります https://appiumpro.com/editions/29

1
Appu Mistri

どうやら、これはまだappiumの問題です。現在、ネイティブAndroid=でそれを行う唯一の方法は、adbコマンドによるものです。

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

Javaでは、次のコードを使用してこれを実装できます:

    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;
    }

ただし、webviewを備えたアプリを使用している場合は、JavaScriptを使用してスクロールすることをお勧めします。下にスクロールするコードは次のとおりです。

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

または上にスクロールするには:

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

または、特定の要素までスクロールするには:

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

これを使用する前に、必ずwebviewコンテキストに切り替えてください。

2
Simon Baars

解決策は、Selenium TouchActionの代わりにAppium 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();
}

メソッド()を呼び出します。

tap(myMobileElement);
1
Zon

使用する io.appium.Java_client.TouchActionクラス。

ステップ1

TouchAction action = new TouchAction(driver);

ここでdriverAppiumDriverのインスタンスです。

ステップ2

WebElement ele = driver.findElement(By.id("locator"));

action.tap(new TapOptions().withElement(new ElementOption().withElement(ele))).perform();

TouchActionの新しい実装では、weblementを直接渡すことはできません。

使用される依存関係

<dependency>
        <groupId>io.appium</groupId>
        <artifactId>Java-client</artifactId>
        <version>7.0.0</version>
    </dependency>
1
Harsh Prasad