VS2010编码的UI测试 - 测试构建器无法映射具有相同文本的两个复选框

时间:2014-10-07 18:02:52

标签: visual-studio-2010 webforms coded-ui-tests

我正在尝试为包含两个复选框和提交超链接的简单Web表单页面创建一个编码的UI测试(使用VS2010 Ultimate)。复选框具有相同的文本标签; "我同意"。

  • 使用编码的UI测试构建器记录操作,只捕获一个复选框,因为两个复选框都具有相同的文本/相同的UIMap名称。
  • 使用十字准线工具选择第二个复选框,它会替换上一个复选框实例,因为它们具有相同的文本/相同的UIMap名称。

运行测试时,将检查第一个复选框,第二个复选框未选中,单击超链接以提交表单(验证失败)。

如何将第二个复选框添加到测试图并区分两者?

2 个答案:

答案 0 :(得分:0)

如果复选框本身没有唯一属性,请指定每个复选框的父对象以区分它们。

例:
对于

<div id="box1Parent">
    <input label="I Agree"/>
</div>
<div id=box2Parent">
    <input label="I Agree"/>
</div>

您可以像这样定义对象:

public HtmlCheckBox AgreementBox1()
{
    HtmlDiv parent = new HtmlDiv(browser);
    parent.SearchProperties["id"] = "box1Parent";
    HtmlCheckBox target = new HtmlCheckBox(parent);
    target.SearchProperties["label"] = "I Agree";
    return target;
}

然后,对第二个框执行相同操作,但将父项指向box2Parent。这将是.uitest类的非设计器部分中的代码。

答案 1 :(得分:0)

有多种方法可以做到这一点。

  1. 尝试找出id,name等对象的唯一属性。

  2. 尝试找出复选框的父控件/容器,然后使用{TAB}或{UP} / {DOWN}键。

  3. 使用键盘的{TAB}键。找出以前的控制 - &gt;点击该控件 - &gt;使用该控件中的{TAB}来关注复选框控件并使用{UP} / {DOWN}箭头键进行导航。

  4. 找出文档的文本,然后根据需要点击第一次或第二次出现的文档。 代码找出文档文本,

        public string GetCurrentPageVisibleTexts()
        {
            var window = this.UIMap.<WindowObject>
            UITestControlCollection c = window.GetChildren();
            var pgContent = (string)c[0].GetProperty("OuterHtml");
            var document = new HtmlAgilityPack.HtmlDocument();
            document.LoadHtml(pgContent);
    
            // We don't want these in our result
            var exclusionText = new string[] { "<!--", "<![CDATA", "function()", "</form>" };
    
            var visibleTexts = new List<string>();
            //var nodes = document.DocumentNode.Descendants().Where(d => !d.Name.ToLower().Equals("span"));
            foreach (var elem in document.DocumentNode.Descendants())
            {
                // Foreach element iterate its path back till root 
                // and look for "display: none" attribute in each one of its parent node
                // to verify whether that element or any of its parent are marked as hidden
                var tempElem = elem;
    
                while (tempElem.ParentNode != null)
                {
                    if (tempElem.Attributes["style"] != null)
                    {
                        // if hidden attribute found then break.
                        if (tempElem.Attributes["style"].Value.ToLower().Contains("display: none")) break;
                    }
                    tempElem = tempElem.ParentNode;
                }
    
                // If iteration reached to head and element is found clean of hidden property then proceed with text extraction.                    
                if (tempElem.ParentNode == null)
                {
                    if (!exclusionText.Any(e => elem.InnerText.Contains(e))
                    && (!elem.InnerText.Trim().IsNullOrEmpty())
                    && (!elem.HasChildNodes))
                    {
                        visibleTexts.Add(elem.InnerText);
                    }
                }
            } // Foreach close
    
            var completeText = string.Join(" ", visibleTexts).Replace("&nbsp;", " ");
            return Regex.Replace(completeText, @"\s+", " ");
        }