新しいTouchActionsクラスでエラーが発生しています。
TouchActions actions = new TouchActions(appiumDriver);
ランタイムエラー:
Java.lang.ClassCastException:io.appium.Java_client.ios.IOSDriverをorg.openqa.Selenium.interactions.HasTouchScreenにキャストできません
一方、以下の古いものはすべて正常に機能します。
TouchAction touchAction = new TouchAction(appiumDriver);
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
どうやら、これはまだ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コンテキストに切り替えてください。
解決策は、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);
使用する io.appium.Java_client.TouchAction
クラス。
ステップ1
TouchAction action = new TouchAction(driver);
ここでdriver
はAppiumDriver
のインスタンスです。
ステップ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>