Friday, April 10, 2026

Appium Automating Mobile Gestures

Android gesture: There is a couple of basic gestures, like swipe, fling or pinch, which are commonly used in Android applications 

public void swipeUp() {
        Dimension size = driver.manage().window().getSize();
        int startX = size.getWidth() / 2;
        int startY = (int) (size.getHeight() * 0.8);
        int endY = (int) (size.getHeight() * 0.2);
        performSwipe(startX, startY, startX, endY);
    }

    public void swipeDown() {
        Dimension size = driver.manage().window().getSize();
        int startX = size.getWidth() / 2;
        int startY = (int) (size.getHeight() * 0.2);
        int endY = (int) (size.getHeight() * 0.8);
        performSwipe(startX, startY, startX, endY);
    }

    public void swipeLeft() {
        Dimension size = driver.manage().window().getSize();
        int startX = (int) (size.getWidth() * 0.8);
        int endX = (int) (size.getWidth() * 0.2);
        int y = size.getHeight() / 2;
        performSwipe(startX, y, endX, y);
    }

    public void swipeRight() {
        Dimension size = driver.manage().window().getSize();
        int startX = (int) (size.getWidth() * 0.2);
        int endX = (int) (size.getWidth() * 0.8);
        int y = size.getHeight() / 2;
        performSwipe(startX, y, endX, y);
    }

    public void longPress(WebElement element) {
        Point center = getCenter(element);
        PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger");
        Sequence longPressSeq = new Sequence(finger, 0);
        longPressSeq.addAction(finger.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), center.getX(), center.getY()));
        longPressSeq.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg()));
        longPressSeq.addAction(new Pause(finger, Duration.ofSeconds(2)));
        longPressSeq.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg()));
        driver.perform(Collections.singletonList(longPressSeq));
    }

    public void doubleTap(WebElement element) {
        Point center = getCenter(element);
        PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger");
        Sequence doubleTapSeq = new Sequence(finger, 0);
        doubleTapSeq.addAction(finger.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), center.getX(), center.getY()));
        doubleTapSeq.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg()));
        doubleTapSeq.addAction(new Pause(finger, Duration.ofMillis(50)));
        doubleTapSeq.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg()));
        doubleTapSeq.addAction(new Pause(finger, Duration.ofMillis(100)));
        doubleTapSeq.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg()));
        doubleTapSeq.addAction(new Pause(finger, Duration.ofMillis(50)));
        doubleTapSeq.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg()));
        driver.perform(Collections.singletonList(doubleTapSeq));
    }

    private void performSwipe(int startX, int startY, int endX, int endY) {
        PointerInput finger = new PointerInput(PointerInput.Kind.TOUCH, "finger");
        Sequence swipe = new Sequence(finger, 0);
        swipe.addAction(finger.createPointerMove(Duration.ZERO, PointerInput.Origin.viewport(), startX, startY));
        swipe.addAction(finger.createPointerDown(PointerInput.MouseButton.LEFT.asArg()));
        swipe.addAction(finger.createPointerMove(Duration.ofMillis(600), PointerInput.Origin.viewport(), endX, endY));
        swipe.addAction(finger.createPointerUp(PointerInput.MouseButton.LEFT.asArg()));
        driver.perform(Collections.singletonList(swipe));
    }

    private Point getCenter(WebElement element) {
        Point loc = element.getLocation();
        Dimension size = element.getSize();
        return new Point(loc.getX() + size.getWidth() / 2, loc.getY() + size.getHeight() / 2);
    } 

How to capture browser network logs

Create a Chrome devtool object 

protected static DevTools devTools;

 

Call below function in the setup method.

/**
     * To capture browser network logs
     */
    public void getBrowserNetworkLogs() {
        if (getBrowserName().equalsIgnoreCase("CHROME")) {

            // Create a session with DevTools
            devTools = ((ChromeDriver) driver).getDevTools();
            devTools.createSession();
            devTools.send(Network.clearBrowserCache());
            devTools.send(Network.setCacheDisabled(true));

            // Enable network tracking
            devTools.send(Network.enable(java.util.Optional.empty(), java.util.Optional.empty(),
                    java.util.Optional.empty(), java.util.Optional.empty(), java.util.Optional.empty()));
            // final RequestId[] requestIds = new RequestId[1];

            // Capturing request information of a network call
            /*
             * devTools.addListener(Network.requestWillBeSent(), request -> {
             * APP_LOGS.error("Request: " + request.getRequest().getUrl()); });
             */

            // Capturing response information of a network call
            devTools.addListener(Network.responseReceived(), response -> {
                RequestId requestId = response.getRequestId();

                if (response.getResponse().getStatus() != 200) {
                    String responseUrl = response.getResponse().getUrl();
                    if (responseUrl.contains("chubb") && !responseUrl.contains("favicon.ico")
                            && !responseUrl.contains("chubb-publico")) {
                        int responsStatus = response.getResponse().getStatus();
                        // String responseType = response.getType().toJson();
                        String statusText = response.getResponse().getStatusText();
                        String responseHeaders = response.getResponse().getRequestHeaders() != null
                                ? response.getResponse().getRequestHeaders().toString()
                                : "N/A";
                        String responseBody = devTools.send(Network.getResponseBody(requestId)).getBody();
                        String requestPostData = devTools.send(Network.getRequestPostData(requestId)).toString();

                        APP_LOGS.error("Response Url: " + responseUrl);
                        APP_LOGS.error("Response Status Code: " + responsStatus);
                        APP_LOGS.error("Response Text: " + statusText);
                        APP_LOGS.error("Response Headers: " + responseHeaders);
                        APP_LOGS.error("Response Body: " + responseBody);
                        APP_LOGS.error("Request Post Data: " + requestPostData);
                    }
                }
            });

        } else {
            APP_LOGS.info("Browser network log not captured for: " + getBrowserName());
        }
    }
 

 Close the dvetools connection in the tearDown methid.


        if (devTools != null) {
            devTools.send(Network.disable());
        }