2015-02-23 2 views
9

How do I assert an element is focused? धागा के अनुसार, आप देख सकते हैं कि एक तत्व एक activeElement() में स्विच करके ध्यान केंद्रित है और जोर इस एक ही तत्व आप ध्यान केंद्रित होने की संभावना है:जोर देकर कहा एक तत्व केंद्रित है

expect(page.element.getAttribute('id')).toEqual(browser.driver.switchTo().activeElement().getAttribute('id')); 

मेरे मामले में, वर्तमान में तत्व पर केंद्रित id विशेषता नहीं है।

id की जांच करने के बजाय मुझे क्या करना चाहिए?

बोनस प्रश्न: साथ ही, जैसा कि आप इसे हल करने के लिए मेरी कोशिशों से देख सकते हैं, ऐसा लगता है कि मैं एक पूर्ण वस्तु के रूप में तत्व (या वेब तत्व) की अपेक्षा/अनुमान नहीं लगा सकता। क्यूं कर?


मैं कोशिश की है:

expect(page.element).toEqual(browser.driver.switchTo().activeElement()); 

लेकिन है एक त्रुटि मैं भी समझ में नहीं आ सकते हैं के साथ विफल हो रहा है - वहाँ एक बहुत बड़ा ट्रैस बैक (इसके बारे में 10 मिनट के कंसोल में स्क्रॉल करने के लिए है) है, लेकिन अंदर उपयोगकर्ता के अनुकूल त्रुटि नहीं है। नवीनतम चांदा विकास संस्करण का उपयोग करना

Error: expect called with WebElement argument, expected a Promise. Did you mean to use .getText()?

:

मैं भी getWebElement() उपयोग करने के लिए कोशिश की है:

expect(page.element.getWebElement()).toEqual(browser.driver.switchTo().activeElement()); 

लेकिन यह निम्न त्रुटि प्राप्त हुई।

+0

आपका 'पृष्ठ.लेमेंट'' क्या है, आप इसे कहां निर्दिष्ट करते हैं? –

+0

@BettySt मैं एक वास्तविक तत्व के बारे में बात नहीं करना पसंद करता हूं और इसके बारे में सोचता हूं कि इस पर भरोसा करने के लिए कोई विशेषता नहीं है .. लेकिन अगर आप पूछें कि यह 'इनपुट नाम = "उपयोगकर्ता नाम"> 'तत्व है, जिसे मैं कर सकता हूं , सख्ती से 'नाम' विशेषता द्वारा पहचाना जा रहा है..लेकिन मैं इससे बचना चाहता हूं .. – alecxe

+0

हम्म मैं वास्तव में समझ में नहीं आता कि आप तत्व निर्दिष्ट क्यों नहीं करते हैं .. किसी भी तरह से इस तत्व की तुलना में उपयोगकर्ता कार्रवाई होनी चाहिए ध्यान केंद्रित किया? जब आप उपयोग के मामले का वर्णन करते हैं तो शायद हमारे लिए यह आसान है ..? –

उत्तर

7

मेरा उत्तर में मैं ग्रहण करने के लिए activeElem और pageElem दोनों चांदा तत्व ढूँढ़ने वाले हैं जा रहा हूँ, और एक ही वेब तत्व ओर इशारा करते हैं।

क्यों

expect(activeElem).toEqual(pageElem); 

अनंत लूप में हो जाता है के बारे में अपने सवाल का जवाब देने सबसे पहले, यह, चांदा समझौता चमेली के expect जोर देते हुए पहले वादा हल करने क्योंकि है ताकि बिना expect(activeElem.getText()).toEqual('text'); काम करता है जैसे कार्य कर

activeElem.getText().then(function(text) { 
    expect(text).toEqual('text'); 
}) 

आप कह सकते हैं, क्यों न केवल वादे को हल करें? लेकिन फिर घोंसला किए गए वादे हैं।

तो अब आप सोच रहे होंगे कि यह एक मुद्दा है, लेकिन यह वास्तव में ऐसा नहीं है क्योंकि आप वास्तविक तत्व मामले में दो तत्वों की तुलना कभी नहीं करेंगे। जैस्मीन की toEqual एक संदर्भ जांच करता है, और गहरी तुलना नहीं, इसलिए expect(activeElem).toEqual(pageElem), एक साधारण संदर्भ तुलना के समान ही है: (activeElem === pageElem).toToTruthy(), और वास्तव में ऐसा कोई बिंदु नहीं है। (नोट element(by.css('html')) === element(by.css('html')) झूठी है, क्योंकि यह एक ही संदर्भ नहीं है।)

तो, यह थ्रेड के लिए असली सवाल का जवाब देने:

expect(activeElem.getId()).toEqual(pageElem.getId()); 
+0

बिल्कुल वही जो मैं खोज रहा था। आपकी मदद के लिए बहुत बहुत धन्यवाद! – alecxe

0

आपको प्रोटैक्टर/वेबड्राइवर को पृष्ठ पर अपना तत्व कैसे ढूंढना है, उसे बताने के लिए एक तरीके से आने की आवश्यकता है। प्रोटैक्टर तत्वों को खोजने के लिए जावास्क्रिप्ट का उपयोग करता है, इसलिए डीओएम का निरीक्षण करने के लिए उपलब्ध किसी भी उपकरण उपलब्ध हैं। चांदा और webdriver विभिन्न by जायके इन API लपेट:

http://angular.github.io/protractor/#/api?view=ProtractorBy

बुनियादी जायके के अलावा, कोणमापक कोणीय अवगत जायके कहते हैं (ताकि आप बाध्यकारी आदि कोणीय से खोज सकते हैं,)।

यदि आपके तत्व में कोई विशिष्ट विशेषता नहीं है, तो परीक्षण करने में आसान बनाने के लिए कुछ जोड़ने के लायक हो सकते हैं। या, (हालांकि यह अक्सर इतना नाजुक है क्योंकि यह बहुत नाजुक है), आप एक xpath का उपयोग कर सकते हैं। देखें https://github.com/angular/protractor/blob/master/docs/locators.md

+0

यह एक बिल्कुल मान्य बिंदु है। मुझे अभी भी यकीन नहीं है कि मैं एक वस्तु (या वेब तत्व) को किसी ऑब्जेक्ट के रूप में क्यों नहीं डाल सकता, लेकिन इसके बजाय इसके गुणों में से एक को जांचना है..मैं एक बक्षीस खोलूंगा और इस प्रश्न को थोड़ी देर के लिए खोलूंगा। धन्यवाद! – alecxe

+0

आह, मुझे लगता है कि मैंने आपके प्रश्न को गलत पढ़ा है। क्या आप "पेज.लेमेंट" की परिभाषा शामिल कर सकते हैं? मुझे लगता है कि चीजों को स्पष्ट कर देगा। –

+0

अस्पष्ट होने के लिए खेद है। मैं 'पृष्ठ.लेमेंट' के बारे में एक अमूर्त तत्व के रूप में सोचना चाहता हूं, जो विषय के लिए, एक विशेषता के साथ भरोसेमंद और विशिष्ट रूप से पहचाना नहीं जा सकता है। वैसे भी, 'page.element' एक इनपुट तत्व को संदर्भित करता है: ''। व्यावहारिक रूप से, हाँ, मैं इसे नाम से पहचान सकता हूं, लेकिन अब मैं इस बात पर अधिक ध्यान केंद्रित कर रहा हूं कि हमें तत्व तत्वों पर जाने की आवश्यकता क्यों है, यह जांचने के बजाय कि एक सक्रिय तत्व वह है जिसे हम पहले ही पा चुके हैं - पर रहना तत्व का स्तर आशा है कि आप समझेंगे कि मेरा क्या मतलब है। वैसे भी, आपका बिंदु अभी भी मान्य है और मैं इसे यहां होना चाहता हूं। धन्यवाद! – alecxe

2

यह अजीब बात है कि यह केवल एक वादा की उम्मीद कर रहा है और वेबड्राइवर तत्व को संभाल नहीं सकता ... मेरे पास आपके जैसा ही बड़ा स्टैकट्रैक था।

वैसे भी, क्या आप इस तरह के समाधान को स्वीकार करेंगे: एक अच्छा टिप्पणी के साथ "गूंगा" वादा भेजें, यह उचित ठहराने के लिए कि आपको ऐसा क्यों करना है। यह एक अर्थपूर्ण समाधान से अधिक कामकाज है जो मैं स्वीकार करता हूं।

expect(page.element.getInnerHtml()) 
    .toEqual(browser.driver.switchTo().activeElement().getInnerHtml()); 

यह मेरे लिए काम कर रहा है;)

संपादित करें: बोनस जवाब

कारण आप उम्मीद कर एक WebElement साथ Webdriver Control Flow Principle से आता है फोन नहीं कर सकते हैं (मैं आप वाकई पहले से ही कर रहा हूँ के बारे में जानें) और this line in jasminewd, जैस्मीन से वेबड्राइवर के लिए एडाप्टर प्रोटैक्टर द्वारा विकसित और उपयोग किया गया;)

+0

हाँ, यह निश्चित रूप से एक दिलचस्प कामकाज है! (आज के लिए upvotes से बाहर - कल यह करेंगे)। इसे देखने के लिए धन्यवाद! – alecxe

+0

@alecxe upvote से अधिक, मुझे बताएं कि यह काम करता है :) आपका स्वागत है! – glepretre

+0

निश्चित रूप से, यह काम करता है! – alecxe

0

आप बस टेक्स्ट (या कुछ और) की जांच कर सकते हैं वह तत्व:

var currentElement = browser.switchTo().activeElement(); 
expect(currentElement.getText()).toEqual(page.element.getText()); 
+0

यह @ पीटी के करीब है। सुझाव दिया और बिंदु पूरी तरह से मान्य है। अभी मैं बोनस प्रश्न पर अधिक ध्यान केंद्रित कर रहा हूं - दूसरे शब्दों में - मैं पूर्ण तत्व की जांच क्यों नहीं कर सकता और गुणों या पाठ पर जाना चाहता हूं। भागीदारी के लिए धन्यवाद! – alecxe

1

भविष्य के लिए: कैसे दो elementFinders ही अंतर्निहित webelements अगर देखने के लिए/ध्यान केंद्रित पाठकों, मैं एक custom matcher बना चुके हैं तो एक तत्व सक्रिय है बात पर जोर देना:

beforeEach(function() { 
    jasmine.addMatchers({ 
     toBeActive: function() { 
      return { 
       compare: function(elm) { 
        return { 
         pass: elm.getId().then(function (activeElementID) { 
          return browser.driver.switchTo().activeElement().getId().then(function (currentElementID) { 
           return jasmine.matchersUtil.equals(currentElementID, activeElementID); 
          }); 
         }) 
        }; 
       } 
      }; 
     } 
    }); 
}); 

उपयोग:

expect(element(by.css("#myid")).toBeActive(); 
+0

क्या यह भी मानता है कि तत्व में 'आईडी' है? – eLRuLL

+0

@eLRuLL नहीं, प्रत्येक तत्व में एक आंतरिक "आईडी" है - यह एक नियमित आईडी विशेषता से अलग है। धन्यवाद। – alecxe

1

CSS चयनकर्ताओं का उपयोग करते हुए और के बारे में क्या:

expect(element.all(by.css('#myid:focus')).count()).toBe(1); 
1

मैं का उपयोग करके चांदा के इसे हल ध्यान केंद्रित: ElementFinder.prototype.equals

const activeElement = await browser.driver.switchTo().activeElement(); 
const potentialyFocusedElement = await component.$('your-locator'); 
const isFocused = await potentialyFocusedElement.equals(activeElement); 

मुझे यकीन है कि नहीं कर रहा हूँ कैसे बिल्कुल equals काम करते हैं, एक गहरी तुलना अगर यह होता है, या यह किसी भी तरह से उदाहरणों की तुलना करता है। लेकिन यह काम करता है।

ध्यान दें कि आप activeElement.equals(...) पर कॉल नहीं कर सकते क्योंकि यह एलिमेंटफाइंडर नहीं है, यह WebElement है।

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