2014-10-09 5 views
7

एंगुलरजेएस का उपयोग करके बनाए गए वेब फॉर्म में, मैं कॉम्बो बॉक्स में कुछ डेटा दर्ज करने की कोशिश कर रहा हूं, फिर नीचे तीर कुंजी दबाकर और फिर एंटर कुंजी दबाकर एक मान का चयन करें। उसके बाद, मैं जांच कर रहा हूं कि कॉम्बो बॉक्स की पॉपअप विंडो (यह एक केंडो यूआई कॉम्बो बॉक्स है) अब दिखाई नहीं दे रही है।प्रोटैक्टर भेजने के लिए प्रतीक्षा कर रहा है()

विंडोज़ पर विंडोज और मैक ओएस एक्स पर क्रोम में चलाने के परीक्षण, निम्नलिखित कोड ठीक काम करता है:

comboInput.sendKeys('CAN') 
    .sendKeys(protractor.Key.ENTER) 
    .sendKeys(protractor.Key.ARROW_DOWN) 
    .sendKeys(protractor.Key.ENTER); 

expect(input.getAttribute('value')).toBe('id_3'); 
expect(popup.getAttribute('style')).toContain('display: none'); 

कोणमापक में प्रवेश करती है "कर सकते हैं" बता गया में, तो दिखाई प्रविष्टि नीचे तीर का उपयोग कर का चयन करता है कुंजी, और उसके बाद एंटर कुंजी का उपयोग करके चयन की पुष्टि करता है, जो कॉम्बो बॉक्स पॉपअप को भी खारिज कर देता है।

ओएस एक्स पर, यह काम नहीं करता है, दूसरी उम्मीद हमेशा विफल हो जाती है, क्योंकि कुछ कारणों से उम्मीद को मूल्यांकन करने से पहले पॉपअप को खारिज करने के लिए एंटर कुंजी ईवेंट निकाल दिया जाता है।

मैंने पाया कि मैं यह काम करने के लिए निम्नलिखित के लिए कोड बदलना होगा:

comboInput.sendKeys('CAN') 
    .sendKeys(protractor.Key.ENTER) 
    .sendKeys(protractor.Key.ARROW_DOWN) 
    .sendKeys(protractor.Key.ENTER).then(function() { 
     expect(input.getAttribute('value')).toBe('id_3'); 
     expect(popup.getAttribute('style')).toContain('display: none'); 
    }); 

sendKeys एक वादा देता है, और अगर मैं वहाँ में उम्मीद शब्दों में कहें, सब कुछ ठीक काम करता है।

क्या यह करने का यह सही तरीका है? वेब पर मिले उदाहरणों में से कोई भी thensendKeys पर कॉल का उपयोग नहीं करता है।

और पहला कोड विंडोज पर क्यों काम करता है और ओएस एक्स पर नहीं? क्या मैं कुछ भूल रहा हूँ? क्या ऐसा करने के लिए इससे अच्छा तरीका है?

संपादित करें: क्या यह संभवतः ओएस एक्स पर देशी कीबोर्ड ईवेंट के संचालन से संबंधित है? http://angular.github.io/protractor/#/api?view=webdriver.WebElement.prototype.sendKeys पर कोणमापक प्रलेखन है निम्नलिखित:

नोट: ब्राउज़रों जहां देशी कीबोर्ड की घटनाओं अभी तक समर्थित नहीं हैं (OS X पर जैसे Firefox) पर, महत्वपूर्ण घटनाओं संश्लेषित कर दिया जाएगा। विशेष punctionation कुंजी मानक QWERTY एन-हमारे कीबोर्ड लेआउट के अनुसार संश्लेषित किया जाएगा।

+0

उत्कृष्ट सवाल! मेरे पास कोई जवाब नहीं है लेकिन आपको जैस्मीन का उपयोग करने का सुझाव है, 'प्रेषण' भाग को 'उम्मीद' भाग से प्रत्येक को अपने 'इसे'() 'ब्लॉक में अलग करें और उस तकनीक से बचें। –

+0

ओएसएक्स sendKeys मुद्दों के बारे में कुछ लिंक के लिए चेकआउट समस्या [# 6 9 0] (https://github.com/angular/protractor/issues/690) भी। –

+0

लेकिन क्या इस उद्देश्य को हराने नहीं होगा?मेरे लिए, प्रत्येक परीक्षण ("इसे" में वर्णित) में दोनों कार्य ('इस मामले में sendKeys') और सत्यापन ('उम्मीद') दोनों शामिल हैं। उन्हें अलग-अलग परीक्षणों में विभाजित करना लिंक को तोड़ देता है। – nwinkler

उत्तर

6

चूंकि sendKeys एक वादा देता है, यह असीमित है (जैसा कि आप जानते हैं) और किसी भी मशीन पर अपेक्षा से बाद में होने के लिए उत्तरदायी है। मुझे दृढ़ता से संदेह है कि यदि आपने विंडोज़ पर 1000 बार परीक्षण चलाया है, तो यह उसी कारण से कम से कम कुछ बार विफल हो जाएगा।

मैं इस तरह के मामलों के लिए "सर्वोत्तम अभ्यास" खोजने की कोशिश कर रहा वृद्धावस्था से लगभग मर गया हूं, और मुझे नहीं लगता कि आप पहले से ही क्या कर रहे हैं इसके अलावा एक है। मेरे कई प्रोटैक्टर परीक्षण जो वादे-वापसी कार्यों पर भरोसा करते हैं, वे अज्ञात कार्यों के साथ then() बयान के लंबे तार होने लगते हैं। लिंक देखें: अगर आप सही क्रम में काम करने के लिए मजबूर कोणमापक नहीं है, मूल रूप से

How to assign count of rows or getText to a variable in Protractor

, तो पांच से दस से बाहर बार वे गलत क्रम में नहीं होगा।

संबंधित मुद्दे