Перетаскивание в WinAppDriver не работает - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь автоматизировать тесты поведения перетаскивания в приложении WPF.Один пользовательский элемент управления перетаскивается на другой:

manual drag and drop

Режим перетаскивания, реализованный в обычным способом WPF :

<UserControl ...
             MouseMove="ToolboxModule_OnMouseMove">
private void ToolboxModule_OnMouseMove(object sender, MouseEventArgs e)
{
    base.OnMouseMove(e);

    var data = new DataObject();
    data.SetData("ModuleDescription", DataContext);

    if (e.LeftButton == MouseButtonState.Pressed)
        DragDrop.DoDragDrop(this, data, DragDropEffects.Copy);
}
<UserControl ...
             Drop="WorkspaceView_OnDrop" AllowDrop="True">
private void WorkspaceView_OnDrop(object sender, DragEventArgs e)
{
    var dropped = e.Data.GetData("ModuleDescription");
    var viewModel = (WorkspaceViewModel)DataContext;
    if (viewModel.ChainVm.AddModuleCommand.CanExecute(dropped))
        viewModel.ChainVm.AddModuleCommand.Execute(dropped);
}

Но когда я пытаюсь автоматизировать это с WinAppDriver, перетаскивание не работает.Форма курсора не изменяется и ничего не происходит.

WinAppDriver drag and drop

Я пробовал несколько подходов:

Действия Drag and Drop

var moduleControl = mainWindow.GetToolboxModuleControl(moduleName);
var actions = new Actions(_session);
actions.DragAndDrop(moduleControl, mainWindow.WorkspaceControl).Perform();

Действия нажмите и удерживайте

var moduleControl = mainWindow.GetToolboxModuleControl(moduleName);
var actions = new Actions(_session);
actions.ClickAndHold(moduleControl).MoveByOffset(200, 0).Release().Perform();

Операции с мышью-драйвером (из пример )

_session.Mouse.MouseMove(moduleControl.Coordinates, 50, 50);
_session.Mouse.MouseDown(null);
_session.Mouse.MouseMove(mainWindow.WorkspaceControl.Coordinates, 100, 100);
_session.Mouse.MouseUp(null);

Операции с мышью-драйвером с задержками

_session.Mouse.MouseMove(moduleControl.Coordinates, 50, 50);
Thread.Sleep(1000);
_session.Mouse.MouseDown(null);
Thread.Sleep(1000);
_session.Mouse.MouseMove(mainWindow.WorkspaceControl.Coordinates, 100, 100);
Thread.Sleep(1000);
_session.Mouse.MouseUp(null);

Ничего не работает.Есть идеи, что может быть не так и как это исправить?

Когда я пытаюсь переместить окно приложения, перетаскивая его строку заголовка через WinAppDriver, оно успешно перемещает окно.Таким образом, операции перетаскивания технически работают, но не в случае перетаскивания элемента управления в окне.

1 Ответ

0 голосов
/ 21 марта 2019

Нашел ответ.

WinAppDriver не перемещает мышь, но "телепортирует" ее. Это означает, что курсор мыши не перетаскивается до цели с конечной скоростью, он перемещается из начальной в конечную позицию без каких-либо промежуточных позиций.

В данном конкретном случае это вызывает проблему. Что на самом деле происходит:

  1. Курсор телепортируется в центр первого элемента. MouseMove и другие события движения мыши запускаются на первом элементе. DragDrop.DoDragDrop метод не выполняется, потому что левая мышь кнопка не нажата.
  2. Левая кнопка мыши нажата. MouseDown, Click и другие связанные события запускаются на первом элементе. DragDrop.DoDragDrop метод не выполняется, потому что нет движения мыши.
  3. Курсор перепрыгнул на второй элемент, не касаясь первого. MouseMove и другие события движения мыши запускаются на секунду только элемент. Поскольку событие MouseMove не запускается на первом элементе при нажатой левой кнопке мыши процесс перетаскивания никогда не выполняется начинается.

Решения просты: переместите курсор в пределах границ первого элемента перед переходом ко второму или измените событие, где начинается процесс перетаскивания (например, MouseDown вместо MouseMove). Я выбрал последнее:

<UserControl ...
             MouseDown="ToolboxModule_OnMouseDown">
private void ToolboxModule_OnMouseDown(object sender, MouseButtonEventArgs e)
{
    base.OnMouseDown(e);

    var data = new DataObject();
    data.SetData("ModuleDescription", DataContext);
    DragDrop.DoDragDrop(this, data, DragDropEffects.Copy);
}
...