2012-08-23 34 views
7

मैं कार्यात्मक परीक्षण लिख रहा हूं और एक मोडल विंडो से निपट रहा हूं जो अंदर और बाहर फीका है।गेब में, प्रदर्शित और वर्तमान के बीच क्या अंतर है?

प्रदर्शित और वर्तमान के बीच क्या अंतर है?

उदाहरण के लिए मेरे पास है:

settingsModule.container.displayed and settingsModule.container.present 

जहां settingsModule मेरी मोडल विंडो प्रतिनिधित्व करता है।

जब मेरे मोडल विंडो (ट्विटर की बूटस्ट्रैप से मोडल) का परीक्षण, मैं आमतौर पर ऐसा करते हैं:

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

मुझे हमेशा शिकायत होती है: "तत्व क्लिक करने के लिए प्रदर्शित होना चाहिए"।

मेरी खुली सेटिंग्स में मॉड्यूल और क्लोज़सेटिंग मोडल, मैंने प्रतीक्षा अंतराल के साथ कई समय की कोशिश की और वर्तमान अंतराल के साथ ... इसे समझ नहीं सकता।

किसी भी पॉइंटर्स की अत्यधिक सराहना की जाएगी। धन्यवाद!

उत्तर

6

मुझे लगता है कि मुख्य अंतर यह है कि वर्तमान में यह जांच होगी कि आपके डोम में एक तत्व है, जबकि इस तत्व की दृश्यता पर प्रदर्शित चेक।

याद रखें कि वेबड्राइवर माउस का उपयोग करके वेबसाइट का उपयोग करके और क्लिक करने वाले उपयोगकर्ता के वास्तविक अनुभव को अनुकरण करता है, इसलिए यदि तत्व उनके लिए दृश्यमान नहीं है, तो वे उस पर क्लिक नहीं कर पाएंगे।

मुझे आश्चर्य है कि क्या आपकी समस्या सेटिंग्स के साथ करना है, जब पृष्ठ पहले लोड होने पर डोम में नहीं है। आप एक संवाद पॉपअप करने के लिए और इस संवाद में रहने के लिए एक कड़ी के लिए इंतजार कर रहे हैं, तो आप शायद की तरह

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

की तरह कुछ

अपने waitfor दिखना चाहिए

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

मैं के साथ रहना चाहते हैं कुछ सेट करना चाहते हैं जीबी सम्मेलनों की किताब और बस हर समय प्रदर्शित होता है।

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

एक साइड नोट के रूप में, परीक्षण क्रोम और फ़ायरफ़ॉक्स में विफल रहे थे लेकिन आईई में गुजर रहे थे !! मैं अनुमान लगा रहा हूं क्योंकि आईई 8 एनीमेशन का समर्थन नहीं करता है कि मेरे परीक्षण गुजर रहे थे।

अब यह सब अच्छा है।

मुझे उम्मीद है कि यह किसी दिन किसी की मदद करेगा!

0

जहां हम displayed का उपयोग कर सकते हैं?

यदि कोई विशेष तत्व जिसे आप हटा रहे हैं या हटा रहे हैं, यदि यह अभी भी डोम में है और पृष्ठ में प्रदर्शित नहीं है, तो आप thatelement.displayed == false पर जोर दे सकते हैं जो सुनिश्चित करेगा कि पृष्ठ में तत्व प्रदर्शित नहीं होता है (लेकिन फिर भी यह मौजूद है डीओएम में)

जहां हम present का उपयोग कर सकते हैं?

एक ही उदाहरण में के रूप में ऊपर, हटाने के बाद, अगर तत्व डोम में नहीं पाया जाता है, तो आप वर्तमान सत्यापन

assert thatelement.present == false 

आशा है कि आप समझते हैं के लिए करने के लिए जोड़ा जा रहा है का उपयोग करना चाहिए ....

उपरोक्त, वर्तमान में स्क्रिप्ट निष्पादन