C# Can';t使用TestStack.White直接单击按钮

C# Can';t使用TestStack.White直接单击按钮,c#,automation,white-framework,C#,Automation,White Framework,我正在尝试单击外部windows应用程序上的按钮。下面的代码成功地找到了元素,将父窗口置于焦点,然后“手动”单击按钮 这很好用 Process tProcess = Process.GetProcesses().FirstOrDefault(x => x.MainWindowTitle.StartsWith("MainWindowName")); if (tProcess != null) { TestStack.White.Application application = Te

我正在尝试单击外部windows应用程序上的按钮。下面的代码成功地找到了元素,将父窗口置于焦点,然后“手动”单击按钮

这很好用

Process tProcess = Process.GetProcesses().FirstOrDefault(x => x.MainWindowTitle.StartsWith("MainWindowName"));
if (tProcess != null)
{
    TestStack.White.Application application = TestStack.White.Application.Attach(tProcess.Id);
    var tWindow = application.GetWindow(SearchCriteria.ByAutomationId("SubWindowName"), InitializeOption.NoCache);
    SearchCriteria searchCriteria = SearchCriteria.ByAutomationId("btnCalibrate");
    var calibrateBtn = tWindow.Get<TestStack.White.UIItems.Button>(searchCriteria);
    tWindow.Focus();
    var clickablePoint = calibrateBtn.AutomationElement.GetClickablePoint();
    Mouse.Instance.Click(clickablePoint);
}
但每次都会出现以下错误

TestStack.White.AutomationException
  HResult=0x80131500
  Message=Cannot perform action on Button. AutomationId:btnCalibrate, Name:Calibrate, ControlType:button, FrameworkId:WinForm, 
  Source=TestStack.White
  StackTrace:
   at TestStack.White.UIItems.UIItem.PerformIfValid(Action action) in c:\TeamCity\buildAgent\work\89a20b30302799e\src\TestStack.White\UIItems\UIItem.cs:line 254
   at TestStack.White.UIItems.UIItem.Click() in c:\TeamCity\buildAgent\work\89a20b30302799e\src\TestStack.White\UIItems\UIItem.cs:line 231
   at BetfairStreamingAPI.RadForm1.radLabelBetTime_Click(Object sender, EventArgs e) in D:
有人知道为什么第二个方法会抛出此错误,以及是否可以修复此错误,以便在不手动移动光标的情况下单击按钮

编辑:尝试设置切换状态的屏幕截图

EDIT2

我想你可能发现了一些有趣的东西。由于您的按钮状态是不确定的,因此在单击它之前打开它是值得的:

caliblebtn.State=ToggleState.On

编辑1 好吧,让我们一起来解决这个问题

该行动失败的原因只有两个:

  • 这个按钮没有启用,我想这是不可能的
  • 按钮在屏幕外
  • 如果你这样做

    Console.WriteLine(calibrateBtn.IsOffScreen.ToString());
    
    你应该看到

    true
    
    如果是,请在单击之前尝试以下操作:

    var pattern = calibrateBtn.AutomationElement.GetCurrentPattern(System.Windows.Automation.InvokePattern.Pattern);
    (pattern as System.Windows.Automation.InvokePattern).Invoke();
    

    此特定问题的解决方案似乎是使用
    .RaiseClickEvent()
    而不是
    。单击()

    下面的代码可以工作

    Process tProcess = Process.GetProcesses().FirstOrDefault(x => x.MainWindowTitle.StartsWith("MainWindowName"));
    if (tProcess != null)
    {
        TestStack.White.Application application = TestStack.White.Application.Attach(tProcess.Id);
        var tWindow = application.GetWindow(SearchCriteria.ByAutomationId("SubWindowName"), InitializeOption.NoCache);
        SearchCriteria searchCriteria = SearchCriteria.ByAutomationId("btnCalibrate");
        var calibrateBtn = tWindow.Get<TestStack.White.UIItems.Button>(searchCriteria);
    
        calibrateBtn.RaiseClickEvent();
    }
    
    Process tProcess=Process.getprocesss().FirstOrDefault(x=>x.MainWindowTitle.StartsWith(“MainWindowName”);
    if(tProcess!=null)
    {
    TestStack.White.Application Application=TestStack.White.Application.Attach(tProcess.Id);
    var tWindow=application.GetWindow(SearchCriteria.ByAutomationId(“子窗口名”),InitializeOption.NoCache);
    SearchCriteria SearchCriteria=SearchCriteria.ByAutomationId(“btnCalibrate”);
    var CalibleBtn=tWindow.Get(搜索条件);
    校准btn.RaiseClickEvent();
    }
    

    从白色文档中还不完全清楚何时/为什么会选择此选项。我在这个链接上找到了方法RaiseClickEvent this,它是父窗口,因此将窗口带到前台。此选项已删除,但仍不起作用。IsofScreen=false。我还添加了您的建议,但得到了相同的错误。属性caliblebtn.State=undeterminate如果这意味着什么,我还尝试在获取按钮之前首先将父对象置于焦点,但出现了相同的错误。这很奇怪,因为按钮是正确的,但点击时总是出错。谢谢,我添加了一个新的编辑。让我知道,如果有任何问题的代码,如果它的工作。它也不会允许。请参阅问题的附加屏幕截图-我得到
    System.NullReferenceException对象引用未设置为对象的实例
    我想我已经找到了一种方法使其工作-
    caliblebtn.RaiseClickEvent()工作!在这里找到这个选项是的,就是这样做的。这里也这么说
    
    Process tProcess = Process.GetProcesses().FirstOrDefault(x => x.MainWindowTitle.StartsWith("MainWindowName"));
    if (tProcess != null)
    {
        TestStack.White.Application application = TestStack.White.Application.Attach(tProcess.Id);
        var tWindow = application.GetWindow(SearchCriteria.ByAutomationId("SubWindowName"), InitializeOption.NoCache);
        SearchCriteria searchCriteria = SearchCriteria.ByAutomationId("btnCalibrate");
        var calibrateBtn = tWindow.Get<TestStack.White.UIItems.Button>(searchCriteria);
    
        calibrateBtn.RaiseClickEvent();
    }