【问题标题】:coded ui test project, obtain value of asp label编码ui测试项目,获取asp标签的值
【发布时间】:2017-12-27 09:44:30
【问题描述】:

在网络表单中创建了一个简单的计算器应用程序。 用户在文本字段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

【问题讨论】:

    标签: c# asp.net coded-ui-tests


    【解决方案1】:

    你想获取它的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 Test builder 并开始记录 => 点击输入框;键入 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");
    }
    

    当然,一旦您知道要查找的内容,所有这些都可以手动编码。

    【讨论】:

    • 感谢您的帮助,第二个示例对我有用。如果可以的话,我已经更新了 Q 以包含验证查询。我知道这不是原始 Q 的一部分,我仍然会将您的答案评为正确,但您似乎知道您在说什么,我找不到我要找的东西,所以我想我会问。如果没有,无论如何感谢您的原始答案!...
    • 验证消息以 的形式呈现,因此如果您想更明确一点,应该可以使用 var PositiveNumValMsg = new HtmlSpan(Browser);。通常变量以小写字母开头,所以positiveNumValMsg 是一个更传统的名称。
    • 不能使用 PositiveNumValMsg.GetProperty("style") 因为这会返回 NULL....试过 var PositiveNumValMsg1 = new HtmlSpan(Browser); PositiveNumValMsg1.GetProperty("Style");这表示表达式验证器中的内部错误
    • 感谢回复,问题是找不到标签。我可以通过 UITestControl PositiveNumValMsg = new UITestControl(Browser); 找到它PositiveNumValMsg.TechnologyName = "Web"; PositiveNumValMsg.SearchProperties.Add("Id", "MainContent_regexpName");问题是查找 style="visibility: 是 VISIBLE 还是 HIDDEN" 以便我可以测试输入字母时是否显示 VISIBLE。谢谢
    • 我明白,但我认为您可以使用他们用来搜索 ControlDefinition 以查找“可见”的相同技术,如果找不到该控件,则它被隐藏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2017-07-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多