2017-07-21 33 views
13

Utworzono prostą aplikację kalkulatora w formularzach internetowych. Użytkownik wprowadza numer w polu tekstowym MainContent_numberTb i klika przycisk wyników.zakodowany projekt testowy interfejsu użytkownika, uzyskaj wartość etykiety asp

Dodano nowy "zakodowany projekt testowy interfejsu użytkownika" do mojego rozwiązania. Przetestowałem interfejs użytkownika dodając "5", wszystko działa dobrze. Chciałbym teraz porównać rzeczywisty wynik z oczekiwanym wynikiem.

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

Wszystkie wyżej kod działa poprawnie, problem pojawia się podczas próby dostępu etykietę

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

Co mogę wstawić obok typu sterowania? To nie jest edycja, ponieważ edycja jest polem tekstowym. W takim razie, co przechowuje rzeczywisty wynik, abym mógł porównać 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 OK więc za pomocą konsoli debugera udało mi się uzyskać wartość etykiety przy użyciu ((Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlSpan)new System.Collections.ArrayList.ArrayListDebugView(((System.Collections.CollectionBase)(AllNumsTB.FindMatchingControls()).List).InnerList).Items[0]).DisplayText

ale kiedy używam tego w kodzie & ArrayListDebugView są niedostępne ze względu na ochronę ??

////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //// AKTUALIZACJADziękuję K Scandrett za odpowiedź ... Jeśli mógłbym się zastanawiać, czy mógłbyś również pomóc mi w sprawdzeniu poprawności ... Jeśli użytkownik wprowadzi literę lub nie dodatni numer, komunikat o błędzie zadziała ..

<asp:RegularExpressionValidator ID="regexpName" 

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

To wszystko działa dobrze, jednak chcę, aby sprawdzić, czy na etykiecie pojawia się lub nie ... do tej pory próbowałem

//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); 

ale wszyscy wrócą tak nawet wtedy, gdy etykieta nie jest widoczny, ale wciąż jest na stronie po prostu ustawiony na niewidoczny. W takim przypadku należy sprawdzić jego style..something jak

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

następnie sprawdzić, czy styl zawiera visibility: visible?

Odpowiedz

3

Chcesz pobrać jego własność InnerText.

To nie jest obowiązkowe, aby ustawić ControlType, więc pewne różnice z poniższych powinno działać:

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(); 

LUB z 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: Jeśli chodzi o testowanie ASP.Net Validator

udało mi Che ck, czy komunikat weryfikatora jest wyświetlany za pomocą następującej metody:

1) Utworzono próbny bol.Strona netto z walidatora regex, który wymaga dokładnie 2 cyfry:

<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) prowadził budowniczy Coded UI przetestować i nagrywania => kliknął polu tekstowym rozpoczęte; wpisano: s; hit tab (wyświetlany jest komunikat o błędzie sprawdzającego poprawność).

3) Wstrzymano rejestrator.

4) Kliknięto ikonę "Generuj kod" i nadaj jej nazwę; kliknąłem przycisk "Dodaj i wygeneruj".

5) Teraz przeciągnąłem i upuściłem ikonę Celownika na wiadomość walidatora. Przewijanie listy opcji to ControlDefinition. Kliknij go prawym przyciskiem myszy i wybierz "Dodaj potwierdzenie ...".

6) Zmieniono Komparator na "Zawiera"; wartość porównania do "widocznego;"; i nadał komunikat o niepowodzeniu asercji.

7) kliknął ikonę „Generuj kod”, dał mu nazwę metody, itd

Teraz mamy kod, który będzie testować walidatora uruchamiając dwa sposoby - pierwszy wejść na wejście i spust (lub nie) komunikat zatwierdzający; drugi, aby przetestować widoczność komunikatu weryfikatora. Skopiowałem i wkleiłem wygenerowany kod i użyłem go do napisania kolejnego testu przeciwstawnego za pomocą "ukrytego"; po podaniu prawidłowego wejścia. Wykonał oba testy i oboje minęli.

Będziesz skończyć z czymś takim (nie podstawionymi wartościami):

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

Oczywiście to wszystko może być kodowane ręcznie, gdy wiesz, czego szukasz.

+0

Dziękuję za pomoc, drugi przykład pracował dla mnie. Jeśli mogę, to zaktualizowałem Q, aby dołączyć zapytanie weryfikacyjne. Wiem, że to nie było częścią orignal Q, nadal będę przyznawać twoją odpowiedź jako poprawną, ale wydajesz się wiedzieć, o czym mówisz mówisz i nie mogę znaleźć tego, czego szukam, więc myślałem, że zapytam. Jeśli nie, to dziękuję za odpowiedź oryginalną! ... – John

+0

Komunikaty sprawdzania poprawności są renderowane jako , więc powinieneś być w stanie użyć 'var PositiveNumValMsg = new HtmlSpan (Browser) ;, jeśli chcesz być bardziej bezpośredni. Zwykle zmienne zaczynają się od małej litery, więc 'positiveNumValMsg' będzie bardziej konwencjonalną nazwą. –

+0

Nie można użyć PositiveNumValMsg.GetProperty ("styl"), ponieważ zwraca NULL .... Próbowano var PositiveNumValMsg1 = new HtmlSpan (przeglądarka); PositiveNumValMsg1.GetProperty ("Styl"); to mówi błąd wewnętrzny w wyrażeniu validator – John