我有一个有多行的表。我想验证表中是否有特定的字符串StringName
。我使用CodedUI来查找控件,UI映射是这样的:
public class UIItemTable : WpfTable
{
#region Fields
private UIItemRow mUIItemRow;
#endregion
}
public class UIItemRow : WpfRow
{
#region Fields
private UIBlahBlahBlahCell mUIBlahBlahBlahCell;
#endregion
}
public class UIBlahBlahBlahCell : WpfCell
{
#region Fields
private WpfText mUIBlahBlahBlahText;
#endregion
}
我想找到与WpfText
匹配的StringName
。所以我在UIItemTable
添加了一个函数:
public class UIItemTable : WpfTable
{
public WpfText Find(string StringName)
{
WpfText StringNameWpfText = new WpfText(this);
StringNameWpfText.SearchProperties[WpfText.PropertyNames.Name] = StringName;
return StringNameWpfText;
}
#region Fields
private UIItemRow mUIItemRow;
#endregion
}
但是CodedUI无法找到WpfText
控件。我收到的错误是:
Microsoft.VisualStudio.TestTools.UITest.Extension.UITestControlNotFoundException。 播放无法通过给定搜索找到控件 属性。其他详细信息:TechnologyName:'UIA'ControlType: '文字'名称:......
我认为这个错误可能是因为我想搜索的WpfCell实际上是该表的孙子。但我认为CodedUI正确处理树遍历?我如何寻找孙子?
答案 0 :(得分:2)
您应该将代码移出部分UIMap.designer.cs类,因为下次录制控件/断言/等时它将被覆盖。将代码移动到uimap.cs分部类。
文本控件可能是也可能不是下一级别,如果它不在UIItemTable的子级别上,则代码将失败。您应该尝试使用测试工具构建器交叉头发来识别它所存在的级别。
您可以使用子枚举器并搜索所有子/孙/元素元素,直到找到您的文本项目,下面的示例如下:
public UIControl FindText(UIControl ui)
{
UIControl returnControl = null;
IEnumerator<UITestControl> UIItemTableChildEnumerator =
ui.GetChildren().GetEnumerator();
while(uiChildEnumerator.MoveNext())
{
if(uiChildEnumerator.Current.DisplayText.equals(StringName))
{
returnControl = uiChildEnumerator.Current
break;
}
else
{
returnControl = this.FindText(uiChildEnumerator.Current)
if(returnControl != null)
{
break;
}
}
}
return returnControl;
}
4。另一种选择是使用FindMatchingControls()函数并解析类似于上面的语句。你可能仍然需要适当的直接父母
WpfText StringNameWpfText = new WpfText(this);
IEnumerator<UITestControl> textItems = StringNameWpfText .FindMatchingControls().GetEnumerator();
while (textItems.MoveNext())
{
//search
}
希望这有帮助
答案 1 :(得分:0)
我通常先找到细胞。我相信表中的任何内容都在单元格中。所以我们可以先搜索细胞,然后潜入细胞。
查找值与给定字符串匹配的单元格的一种方法。
WpfCell cell = myWpfTable.FindFirstCellWithValue(string StringName);
if(cell != null)
return cell.Value // returns WpfControl;
else
return null;
获取包含特定字符串的单元格值的另一种方法
WpfCell myCell = myWpfTable.Cells
.FirstOrDefault(c => c.Value.Contains("StringName"));
var myTextControl = myCell != null ? myCell.Value : null;
如果文本嵌套在单元格的深处,则可以执行此操作。就像你在表中做的那样
// Find cell which contains the particular string, let say it "myCell"
WpfText mytext = new WpfText(myCell);
mytext.SearchProperties.Add(WpfText.PropertyNames.Name, "StringName", PropertyExpressionOperator.Contains);
if(mytext.Exist)
return myText;
else
retrun null;