Coded UI Test无法定位第3-5个WPF按钮实例问题咨询
嘿,我之前做Coded UI测试WPF控件时也碰到过一模一样的坑!你现在的问题核心在于:复用同一个控件对象修改Instance属性时,搜索属性是叠加的,不是每次都会重置。前两次能生效是因为第一次设置Instance=1,第二次覆盖成2,但到第三次的时候,控件的搜索条件其实是同时满足Instance=2和3,自然找不到匹配的控件了。
为啥前两次行,后面不行?
看你的代码,所有方法都用了同一个UIUCRadioButton引用:
WpfRadioButton uIUCRadioButton = this.UIWPFDTAppSynTQClientShWindow.UIDesignSurfaceCustom.UIWPFDTAppSynTQClientInCustom2.UIUCRadioButton;
每次修改SearchProperties,都是在原有属性上追加,而不是替换。比如执行完Configuration_Tab2_Click后,这个控件的搜索属性已经存着Instance="2",当你在Configuration_Tab3_Click里设Instance="3",它会尝试找同时有这两个Instance值的控件——这显然不存在,所以就失败了。
最直接的解决办法:每次重新创建控件实例
别复用同一个控件对象,每次从父容器重新查找,或者新建一个WpfRadioButton实例来设置搜索属性。改完的代码大概是这样(以Tab3为例,其他标签页同理):
public void Configuration_Tab3_Click() { #region Variable Declarations // 先拿到父容器 var parentControl = this.UIWPFDTAppSynTQClientShWindow.UIDesignSurfaceCustom.UIWPFDTAppSynTQClientInCustom2; // 新建一个RadioButton实例,绑定到父容器 WpfRadioButton tab3Radio = new WpfRadioButton(parentControl); // 清除默认的搜索属性,避免干扰 tab3Radio.SearchProperties.Clear(); // 先加基础识别属性,比如控件类型 tab3Radio.SearchProperties[WpfRadioButton.PropertyNames.ControlType] = "RadioButton"; // 再加上Instance属性 tab3Radio.SearchProperties[WpfRadioButton.PropertyNames.Instance] = "3"; #endregion // 先确保找到控件再操作 tab3Radio.Find(); tab3Radio.Selected = this.Configuration_Tab_n_ClickParams.UIUCRadioButtonSelected; }
更推荐的方案:用更稳定的搜索属性替代Instance
其实Instance属性非常不靠谱,它是按控件在可视化树里的出现顺序计数的,要是界面上有隐藏控件、动态加载的元素,Instance值很容易变。建议优先用这些更稳定的标识:
- AutomationId:给WPF按钮设置
AutomationProperties.AutomationId="Tab3Radio",这是专门为UI自动化设计的唯一标识,不会变 - Name/Content:如果按钮的名称或显示文字是固定的(比如"标签页3"),也可以用这个当搜索条件
比如用AutomationId的话,代码会更简洁:
tab3Radio.SearchProperties[WpfRadioButton.PropertyNames.AutomationId] = "Tab3Radio";
完全不用依赖Instance,测试稳定性会提升一大截。
要是不想改太多代码:重置搜索属性
如果你非要复用原来的控件对象,记得每次修改前清空已有的搜索属性:
public void Configuration_Tab3_Click() { #region Variable Declarations WpfRadioButton uIUCRadioButton = this.UIWPFDTAppSynTQClientShWindow.UIDesignSurfaceCustom.UIWPFDTAppSynTQClientInCustom2.UIUCRadioButton; // 关键:先清空所有已有的搜索属性 uIUCRadioButton.SearchProperties.Clear(); // 重新添加必要的属性和Instance uIUCRadioButton.SearchProperties[WpfRadioButton.PropertyNames.ControlType] = "RadioButton"; uIUCRadioButton.SearchProperties[WpfRadioButton.PropertyNames.Instance] = "3"; #endregion uIUCRadioButton.Find(); uIUCRadioButton.Selected = this.Configuration_Tab_n_ClickParams.UIUCRadioButtonSelected; }
额外排查小技巧
如果还是找不到,打开Coded UI的Test Builder(就是那个带放大镜的工具),用十字准星点一下第3个按钮,看看它的实际Instance值是不是你以为的"3"——有时候界面上的隐藏控件会占用Instance计数,导致实际值和你预期的不一样。
按上面的方法改完,应该就能顺利点击第3-5个标签页按钮了!
内容的提问来源于stack exchange,提问作者Ewan

