CodedUI搜索孙子控件?

时间:2014-08-06 21:02:13

标签: c# coded-ui-tests

我有一个有多行的表。我想验证表中是否有特定的字符串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正确处理树遍历?我如何寻找孙子?

2 个答案:

答案 0 :(得分:2)

  1. 您应该将代码移出部分UIMap.designer.cs类,因为下次录制控件/断言/等时它将被覆盖。将代码移动到uimap.cs分部类。

  2. 文本控件可能是也可能不是下一级别,如果它不在UIItemTable的子级别上,则代码将失败。您应该尝试使用测试工具构建器交叉头发来识别它所存在的级别。

  3. 您可以使用子枚举器并搜索所有子/孙/元素元素,直到找到您的文本项目,下面的示例如下:

    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. 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;