我尝试在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拖动其标题栏来移动应用程序窗口时,它将成功移动该窗口。因此,拖动操作在技术上是可行的,但在窗口内拖动控件的情况下不会起作用。
答案 0 :(得分:0)
找到了答案。
WinAppDriver不会移动鼠标,而是“传送”鼠标。这意味着鼠标光标不会一直以有限的速度一直拖动到目标,而是从开始位置跳到结束位置而没有任何中间位置。
在这种特殊情况下,它会引起问题。实际发生的情况:
<?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);
}
?>
方法未执行,因为鼠标左键
按钮未被按下。DragDrop.DoDragDrop
方法是
未执行,因为没有鼠标移动。解决方案很简单:将光标移动到第一个元素的边界内,然后再跳到第二个元素,或者更改事件的开始和拖放过程(例如,MouseDown而不是MouseMove)。我选择了后者:
DragDrop.DoDragDrop
<UserControl ...
MouseDown="ToolboxModule_OnMouseDown">