2012-08-23 2 views
7

기능 테스트를 작성하고 페이드 인 및 페이드 아웃하는 모달 창을 다룹니다.Geb에서 표시되는 것과 현재의 것의 차이점은 무엇입니까?

표시되는 것과 현재의 차이점은 무엇입니까?

예를 들어 내가 가진 :

settingsModule 내 모달 창을 나타냅니다
settingsModule.container.displayed and settingsModule.container.present 

.

내 모달 창 (트위터의 부트 스트랩에서 모달) 테스트, 나는 보통 이렇게 : 계속적으로

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

합니다. 내 모듈에는 다음과 같은 문자가 포함되어 있습니다.

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

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

"나는 클릭하면 요소가 표시되어야합니다."

내 openSettingsModal 및 closeSettingsModal에서 시간 간격으로 waitFor를 여러 번 시도하고 현재 사용 여부를 결정했습니다 ... 알아낼 수 없습니다.

모든 포인터는 높이 평가 될 것입니다. 감사!

답변

6

주된 차이점은 현재 존재하는 것이 DOM에 요소가 있는지 확인하는 반면이 요소의 가시성을 확인하는 것입니다.

webdriver는 마우스를 사용하여 웹 사이트를 사용하고 클릭 한 사용자의 실제 경험을 시뮬레이션하므로 요소가 보이지 않는 경우 클릭 할 수 없습니다.

페이지가 처음로드 될 때 DOM에없는 settingsLink와 관련이 있는지 궁금합니다. 당신이 팝업 할 수있는 대화와이 대화에 살고있는 링크를 기다리는 경우에, 당신은 아마 내가 고수 할

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

당신 WAITFOR가 보일 것입니다 뭔가

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

처럼 뭔가를 설정하려면 geb 협약의 책과 그냥 사용 항상 표시됩니다. 답장을 보내

Geb Manual - Determining visibility

+0

해답을 시도했지만 제대로 작동하지 않았습니다. 내가 제안한 해결책은 약간의 비틀기와 함께 같은 방향으로 나아 간다. 고맙습니다! – ontk

4

감사합니다. 실제로 문제를 해결할 수있었습니다.

문제는 모달 윈도우의 애니메이션이 500ms라는 것이 었습니다. 내 테스트에서 창을 여러 번 열고 닫으면 불일치하게 성공/실패하게되었습니다.

내가 끝낸 것은 플러그인에서 제공하는 "표시된"이벤트를 연결하는 것입니다. 나는 모달에 "표시된"클래스를 추가하고 1 초 동안 매 100ms를 확인했다.

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 }  
} 

참고로 Chrome과 Firefox에서는 테스트가 실패했지만 IE에서는 통과했습니다! Internet Explorer 8에서 테스트가 통과 한 애니메이션을 지원하지 않기 때문에 추측합니다.

지금은 모두 좋습니다.

언젠가 누군가가 도움이되기를 바랍니다.

0

여기서 displayed을 사용할 수 있습니까?

제거하거나 삭제하려는 특정 요소가 여전히 DOM에 있고 페이지에 표시되지 않으면 어설 션 thatelement.displayed == false을 사용하면 해당 요소가 페이지에 표시되지 않지만 여전히 표시됩니다 DOM에서)

여기서 present을 사용할 수 있습니까? 요소는 DOM에서 발견되지 않는 경우 위와 같은 예에서

제거 후, 당신은에 추가 ....

assert thatelement.present == false 

가 이해 희망 검증을 위해

을 현재 사용한다 위의 현재 스크립트 실행에 더 많은 시간이 걸립니다.