C# 如何使用AutomationId识别WinForms DevXPress控件?

C# 如何使用AutomationId识别WinForms DevXPress控件?,c#,winforms,devexpress-windows-ui,white-framework,C#,Winforms,Devexpress Windows Ui,White Framework,我们继承了一个大型的旧版WinForms应用程序,它使用DevExpress控件(DevExpress.XtraNavBar.v8.1和DevExpress.XtraEditors.v8.1)(我已经能够升级到版本15.1。它是DevExpress提供的一个项目转换器工具,允许您使用最新的DevEpress控件) 停止手工测试并创建一个自动化套件来测试应用程序的压力很大。我们已经调查了这些工具,这是满足我们需求的最佳工具 问题在于DevExpress控件,因为我们根本无法识别它们。尽管我们能够识

我们继承了一个大型的旧版WinForms应用程序,它使用DevExpress控件(DevExpress.XtraNavBar.v8.1和DevExpress.XtraEditors.v8.1)(我已经能够升级到版本15.1。它是DevExpress提供的一个项目转换器工具,允许您使用最新的DevEpress控件)

停止手工测试并创建一个自动化套件来测试应用程序的压力很大。我们已经调查了这些工具,这是满足我们需求的最佳工具

问题在于DevExpress控件,因为我们根本无法识别它们。尽管我们能够识别这些控件的父控件

        var application = Application.Launch(@"C:\App\app.exe");
        var window = application.GetWindow(SearchCriteria.ByAutomationId("MainMDI"), InitializeOption.NoCache);
        var menu = window.Get(SearchCriteria.ByAutomationId("navBarMainMenu")); // this is the parent of those DevExpress controls


        // here throws an exeception because cannot find the 'Users' menu item (it is actually other text)
        var users = menu.Get(SearchCriteria.ByText("Users"));
        users.Click();

在“inspect.exe”中,它显示父对象具有子对象:

这是使用“UI自动化验证”:

更新:

我尝试过获取父对象的子对象,但它返回一个包含零项的列表:

        var application = Application.Launch(@"C:\App\app.exe");
        var window = application.GetWindow(SearchCriteria.ByAutomationId("MainMDI"), InitializeOption.NoCache);
        var menu = window.Get(SearchCriteria.ByAutomationId("navBarMainMenu"));


        System.Windows.Automation.AutomationElement automationElement = menu.AutomationElement;
        AutomationElementCollection automationElementCollection = automationElement.CachedChildren; // the collection is empty
        foreach (AutomationElement element in automationElementCollection)
        {
            string name = element.Current.Name;
            if (name == "Users")
            {
                // try to click on it
            }
        }
更新2:

我已将DevExpress升级到v15.2,但仍然找不到任何自动化Id

注:对于绿色矩形表示抱歉,客户不想显示应用程序中的任何内容。

还没有很好的答案,但我在过去两周一直在研究完全相同的问题;我们无法通过编码的UI测试找到DevExpress元素的自动化ID,而且当我们进行测试时,它很少可靠。16.1在winGrids的IdeaBrade包更新之前不是可行的解决方案。很多人都有同样的问题。 当我回到我的计算机时,我会发布更多信息,并随时对我进行dm-在我们的例子中,DevExpress元素(在13.1中)在运行时的制作方式会导致大量自动化ID导致堆栈溢出错误-


编码用户界面(codedui)被认为是它唯一的工作用户界面测试(如果你使用的是企业版VS),但我会看看white。一句警告的话——因为这些自动化ID一直在动态生成,所以测试时间越长,或者尝试访问的数据越多,就会遇到堆栈溢出问题,而按方法调用find元素正是导致这种情况的原因。我回去工作时会更新的!祝你好运:-)

这是我几个月前问过的一个问题。正如您所说的,唯一可行的解决方案是在Visual Studio Enterprise中使用“编码UI”框架,并购买DevXPress Universal subscription,它超越了与编码UI的集成。遗憾的是,没有免费的白色框架的可行解决方案。我认为DevExpress是故意这样做的,这样可以从订阅中挤出更多的钱