在 WinAppDriver 中拖放不起作用
Drag and drop in WinAppDriver doesn't work
我尝试自动测试 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();
Driver鼠标操作(来自example)
_session.Mouse.MouseMove(moduleControl.Coordinates, 50, 50);
_session.Mouse.MouseDown(null);
_session.Mouse.MouseMove(mainWindow.WorkspaceControl.Coordinates, 100, 100);
_session.Mouse.MouseUp(null);
Driver 鼠标操作有延迟
_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);
没有任何效果。任何想法可能是错误的以及如何解决它?
当我尝试通过 WinApp Driver 拖动它的标题栏来移动应用 window 时,它成功地移动了 window。所以拖动操作在技术上是有效的,但在 window.
内拖动控件的情况下就不行了
找到答案了。
WinAppDriver 不移动鼠标,但 "teleport" 它。这意味着鼠标光标不会以有限的速度一直拖动到目标,而是从开始位置跳到结束位置,没有任何中间位置。
在这种特殊情况下,它会导致问题。实际发生了什么:
- 光标传送到第一个元素的中心。鼠标移动和
其他鼠标移动事件在第一个元素上触发。
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);
}
我尝试自动测试 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();
Driver鼠标操作(来自example)
_session.Mouse.MouseMove(moduleControl.Coordinates, 50, 50);
_session.Mouse.MouseDown(null);
_session.Mouse.MouseMove(mainWindow.WorkspaceControl.Coordinates, 100, 100);
_session.Mouse.MouseUp(null);
Driver 鼠标操作有延迟
_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);
没有任何效果。任何想法可能是错误的以及如何解决它?
当我尝试通过 WinApp Driver 拖动它的标题栏来移动应用 window 时,它成功地移动了 window。所以拖动操作在技术上是有效的,但在 window.
内拖动控件的情况下就不行了找到答案了。
WinAppDriver 不移动鼠标,但 "teleport" 它。这意味着鼠标光标不会以有限的速度一直拖动到目标,而是从开始位置跳到结束位置,没有任何中间位置。
在这种特殊情况下,它会导致问题。实际发生了什么:
- 光标传送到第一个元素的中心。鼠标移动和
其他鼠标移动事件在第一个元素上触发。
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);
}