প্রোটাক্টরের ইনপুটটিতে কীভাবে টেক্সট পাবেন


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');
  });

এখানে যা পরিষ্কার দেখা যাচ্ছে তা হ'ল আপনি একটি ইনপুট বাক্সে মানগুলি সেট করতে "বাই.মডেল" ব্যবহার করতে পারেন তবে আপনি যদি একটি ইনপুট বাক্সটি দেখতে চান এবং এতে কী দেখতে চান তবে আপনাকে "বাই বাইন্ডিং" ব্যবহার করতে হবে।

আমার কোডের একটি সেট রয়েছে যেখানে (সংক্ষেপে) আমি করি:

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

(আমার আসল কোডে আমি সত্তাটি সংরক্ষণ করি তারপরে সম্পাদনা মোডে এটিতে ফিরে আসি এবং আমি আমার মানটি যাচাই করেছিলাম যাচাই করে নিচ্ছি But তবে এটি এখনও একই জিনিসটিতে ফোটে এবং এই নমুনা কোডটি একই সমস্যা দেয়)।

এটি আমাকে একটি ত্রুটি দেয়:

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. বাই.মোডেলটি কি getText () ফিরিয়ে দিতে সক্ষম হবে, বা এমন কোনও ডিজাইনের সিদ্ধান্ত আছে যা এটি না করে এবং এর পরিবর্তে আমাদের বাই বাইন্ডিং ব্যবহার করা দরকার?
  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 'সিনট্যাক্সটিও বৈধ, এবং এটি কনসোলে' সত্য 'লগ করে। আমি মনে করি getText এর সাথে সম্ভাব্য কোনও ত্রুটি আছে?

উত্তর:


202

প্রটেক্টর এফএকিউতে এর উত্তর দেওয়া হয়: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always- খালি

একটি ইনপুট উপাদান থেকে getText ফলাফল সর্বদা খালি

এটি একটি ওয়েবড্রাইভার কৌতুক। এবং উপাদানগুলির সর্বদা খালি getText মান থাকে। পরিবর্তে, চেষ্টা করুন:

element.getAttribute('value')

প্রশ্ন 2 হিসাবে, হ্যাঁ, আপনার বাই বাইন্ডিংয়ের জন্য একটি সম্পূর্ণ যোগ্য নাম ব্যবহার করতে সক্ষম হওয়া উচিত। আমি সন্দেহ করি যে আপনার টেম্পলেটটিতে এমন কোনও উপাদান নেই যা risk {}} বা এনজি-বাইন্ডের মাধ্যমে ঝুঁকিপূর্ণ নামে আবদ্ধ।


আহ, আমি ভেবেছিলাম যে আমি এটি সন্ধান সহ সর্বত্র সন্ধান করব। এবং আমি আজ প্রোটেক্টর গিথুবকে কেবল এই ভিত্তিতে উত্থাপন করেছি যে ভিত্তিতে আমি কোনও উত্তর পাইনি। বিরক্ত। আমার উপাদানটি এনজি-মডেলের সাথে আবদ্ধ, সুতরাং এটি এইচটিএমএলে "এনজি-মডেল =" ঝুঁকি.নাম "" রয়েছে। তবে এটি কাজ করার জন্য যা প্রয়োজন তা হতে পারে না। আমি getAttribute ব্যবহার করার পরামর্শ দেওয়ার জন্য ডকো আপডেট করার পরামর্শ দেব।
PaulL

1
পোস্টেরিটির জন্য এটি যুক্ত করা যেহেতু আমি এটি সন্ধান করতে খুব দীর্ঘ সময় ব্যয় করেছি: getAttribute আসলে একটি প্রতিশ্রুতি দেয়, একটি স্ট্রিং নয়। github.com/angular/protractor/issues/673
বিরক্তিকর

এবং আমি মনে করি এই জাদুটি getAttribute এর আচরণের কারণে কাজ করে যা প্রকৃতপক্ষে একটি সম্পত্তি পাবে (যেমন এটি কোনও মান প্রদান করবে এমনকি "DOM এ" মান "বৈশিষ্ট্য উপস্থিত না থাকলেও):" ... যদি না সেই বৈশিষ্ট্যটি না থাকে উপস্থিত, একই ক্ষেত্রে একই নামের সাথে সম্পত্তিটির মূল্য ফেরৎ "
দ্য রেড মটর

6

getText() ওয়েবড্রাইভারের জন্য ফাংশনটি যেভাবে ব্যবহৃত হত সেভাবে কাজ করবে না, প্রটেক্টর হিসাবে এটি কাজ করার জন্য আপনাকে এটি কোনও ফাংশনে আবৃত করতে হবে এবং পাঠ্যটিকে এমন কিছু ফিরিয়ে দিতে হবে যা আমরা আমাদের প্রটেক্টর কাঠামোর জন্য করেছি যা আমরা এটিতে রেখেছি সাধারণ ফাংশন -

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

    },

এটির মাধ্যমে আপনি একটি উপাদানটির পাঠ্য থাকতে পারেন।

এটি এখনও অস্পষ্ট কিনা তা আমাকে জানান।


আমি বুঝতে পেরেছি যে আমি যদি পাঠ্যটি সরাসরি ব্যবহার করতে চাই তবে আমি ভেবেছিলাম যে প্রোটেক্টর জেসমিনকে প্যাচ করেছেন যে প্রতিশ্রুতিটি মোকাবেলা করতে পারে - সুতরাং সেই প্রত্যাশাটি (এলিমেন্ট.জেটেক্সট ()) টুএকএল কার্যকরভাবে উপাদান হিসাবে একই ছিল তারপর .getText ()। (আশা (পাঠ্য) .toEqual)। এটা কি সঠিক নয়?
পলএল

এটিও আমার কাজ করে না। আমি উপরে আমার প্রশ্নটি প্রসারিত করেছি যাতে আপনি এই ফর্ম্যাটটি দেখতে পারেন।
পলএল

(by.locator ( 'ABC') উপাদান ব্যবহারের চেষ্টা getText () তারপর (ফাংশন (পাঠ্য) {console.log (পাঠ্য) আশা (পাঠ্য) .toEqual (
vdrulerz

এটি প্রতিবেদন করেছে যে অবজেক্ট [অবজেক্ট অবজেক্ট] এর কোনও পদ্ধতি 'লোকেটার' নেই। আমি 'বাই.লোকেটর' এর প্রটেক্টর এপিআইতে কোনও পদ্ধতি দেখতে পাচ্ছি না, এবং আমি কোডটিতে একটিও দেখতে পাচ্ছি না - এবং অবশ্যই যদি বাই.লোকেটর পদ্ধতি ছিল তবে এটি 'বাই'র মতো কিছু হতে পারে। লোকেটার ('মডেল', 'রিস্ক.নাম') '?
পলএল

বাই.লোকেটরের সাহায্যে আপনি বোঝাতে চেয়েছিলেন যে আপনি প্রোটফিনডিলমেন্ট (বাই.আইডি), সিএসএস, এক্সপথ বা কোনও লোকেটর অ্যাট্রিবিউট এর মতো কিছু ব্যবহার করতে পারেন .... যদি এটি এখনও কাজ না করে তবে আপনার কোড এবং এইচটিএমএল বৈশিষ্ট্যগুলি আমার সাথে ভাগ করুন ... অবশ্যই আপনাকে সাহায্য করুন ...
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 ব্যবহার করতে পারেন (আমার জন্য ভাল কাজ করুন), চিত্র বিশদটি দেখুন check

কোড:

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

এই কোডটি আপনার কোডটিতে প্রবেশ করুন। চিত্র বিশদ:

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.