WinAppDriver中的拖放不起作用

Posted

技术标签:

【中文标题】WinAppDriver中的拖放不起作用【英文标题】:Drag and drop in WinAppDriver doesn't work 【发布时间】:2019-08-10 06:58:33 【问题描述】:

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

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 自动执行此操作时,拖放不起作用。光标形状没有改变,也没有任何反应。

我尝试了几种方法:

操作拖放

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】:

找到了答案。

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

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

    光标传送到第一个元素的中心。鼠标移动和 其他鼠标移动事件在第一个元素上触发。 DragDrop.DoDragDrop 方法没有被执行,因为鼠标左键 按钮未按下。 按下鼠标左键。 MouseDown、Click 和其他相关事件在第一个元素上触发。 DragDrop.DoDragDrop 方法是 未执行,因为没有鼠标移动。 光标跳到第二个元素而不触及第一个元素。 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);

【讨论】:

以上是关于WinAppDriver中的拖放不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MailChimp 内容块拖放不起作用

Javascript - 在 Internet Explorer 和 Edge 中拖放不起作用

Selenium Webdriver - 拖放不起作用

fullCalendar 中的拖放事件不起作用

WPF中的拖放文件不起作用

jQuery拖放不起作用