Dragg and Drop on Winapp driver and Appium

Scenario

The basic scenario here is having a windows desktop application with the drag and drop capability.
Testing this application, you are using Appium over Winappdriver.
The test I am attending to perform is a simple drag and drop.

The above setting and scenario, isn't rare! actually it is a common case in desktop apps, that it is why it is so troubling to find that drag and drop is an issue.

Searching the web, I found many ways of accomplishing the D&D, which basically I can split to two groups, the first one is using the driver.Mouse actions, where I will use a mouseDown, mouseMove and MouseUp, the second method will use the Actions object and will consist of actions.dragAndDrop() (Yes, there is such a function), or will do it the long way of Actions.ClickAndHold().MoveTo().Release().

But it seems that in some cases, both approaches just don't work.
Let me be clear, this is a HUGE bug!
There is a workaround, but it is a huge bug (especially when having a non working actions.dragAndDrop()).

Outline

I will write here 7 options to write drag and drop, which will be split to the above 2 methods, then i will give a link to the problem as it is outlined by a frustrated stackoverflow user, and will finish with the working workaround.

First way - Using the session.Mouse

        public void dragAndDropMouse1(WindowsElement source, WindowsElement destination) {
            session.Mouse.MouseMove(source.Coordinates);
            session.Mouse.MouseDown(null);
            session.Mouse.MouseMove(destination.Coordinates);
            session.Mouse.MouseUp(null);
        }

        public void dragAndDropMouse2(WindowsElement source, WindowsElement destination) {
            session.Mouse.MouseDown(source.Coordinates);
            session.Mouse.MouseUp(destination.Coordinates);
        }

        public void dragAndDropMouse3(WindowsElement source, WindowsElement destination) {
            session.Mouse.MouseMove(source.Coordinates, 2, 2);
            session.Mouse.MouseDown(null);
            session.Mouse.MouseMove(destination.Coordinates, 2, 2);
            session.Mouse.MouseUp(null);
        }

Second way - Using the Actions

        public void dragAndDropAction1(WindowsElement source, WindowsElement destination) {
            actions.DragAndDrop(source, destination).Build().Perform();
        }

        public void dragAndDropAction2(WindowsElement source, WindowsElement destination) {
            new Actions(session).DragAndDrop(source, destination).Build().Perform();
        }

        public void dragAndDropAction3(WindowsElement source, WindowsElement destination) {
            new Actions(session).ClickAndHold(source).MoveToElement(destination).Release().Perform();
        }

        public void dragAndDropAction4(WindowsElement source, WindowsElement destination) {
            actions.MoveToElement(source).Perform();
            actions.ClickAndHold().Perform();
            actions.MoveToElement(destination).Perform();
            actions.Release().Perform();
        }

The actual problem can be found here in this stackoverflow thread

The Solution

    public void dragAndDropWorkaround(WindowsElement source, WindowsElement destination) {
            new Actions(session)
                .ClickAndHold(source)
                .MoveByOffset(1, 1)
                .MoveToElement(destination)
                .Release().Perform();
     }

The solution uses a slight move of the mouse cursor before completing the drop, this is a huge bug in Appium's code somewhere, and for now this workaround works

Comments

Popular posts from this blog

What does: "Fault occurred while processing" in the client mean? and how do you reveal the real exception?

Eclipse Window Builder VS Netbeans GUI Builder (Matisse)

WARNING: Can't find the the request for http://127.0.0.1:8080/... 's Observer