Подтвердить что ты не робот

Запрограммированный проект ui test, получить значение метки asp

Создано приложение простого калькулятора в webforms. Пользователь вводит номер в текстовое поле MainContent_numberTb и нажимает кнопку результатов.

Добавил новый "кодированный тестовый проект UI" в мое решение. Испытайте пользовательский интерфейс, добавив "5", это все работает отлично. Теперь хотел бы сравнить фактический результат с ожидаемым результатом.

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");
}

UPDATE ОК, поэтому с помощью консоли отладчика я смог получить значение метки с помощью ((Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlSpan)new System.Collections.ArrayList.ArrayListDebugView(((System.Collections.CollectionBase)(AllNumsTB.FindMatchingControls()).List).InnerList).Items[0]).DisplayText

но когда я использую это в коде и ArrayListDebugView недоступны из-за защиты?

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// UPDATE Спасибо 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);

но все они верны, даже если метка не отображается, но она все еще находится на странице, которая просто не указана. В этом случае я должен проверить его стиль.. что-то вроде

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

затем проверьте, содержит ли стиль visibility: visible?

4b9b3361

Ответ 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;
}

EDIT: Что касается тестирования ASP.Net Validator

Мне удалось проверить, отображается ли сообщение валидатора следующим способом:

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) Запустите создатель кодированного пользовательского интерфейса и начал запись = > Щелкните поле ввода; напечатано s; hit tab (отображается сообщение об ошибке валидатора).

3) Приостановил рекордер.

4) Щелкните значок "Создать код" и дайте ему имя метода; нажмите кнопку "Добавить и сгенерировать".

5) Теперь я перетащил значок Crosshair на сообщение валидатора. Прокрутка списка параметров - это ControlDefinition. Щелкните правой кнопкой мыши и выберите "Добавить утверждение...".

6) Изменен компаратор на "Содержит"; значение сравнения - "visible;"; и дал сообщение об ошибке подтверждения.

7) Щелкните значок "Создать код", дайте ему имя метода и т.д.

Теперь у нас есть код, который проверит валидатор, выполнив два метода: сначала ввести вход и триггер (или нет) сообщение валидатора; второй - для проверки видимости сообщения валидатора. Я скопировал и вставил сгенерированный код и использовал его для написания другого противоположного теста, используя "hidden"; при правильном вводе. Провели оба теста, и оба они прошли.

В итоге вы получите что-то вроде (замените значения):

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");
}

Конечно, все это можно закодировать вручную, как только вы знаете, что ищете.