Coded UI测试项目,获取ASP标签的值。

13

使用Webforms创建了一个简单的计算器应用程序。用户在文本字段MainContent_numberTb中输入数字,然后点击结果按钮。

将一个新的“编码 UI 测试项目”添加到我的解决方案中。通过添加“5”测试了UI,一切正常。现在希望将实际结果与预期结果进行比较。

BrowserWindow Browser = BrowserWindow.Launch("http://url");

UITestControl UiInputField = new UITestControl(Browser);
UiInputField.TechnologyName = "Web";
UiInputField.SearchProperties.Add("ControlType", "Edit");
UiInputField.SearchProperties.Add("Id", "MainContent_numberTb");

//Populate input field
Keyboard.SendKeys(UiInputField, "5");

//Results Button
UITestControl ResultsBtn = new UITestControl(Browser);
ResultsBtn.TechnologyName = "Web";
ResultsBtn.SearchProperties.Add("ControlType", "Button");
ResultsBtn.SearchProperties.Add("Id", "MainContent_calBtn");

Mouse.Click(ResultsBtn);

所有的代码都能正常工作,但访问标签时出现了问题。

<asp:Label ID="AllNumLbl_Res" runat="server"></asp:Label>

控件类型旁边应该插入什么?它不是编辑,因为编辑是文本字段。那么,用来存储实际结果以便我可以比较AllNumsTB的是什么?

string expectedAllNums = "1, 2, 3, 4, 5";
UITestControl AllNumsTB = new UITestControl(Browser);
AllNumsTB.TechnologyName = "Web";
AllNumsTB.SearchProperties.Add("ControlType", "?????");
AllNumsTB.SearchProperties.Add("Id", "MainContent_AllNumLbl_Res");

if(expectedAllNums != AllNumsTB.??????)
{
    Assert.Fail("Wrong Answer");
}

更新 好的,使用调试器控制台,我能够通过((Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlSpan)new System.Collections.ArrayList.ArrayListDebugView(((System.Collections.CollectionBase)(AllNumsTB.FindMatchingControls()).List).InnerList).Items[0]).DisplayText获取标签的值。

但是当我在代码中使用它,并且ArrayListDebugView由于受到保护而无法访问??

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 更新 感谢K Scandrett的答案...如果可以的话,我想知道您是否也可以帮助我进行验证...如果用户输入字母或非正数,则会触发错误消息。

<asp:RegularExpressionValidator ID="regexpName"

 //VALIDATION MESSAGE
                UITestControl PositiveNumValMsg = new UITestControl(Browser);
                PositiveNumValMsg.TechnologyName = "Web";
                PositiveNumValMsg.SearchProperties.Add("Id", "MainContent_regexpName");

一切都运行良好,但是我想测试标签是否出现...到目前为止我已经尝试过了

//bool visible = false;
            //System.Drawing.Point p;

            //// If the control is offscreen, bring it into the viewport
            //PositiveNumValMsg.EnsureClickable();

            //    // Now check the coordinates of the clickable point
            //    visible = PositiveNumValMsg.TryGetClickablePoint(out p)
            //        && (p.X > 0 || p.Y > 0);

            var isVisible = PositiveNumValMsg.WaitForControlPropertyNotEqual(UITestControl.PropertyNames.State, ControlStates.Invisible);

但是它们都返回true,即使标签没有显示,但它仍然在页面上设置为不可见。在这种情况下,我应该检查它的样式..类似于

//string labelText3 = PositiveNumValMsg.GetProperty("style").ToString();

然后检查样式是否包含 visibility: visible?

1个回答

3
你想获取它的InnerText属性。
设置ControlType不是必需的,所以以下某些变体应该可以工作:
UITestControl AllNumsTB = new UITestControl(Browser);
AllNumsTB.TechnologyName = "Web";
AllNumsTB.SearchProperties.Add(HtmlControl.PropertyNames.Id, "MainContent_AllNumLbl_Res");

var result = AllNumsTB.GetProperty(HtmlLabel.InnerText).Trim();
// var result = AllNumsTB.GetProperty("InnerText").Trim();

或者https://social.msdn.microsoft.com/Forums/en-US/69ea15e3-dcfa-4d51-bb6e-31e63deb0ace/how-to-read-dynamic-text-from-label-using-coded-ui-for-web-application?forum=vstest中获取:

var AllNumsTB = new HtmlLabel(Browser);
AllNumsTB.TechnologyName = "Web";
AllNumsTB.SearchProperties.Add(HtmlControl.PropertyNames.Id, "MainContent_AllNumLbl_Res");
var result = AllNumsTB.InnerText;

string result2;

// you may need to include this section, or you may not
if (result.Length > 0)
{
    AllNumsTB.WaitForControlReady();
    result2 = AllNumsTB.InnerText;
}

编辑:关于测试ASP.Net验证器

我已经能够通过以下方法检查验证器消息是否显示:

1)创建一个带有正则表达式验证器的测试ASP.NET页面,该验证器要求恰好有2个数字:

<asp:TextBox ID="numberTb" runat="server"></asp:TextBox>
<asp:RegularExpressionValidator ID="regexpName" ControlToValidate="numberTb" ValidationExpression="\d{2}" runat="server" ErrorMessage="Please enter 2 digits"></asp:RegularExpressionValidator>
<asp:Button ID="Button1" runat="server" Text="Button" />

2) 运行Coded UI测试生成器并开始录制 => 点击输入框; 输入s; 按下tab键(显示验证器错误消息)。

3) 暂停录制。

4) 点击“生成代码”图标并给它一个方法名; 点击“添加并生成”按钮。

5) 现在我将十字线图标拖放到验证器消息上。在选项列表中向下滚动是ControlDefinition。右键单击它并选择“添加断言...”。

6) 将比较器更改为“包含”; 将比较值更改为“可见的;”; 并给它一个断言失败消息。

7) 单击“生成代码”图标,给它一个方法名等。

现在我们有了一段代码,可以通过运行两个方法来测试验证器-首先输入内容并触发(或不触发)验证器消息; 第二个是测试验证器的消息可见性。我复制并粘贴了生成的代码,并使用“隐藏;”编写了另一个相反的测试以给出正确的输入。运行两个测试,它们都通过了。

您最终会得到类似以下的内容(已替换值):

public void DigitValidatorMsgShownWithIncorrectStringInput()
{
    #region Variable Declarations
    HtmlSpan uIAtleast2digitsPane = this.UIHomePageMyASPNETApplWindow.UIHomePageMyASPNETApplDocument.UIAtleast2digitsPane;
    #endregion

    // Verify that the 'ControlDefinition' property of 'At least 2 digits' pane contains ' visible;'
    StringAssert.Contains(uIAtleast2digitsPane.ControlDefinition, " visible;", "The validator was not shown");
}

当然,一旦你知道你要寻找什么,所有这些都可以手动编码。


谢谢你的帮助,第二个例子对我有用。如果可以的话,我已经更新了问题并包含了一个验证查询。 我知道这不是原始问题的一部分,但我仍然会将你的答案评为正确,因为你似乎知道你在说什么,而我找不到我要找的东西,所以我想问问。如果不行,无论如何感谢你的原始回答!... - John
验证消息渲染为<span>,因此如果您想更明确地使用它,应该能够使用var PositiveNumValMsg = new HtmlSpan(Browser);。通常变量以小写字母开头,因此“positiveNumValMsg”将是一个更常规的名称。 - K Scandrett
无法使用PositiveNumValMsg.GetProperty("style"),因为它返回NULL...尝试使用var PositiveNumValMsg1 = new HtmlSpan(Browser); PositiveNumValMsg1.GetProperty("Style"); 这会在表达式验证器中产生内部错误。 - John
谢谢回复,问题不在于找标签。我可以使用UITestControl找到它 PositiveNumValMsg = new UITestControl(Browser); PositiveNumValMsg.TechnologyName = "Web"; PositiveNumValMsg.SearchProperties.Add("Id", "MainContent_regexpName"); 问题在于如何找到style="visibility: is VISIBLE or HIDDEN",以便测试输入字母时是否显示为VISIBLE。谢谢 - John
我理解,但我认为您可以使用与搜索ControlDefinition中出现“visible”的技术相同的技术,如果它找不到控件,则将其隐藏。 - K Scandrett
我已经测试了ControlDefinition的“visible;”搜索,它运行良好(也使用“hidden;”进行了测试)。如果您仍然无法检查验证器,则我已编辑了我的答案以解释步骤。 - K Scandrett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接