2017-01-24 45 views
9

Scenariusz: Za każdym razem, gdy użytkownik zaloguje się przy użyciu niepoprawnych poświadczeń, pojawi się modulator ładowania początkowego przez 1-2 sekundy z komunikatem "przepraszam, nieprawidłowe dane uwierzytelniające". Poniżej znajduje się kod HTML modalu.Polecenie oczekiwania kątomierza nie może czekać na pojawienie się modemu bootstarp.

<div class="modal-content"> 
<div class="modal-body note-error text-center ng-binding"> Sorry, invalid credentials! </div> 
</div> 

Muszę sprawdzić, czy oczekiwany tekst błędu jest równy faktycznemu tekstowi błędu.

Mój kod

PageObject.js

var errorModal = element(by.css('.modal-body.note-error.text-center.ng-binding')); 

this.getErrorText = function(){ 

var until = protractor.ExpectedConditions; 
browser.wait(until.textToBePresentInElement(errorModal, "Sorry, invalid credentials!"), 3000, "Not able to find"); 


    return errorModal.getText(); 

}; 

Spec.js

expect(Login_Page.getErrorText()).toMatch('Sorry, invalid credentials!'); 

Wyjście

Wiadomość: Oczekiwany '', aby dopasować „Niestety, nieprawidłowych poświadczeń ! ".

Nie wiem, dlaczego to oczekiwanie nie działa. Jakakolwiek pomoc będzie doceniona.

+0

Czy próbowałeś wyodrębnić tekst bezpośrednio za pomocą 'getText()'? 'return errorModal.getText()' –

+0

tak to już zrobiło .. –

+0

Zazwyczaj widziałem ten problem, gdy jest dużo okien modalnych w 'dom' i na raz tylko 1 (lub brak) jest generowany na podstawie jakiegoś wyzwalacza. Ale Kątomierz zawsze podniesie pierwszy w "dom". Czy możesz wkleić kompletny 'html' jeśli nie ... czy możesz sprawdzić, czy masz więcej niż 1 element z' modal-body' w swoim HTML? – AdityaReddy

Odpowiedz

1

To jest odpowiedź wnosząca wkład pittgoose jako część https://github.com/angular/protractor/issues/4030. Pomyślałem, że będę się tutaj dzielić

Ok, przed każdym kątomierzem działania webdriver wykonuje browser.waitForAngular(), który czeka na wszystkie skrypty kątowe, aby zakończyć działanie przed wykonaniem następnej czynności. W tym przypadku uważam, że kątomierz czeka, aż modulator zniknie, zanim wykona wyszukiwanie.

Ponadto udowodniłem swoją teorię, ponieważ po dodaniu browser.waitForAngularEnabled (false) przed browser.wait (...) test przeszedł pomyślnie.Przykład:

browser.get('https://app.p3fy.com/#/login'); 
     element(by.css('[name="email"]')).sendKeys('[email protected]'); 
     element(by.css('[name="password"]')).sendKeys('blah'); 
     element(by.css('[type="submit"]')).click(); 
     browser.waitForAngularEnabled(false); // THIS MAKES THE TEST PASS 
     browser.wait(ExpectedConditions.textToBePresentInElement(element(by.id('errorDialog')), 'Sorry, invalid credentials!'), 3000, 'No!'); 

Nie będzie to problemem w przypadku interfejsu API Selenium Webdriver, ponieważ nie oczekuje na załadowanie Angulara.

2

Znalazłem rootOd problemu po przyjrzeniu się [aplikacji]. Modal błędu, którego szukasz, zawsze istnieje w dom - Oznacza to, że isPresent() zawsze zwróci true. Ale to jest widoczne tylko dla 1 lub 2 sekundy na nieprawidłowym wejścia - To znaczy isDisplayed() powróci true dla tych zaledwie kilku sekund

Efektem ubocznym jest to wartość zwracana getText(). Zwraca tylko widoczny wewnętrzny tekst wewnętrzny. Sprawdzić poniżej wyciąg z official documentation

Get widoczną innerText tego elementu, w tym podelementów, bez prowadzącej albo tylnym spacji. Widoczne elementy nie są ukryte przez CSS.

Ów powód widzisz pustą wartość od getText()

proponuję obejście gdzie wyodrębnić innerText przez browser.executeScript()

zastąpić return errorModal.getText() z return browser.executeScript('return arguments[0].textContent',errorModal) i powinno być wszystko dobrze

Daj mi znać, jeśli to zadziała

+0

Dzięki za poświęcenie czasu na zaglądanie w to. Nawet ja jestem również świadomy tego obejścia, które wcześniej próbowałem i działa browser.executeScript ('return (argumenty [0] .textContent) .trim()', errorModal). Moje główne pytanie brzmi: dlaczego metoda statyczna textToBePresentInElement() klasy ExpectedConditions nie działa. Próbowałem tego samego w selenowym webdriverze i działało. Jestem nowy w Kątomierzu i nie jestem w stanie go zrozumieć, dlaczego to nie działa, ponieważ wciąż jest opakowaniem w stosunku do interfejsu webowego selenium webdriver. Wysłałem to również w zagadnieniu kątomierza https://github.com/angular/protractor/issues/4030. Proszę zasugerować –

+0

Logika do tego jest prosta i standardowa. Pobieram tekst z ErrorModal tylko wtedy, gdy zawiera on tekst błędu za pomocą metody expectedtonditions textToBePresentInElement(). –

+0

Twój selen getText() zostałby wywołany, gdy wyskakujące okienko będzie widoczne przez te kilka sekund. To przypadek .. Czy możesz uruchomić wiele razy, aby sprawdzić, czy jest stabilny ... I nie można sprawdzić widoczności, ponieważ 'textToBePresentInElement()' używa 'presenceOf (elementFinder)' i 'visibilityOf()' – AdityaReddy