拖放WinAppDriver无效

时间:2019-03-19 16:53:28

标签: c# wpf drag-and-drop winappdriver

我尝试在WPF应用程序中自动化拖放行为的测试。一个自定义控件被拖到另一个控件上:

manual drag and drop

the usual WPF way中实现的拖放行为:

<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

我尝试了几种方法:

动作拖放

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

驱动程序鼠标操作(来自example

_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 :(得分:0)

找到了答案。

WinAppDriver不会移动鼠标,而是“传送”鼠标。这意味着鼠标光标不会一直以有限的速度一直拖动到目标,而是从开始位置跳到结束位置而没有任何中间位置。

在这种特殊情况下,它会引起问题。实际发生的情况:

  1. 光标移动到第一个元素的中心。 MouseMove和 其他鼠标移动事件在第一个元素上触发。 <?php $taxonomy = 'food_type'; $terms = get_terms( array( 'taxonomy' => $taxonomy, 'child_of' => 450, 'hide_empty' => false, ) ); foreach($terms as $term){ echo get_term_link( $term, $taxonomy); } ?> 方法未执行,因为鼠标左键 按钮未被按下。
  2. 按下鼠标左键。 MouseDown,Click和其他相关事件在第一个元素上触发。 DragDrop.DoDragDrop方法是 未执行,因为没有鼠标移动。
  3. 光标没有跳到第二个元素就跳到了第二个元素。 MouseMove和其他鼠标移动事件在第二秒触发 仅元素。由于没有在第一个元素上触发MouseMove事件 按下鼠标左键,拖放过程永远不会 开始。

解决方案很简单:将光标移动到第一个元素的边界内,然后再跳到第二个元素,或者更改事件的开始和拖放过程(例如,MouseDown而不是MouseMove)。我选择了后者:

DragDrop.DoDragDrop
<UserControl ...
             MouseDown="ToolboxModule_OnMouseDown">