प्रोटेक्टर में एक इनपुट पर कैसे प्राप्त करें


105

प्रोट्रैक्टर के लिए प्रलेखन में, मैं निम्नलिखित उदाहरण देखता हूं:

describe('by model', function() {
  it('should find an element by text input model', function() {
    var username = element(by.model('username'));
    username.clear();
    username.sendKeys('Jane Doe');

    var name = element(by.binding('username'));

    expect(name.getText()).toEqual('Jane Doe');
  });

यहाँ जो स्पष्ट दिखाई देता है वह यह है कि आप "by.model" का उपयोग इनपुट बॉक्स में मान सेट करने के लिए कर सकते हैं, लेकिन यदि आप इनपुट बॉक्स को देखना चाहते हैं और देखना चाहते हैं कि आपको "by.binding" का उपयोग करने की आवश्यकता है।

मेरे पास कोड का एक सेट है जहां (संक्षेप में) मैं करता हूं:

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');

(अपने वास्तविक कोड में मैं इकाई को सहेजता हूं, फिर इसे संपादित मोड में वापस आता हूं, और मैं अपने मूल्य की जांच कर रहा हूं वास्तव में सहेजा गया था। लेकिन यह अभी भी उसी चीज को उबालता है, और यह नमूना कोड समान समस्या देता है)।

यह मुझे एक त्रुटि देता है:

Error: Expected '' to equal 'A value'.

सिद्धांत रूप में, डॉक्स से उदाहरण के बाद, मैं इसके बजाय कर सकता हूं:

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');

लेकिन बाइंडिंग पूरी तरह से योग्य मॉडल को पसंद नहीं करता है, मुझे एक त्रुटि मिलती है:

Error: No element found using locator: by.binding("risk.name")

यह काम करता है (एक फैशन के बाद) अगर मैं करता हूं:

element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');

यह एक तत्व ढूंढता है, लेकिन यह चेतावनी भी देता है कि मेरे पास एक से अधिक तत्व हैं जो 'नाम' से मेल खाते हैं। और दुर्भाग्य से जो इसे चुनता है वह सही नहीं है।

तो, दो सवाल:

  1. क्या by.model एक getText () को वापस करने में सक्षम होना चाहिए, या क्या कोई डिज़ाइन निर्णय है जो ऐसा नहीं करता है और हमें इसके बजाय by.binding का उपयोग करने की आवश्यकता है?
  2. क्या मुझे बाइंडिंग में पूरी तरह से योग्य इकाई का उपयोग करने में सक्षम होना चाहिए, या क्या कोई डिज़ाइन निर्णय है जो बाइंडिंग पूर्ण मॉडल नाम को पसंद नहीं करता है? यदि हां, तो मैं अपने अलग-अलग बाइंडिंग के बीच चयन करने के लिए किस अन्य क्वालीफायर का उपयोग कर सकता हूं?

संपादित करें:

मैंने vdrulerz द्वारा सुझाए गए समाधान की भी कोशिश की है, मैंने कोड को इस प्रकार संशोधित किया है:

element(by.model('risk.name')).getText().then(function(text) {
  console.log(text);
  expect(text).toEqual('A risk name');  
});

कंसोल.लॉग एक रिक्त मान (वादा या ऑब्जेक्ट नहीं) लौटा रहा है, और उम्मीद संदेश देने में विफल रहती है:

Expected '' to equal 'A risk name'.

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

मैं getText () के बजाय getAttribute का उपयोग करके निम्नलिखित कोड भी चला सकता हूं:

expect(element(by.model('risk.name')).getAttribute('autofocus')).toEqual('true');
element(by.model('risk.name')).getAttribute('autofocus').then(function(text) {
  console.log(text);
  expect(text).toEqual('true');  
});

पहला भाग गुजरता है - उम्मीद काम करती है। दूसरा भाग भी काम करता है, यह सुझाव देता है कि vdrulerz 'वाक्यविन्यास भी मान्य है, और यह कंसोल में' सही 'लॉग करता है। मुझे लगता है कि गेटटेक्स्ट के साथ संभवतः एक दोष है?

जवाबों:


202

इसका उत्तर प्रोट्रैक्टर एफएक्यू में दिया गया है: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-ement-is-always- खाली

इनपुट तत्व से गेटटेक्स्ट का परिणाम हमेशा खाली होता है

यह एक वेबड्राइवर क्वर्क है। और तत्वों में हमेशा खाली getText मान होते हैं। इसके बजाय, कोशिश करें:

element.getAttribute('value')

प्रश्न 2 के लिए, हां, आपको by.binding के लिए पूरी तरह से योग्य नाम का उपयोग करने में सक्षम होना चाहिए। मुझे संदेह है कि आपके टेम्पलेट में वास्तव में एक तत्व नहीं है जो {{}} या एनजी-बाइंड के माध्यम से risk.name के लिए बाध्य है।


आह, मैंने सोचा था कि मैं हर जगह देखा होगा, इसके लिए खोज भी शामिल है। और मैंने अभी इस बात पर एक मुद्दे के रूप में उभारा कि आखिरकार मुझे इस आधार पर कोई जवाब नहीं मिला। नाक में दम करना। मेरा तत्व एनजी-मॉडल के साथ बाध्य है, इसलिए इसमें html में "एनजी-मॉडल =" risk.name "" है। लेकिन हो सकता है कि इसे काम करने की जरूरत न हो। मैं getAttribute का उपयोग करने का सुझाव देने के लिए डोको को अपडेट करने का सुझाव दूंगा।
पॉल 12

1
पोस्टरिटी के लिए इसे जोड़ना क्योंकि मैंने अभी बहुत लंबा समय बिताया है: यह वास्तव में एक वादा है, न कि एक स्ट्रिंग। github.com/angular/protractor/issues/673
बोरडमलर

और मुझे लगता है कि यह जादू getAttribute के व्यवहार के कारण काम करता है, जो वास्तव में एक संपत्ति प्राप्त करेगा (यानी यह तब भी एक मूल्य लौटाएगा भले ही आपके डोम में कोई "मूल्य" विशेषता मौजूद न हो): "..., जब तक कि विशेषता नहीं है वर्तमान में, जिस स्थिति में समान नाम के साथ संपत्ति का मूल्य लौटाया जाता है "
द रेड मटर

6

getText() फ़ंक्शन वेबड्राइवर के लिए उपयोग किए जाने वाले तरीके की तरह काम नहीं करेगा, इसके लिए इसे प्रॉटेक्टर के लिए काम करने के लिए आपको इसे एक फ़ंक्शन में लपेटने और पाठ को वापस करने की आवश्यकता होगी जैसे हमने अपने प्रोट्रैक्टर ढांचे के लिए किया था जिसे हमने इसे एक में रखा है सामान्य कार्य जैसे -

getText : function(element, callback) {
        element.getText().then (function(text){             
            callback(text);
         });        

    },

इसके द्वारा आप किसी तत्व का पाठ कर सकते हैं।

मुझे बताएं कि क्या यह अभी भी अस्पष्ट है।


मैं समझता हूं कि मुझे यह करने की आवश्यकता है कि अगर मैं सीधे पाठ का उपयोग करना चाहता हूं, लेकिन मुझे लगा कि प्रोट्रेक्टर ने जैस्मीन से अपेक्षा की थी कि वे वादे करने वाले से निपटने के लिए उम्मीद करेंगे - ताकि उम्मीद (एलिमेंटेट) ()। तो .getText ()। (उम्मीद (पाठ) .toEqual)। क्या यह सही नहीं है?
पॉल डे

यह भी मेरे लिए काम नहीं करता है। मैंने अपना प्रश्न ऊपर दिया है ताकि आप इस प्रारूप को देख सकें।
5

एलिमेंट (by.locator ('abc') का उपयोग करने का प्रयास करें। getText ()। तब (फंक्शन (टेक्स्ट) {कंसोल.लॉग (टेक्स्ट) की अपेक्षा करें (टेक्स्ट) .toEqual ("someext");});
vdrulerz

यह रिपोर्ट करता है कि ऑब्जेक्ट [ऑब्जेक्ट ऑब्जेक्ट] की कोई विधि 'लोकेटर' नहीं है। मुझे 'by.locator' के प्रोट्रेक्टर एपी में एक विधि नहीं दिखती है, और मैं कोड में एक भी नहीं देख सकता - और निश्चित रूप से अगर कोई by.locator विधि थी, तो वह कुछ इस तरह की होगी। लोकेटर ('मॉडल', 'risk.name') '?
पॉल डे

by.locator के साथ मेरा मतलब है कि आप prot.findelement (By.id), CSS, Xpath या किसी भी लोकेटर विशेषता जैसे कुछ का उपयोग कर सकते हैं .... अगर यह अभी भी काम नहीं करता है plz अपने कोड और html विशेषताओं को मेरे साथ साझा करें ... निश्चित रूप से ... आपकी मदद ...
vdrulerz

2

मेरे पास यह मुद्दा था मैंने जेएमआर के समाधान की कोशिश की लेकिन यह मेरे लिए काम नहीं करता था। जैसा कि सभी इनपुट फ़ील्ड में एनजी-मॉडल विशेषताएँ होती हैं मैं विशेषता को खींच सकता हूं और इसका मूल्यांकन कर सकता हूं और मूल्य प्राप्त कर सकता हूं।

एचटीएमएल

<input ng-model="qty" type="number">

चांदा

var qty = element( by.model('qty') );
qty.sendKeys('10');
qty.evaluate(qty.getAttribute('ng-model')) //-> 10

0

यह कोड काम करता है। मेरे पास एक दिनांक इनपुट फ़ील्ड है जिसे केवल पढ़ने के लिए सेट किया गया है जो उपयोगकर्ता को कैलेंडर से चयन करने के लिए मजबूर करता है।

एक आरंभ तिथि के लिए:

var updateInput = "var input = document.getElementById('startDateInput');" +
    "input.value = '18-Jan-2016';" +
    "angular.element(input).scope().$apply(function(s) { s.$parent..searchForm[input.name].$setViewValue(input.value);})";
browser.executeScript(updateInput);

अंतिम तिथि के लिए:

var updateInput = "var input = document.getElementById('endDateInput');" +
    "input.value = '22-Jan-2016';" +
    "angular.element(input).scope().$apply(function(s) { s.$parent.searchForm[input.name].$setViewValue(input.value);})";
    browser.executeScript(updateInput);

0

नीचे दिया गया कोड मेरे लिए काम करता है, इनपुट से टेक्स्ट प्राप्त करने के लिए

return(this.webelement.getAttribute('value').then(function(text)
    {
        console.log("--------" + text);
}))

0

आपको तत्वों के मूल्यों को प्रिंट या स्टोर करने के लिए प्रॉमिस का उपयोग करना होगा।

 var ExpectedValue:string ="AllTestings.com";
          element(by.id("xyz")).getAttribute("value").then(function (Text) {

                        expect(Text.trim()).toEqual("ExpectedValue", "Wrong page navigated");//Assertion
        console.log("Text");//Print here in Console

                    });

-1

आप कुछ इस तरह की कोशिश कर सकते हैं

var access_token = driver.findElement(webdriver.By.name("AccToken"))

        var access_token_getTextFunction = function() {
            access_token.getText().then(function(value) {
                console.log(value);
                return value;
            });
        }

आप इस फ़ंक्शन को कॉल कर सकते हैं, जहाँ आप मूल्य प्राप्त करना चाहते हैं ..


-3

आप टेक्स्ट बॉक्स में टेक्स्ट प्राप्त करने के लिए jQuery का उपयोग कर सकते हैं (मेरे लिए अच्छी तरह से काम करें), छवि विस्तार से देखें

कोड:

$(document.evaluate( "xpath" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue).val()

Example: 
$(document.evaluate( "//*[@id='mail']" ,document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue).val()

अपने कोड में इस उपरोक्त क्वेरी को इंजेक्ट करें। छवि विस्तार:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.