编码 UI:如何重试右键单击上下文菜单以检查已启用的选项

Coded UI: How to retry right clicking on a context menu to check for an enabled option

我正在尝试在我的一个编码 UI 测试中自动执行一个过程,我在其中右键单击 table 中的一个单元格,如果 'Paste' 按钮已启用,我想到select吧。

然而,此按钮仅在需要 'Paste' 时才可用,但情况并非总是如此。所以我想右键单击并检查是否启用了 'Paste' 。如果没有,请等待 10 秒,然后重试,最多可以重复 10 次,然后失败。到目前为止,我想出的最好的方法是右键单击单元格,如果未启用“粘贴”按钮,请等待 10 秒,然后重试..

Mouse.Click(Cell1, MouseButtons.Right, ModifierKeys.None, new Point(125, 10));
while (!PasteButton.Enabled)
    {
    System.Threading.Thread.Sleep(10000);
    Mouse.Click(Cell1, MouseButtons.Right, ModifierKeys.None, new Point(125, 10));
    if (PasteButton.Enabled)
    {
        Mouse.Click(Cell1, new Point(54, 12));
    }
}

我知道

PasteButton.WaitForControlPropertyEqual(PasteButton.Value, "Paste", 60000);

但我无法右键单击并等待按钮启用,因为它不会自动刷新。所以我需要通过右键单击上下文菜单继续检查。

如果您不执行除右键单击以外的操作,某些内容如何进入剪贴板供您粘贴?如果你有办法对此进行测试,你可以改进你的检查,但除此之外,你所做的似乎是正确的。不过我会稍微修改一下代码。

var rightClickCell = () => Mouse.Click(Cell1, MouseButtons.Right, ModifierKeys.None, new Point(125, 10));

rightClickCell();
while (!PasteButton.Enabled);
{
    System.Threading.Thread.Sleep(10000);
    rightClickCell();
}

if (PasteButton.Enabled)
{
    // PROBABLY DO NOT WHAT TO DO THIS
    // instead, find the context menu and click the item
    // whose name/text is "Paste"
    Mouse.Click(Cell1, new Point(54, 12));
}

更好,也许更像这样:

var rightClickCell = () => Mouse.Click(Cell1, MouseButtons.Right, ModifierKeys.None, new Point(125, 10));

// pseudo code
var contextMenu = new WinContextMenu(Cell1);
var pasteMenuItem = new WinMenuItem(contextMenu);
pasteMenuItem.SearchProperties.Add("Name", "Paste");

rightClickCell();
while(!pasteMenuItem.TryFind() || !pasteMenuItem.Enabled)
{
   rightClickCell();
   WaitForControlEnabled(pasteMenuItem, 10 * 1000);
}

if(pasteMenuItem.Enabled)
{
   Mouse.Click(pasteMenuItem);
}

感谢@MPavlak,您的解决方案为我指明了正确的方向。我不得不对您的伪代码进行一些调整以使其适用于我的应用程序。

Visual Studio 坚持要我将 var rightClickCell = () 声明为 rightClickCell = new Action(() => etc...

WinContextMenu 实际上是一个 WinList,WinMenuItem 在我们的应用程序中原来是该列表中的一个 Winbutton。

我使用 SearchProperties[WinButton.PropertyNames.Name] 而不是 SearchProperties.Add,因为它与我在应用程序中发现其他对象的方式一致。

我必须在 while 循环中的主单元格上添加一个单击,因为右键单击单元格中的同一位置实际上并没有刷新菜单。在 rightClickCell 中,我可以将 new Point(125, 10) 更改为 new Point(x,y) 并可能在每次通过 while 循环时递减 x 值,从而将正确的点移动到不同的位置。但那是更多的代码行,在右键单击之前左键单击单元格会产生相同的结果。

未找到 WaitForControlEnabled,因此导致异常,因此我使用了 Thread.Sleep。

var rightClickCell = new Action(() => Mouse.Click(cell1, MouseButtons.Right, ModifierKeys.None, new Point(125, 10)));
var contextMenu = new WinList(uIContextMenu);
var pasteMenuItem = new WinButton(contextMenu);
pasteMenuItem.SearchProperties[WinButton.PropertyNames.Name] = "Paste";

rightClickCell();
while (!pasteMenuItem.TryFind() || !pasteMenuItem.Enabled)
{
    Mouse.Click(cell1, new Point(10, 10));
    rightClickCell();
    Thread.Sleep(5000);
}

if (pasteMenuItem.Enabled)
{
    pasteMenuItem.DrawHighlight();
    Mouse.Click(pasteMenuItem, new Point(10, 10));
}

如果我尝试使用 x,y 值定义 rightClickCell,我会收到错误消息: 删除'Action does not take 0 arguments'。

var rightClickCell = new Action(() => Mouse.Click(cell1, MouseButtons.Right, ModifierKeys.None, new Point(int x, int y)));