2012-08-23 19 views
7

Piszę testy funkcjonalne i radzę sobie z oknem modalnym, które znika i znika.W Geb, jaka jest różnica między wyświetlaną a obecną?

Jaka jest różnica między wyświetlaną a obecną?

Na przykład mam:

settingsModule.container.displayed and settingsModule.container.present 

gdzie settingsModule reprezentuje moje okno modalne.

Podczas testowania moje okno modalne (modal z bootstrap z Twittera), zazwyczaj to zrobić:

def "should do ... "() { 
    setup: 
    topMenu.openSettingsModal()  

    expect: 
    settingsModule.timeZone.value() == "Asia/Hong_Kong" 

    cleanup: 
    settingsModule.closeSettingsModal() 
} 

def "should save the time zone"() { 
     setup: 
     topMenu.openSettingsModal()    
     settingsModule.timeZone = "Japan" 

     when:    
     settingsModule.saveSettings()  

     then: 
     settingsModule.alertSuccess.size() == 1 
     settingsModule.alertSuccess.text() == "Settings updated" 

     when: 
     settingsModule.saveSettings()  

     then: 
     settingsModule.alertSuccess.size() == 1 

     cleanup: 
     settingsModule.closeSettingsModal() 
    } 

i tak dalej. W moich modułach mam:

void openSettingsModal() {     
     username.click() 
     settingsLink.click()    
    } 

void closeSettingsModal() { 
     form.cancel().click()  
    } 

Zawsze otrzymuję skargę: "Element musi być wyświetlony, aby kliknąć".

W moim openSettingsModal i closeSettingsModal, wypróbowałem wiele kombinacji waitFor z interwałem czasowym i używaniem present or not ... Nie mogę tego rozgryźć.

Wszelkie wskazówki byłyby bardzo cenne. Dzięki!

Odpowiedz

6

Myślę, że główna różnica polega na tym, że obecny sprawdziłby, czy w twoim DOM występuje element, a jednocześnie wyświetla sprawdzanie widoczności tego elementu.

Należy pamiętać, że webdriver symuluje rzeczywiste doświadczenie użytkownika za pomocą myszy i klikając stronę internetową, więc jeśli element nie jest dla nich widoczny, nie będą mogli go kliknąć.

Zastanawiam się, czy twój problem nie ma związku z tym, że ustawienia settingsLink nie znajdują się w DOM po załadowaniu strony. Jeśli czekasz na oknie popup i link do życia w tym oknie dialogowym, a następnie prawdopodobnie chcesz ustawić coś takiego

content{ 
    settingsLink(required: false) { $('...' } 
    settingsModal(required: false) { $('#modalDialog') } 
} 

Twój waitfor powinien wyglądać mniej więcej tak

username.click() 
waitFor{ settingsModal.displayed } 
settingsLink.click() 

chciałbym trzymać Księga konwencji geb i po prostu wyświetlaj cały czas.

Geb Manual - Determining visibility

+0

Próbowałem Twojego rozwiązania, ale nie działało. Proponowane przeze mnie rozwiązanie idzie w tym samym kierunku z kilkoma poprawkami. Dziękuję Ci! – ontk

4

Dzięki za odpowiedź. Naprawdę udało mi się rozwiązać mój problem.

Problem polegał na tym, że okno modalne miało animację o długości 500ms. Otwieranie i zamykanie okna kilkakrotnie w moich testach sprawiło, że odniosły sukces/niespójnie niekonsekwentnie.

To co zrobiłem, to podpięcie "pokazanego" zdarzenia dostarczonego przez wtyczkę. Skończyło się na dodaniu do modalu "pokazanej" klasy i sprawdzeniu jej co 100ms podczas 1s.

void openSettingsModal() {  
    username.click() 
    settingsLink.click() 
    waitFor (1, 0.1) { $("#settingsModal", class: "shown").size() == 1 } 
} 

void closeSettingsModal() { 
    form.cancel().click() 
    waitFor (1, 0.1) { $("#settingsModal", class: "shown").size() == 0 }  
} 

Na marginesie testy kończyły się niepowodzeniem w przeglądarce Chrome i Firefox, ALE przechodziły w IE !! Zgaduję, że ponieważ IE 8 nie obsługuje animacji, które przechodzą moje testy.

Teraz wszystko jest dobrze.

Mam nadzieję, że kiedyś komuś pomoże!

0

Gdzie możemy użyć displayed?

Jeśli konkretny element usuwasz lub usuwasz, jeśli nadal znajduje się on w DOM i nie jest wyświetlany na stronie, możesz użyć asercji thatelement.displayed == false, która sprawdzi, czy element nie jest wyświetlany na stronie (ale wciąż jest obecny w DOM)

Gdzie możemy użyć present?

W ten sam przykład jak powyżej, po usunięciu, jeśli element nie znajduje się w DOM, należy skorzystać obecni weryfikacji

assert thatelement.present == false 

nadzieję, że rozumiesz ....

Dodawanie do powyższe, obecne zajmuje więcej czasu w wykonaniu skryptu