Cara getText pada input di busur derajat

105

Dalam dokumentasi busur derajat, saya melihat contoh berikut:

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

Apa yang tampak jelas di sini adalah Anda dapat menggunakan "by.model" untuk menyetel nilai dalam kotak masukan, tetapi jika Anda ingin melihat kotak masukan dan melihat apa yang ada di dalamnya, Anda perlu menggunakan "by.binding".

Saya memiliki satu set kode di mana (dalam ringkasan) saya lakukan:

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

(dalam kode asli saya, saya menyimpan entitas lalu kembali ke mode edit, dan saya memeriksa nilai saya benar-benar disimpan. Tapi intinya masih sama, dan kode contoh ini memberikan masalah yang sama).

Ini memberi saya kesalahan:

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

Secara teori, dengan mengikuti contoh dari dokumen, saya dapat melakukannya:

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

Tetapi by.binding tampaknya tidak menyukai model yang sepenuhnya memenuhi syarat, saya mendapatkan kesalahan:

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

Itu berhasil (setelah mode) jika saya melakukannya:

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

Ini menemukan sebuah elemen, tetapi juga memberikan peringatan bahwa saya memiliki lebih dari satu elemen yang cocok dengan 'nama'. Dan sayangnya yang dipilihnya bukanlah yang benar.

Jadi, dua pertanyaan:

  1. Haruskah by.model dapat mengembalikan getText (), atau apakah ada keputusan desain yang tidak melakukannya dan kita perlu menggunakan by.binding sebagai gantinya?
  2. Haruskah saya dapat menggunakan entitas yang sepenuhnya memenuhi syarat di by.binding, atau apakah ada keputusan desain bahwa by.binding tidak menyukai nama model lengkap? Jika ya, kualifikasi lain apa yang dapat saya gunakan untuk memilih di antara binding saya yang berbeda?

EDIT:

Saya juga mencoba solusi yang disarankan oleh vdrulerz, saya memodifikasi kode sebagai berikut:

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

Console.log mengembalikan nilai kosong (bukan janji atau objek), dan ekspektasi gagal memberikan pesan:

Expected '' to equal 'A risk name'.

Pemahaman saya adalah bahwa busur derajat sudah menambal harapan untuk menangani janji, jadi saya merasa bahwa masalah yang mendasarinya adalah getText tidak berfungsi pada bidang yang diidentifikasi melalui model (saya berhasil mendapatkan getText pada label dan widget lainnya).

Saya juga dapat menjalankan kode berikut, menggunakan getAttribute daripada getText ():

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

Bagian pertama berlalu - ekspektasi berhasil. Bagian kedua juga berfungsi, menunjukkan bahwa sintaks vdrulerz juga valid, dan mencatat 'true' ke konsol. Saya pikir ada potensi cacat dengan getText?

PaulL
sumber

Jawaban:

202

Ini dijawab dalam FAQ Busur Derajat: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always- kosong

Hasil getText dari elemen input selalu kosong

Ini adalah kekhasan webdriver. dan elemen selalu memiliki nilai getText kosong. Sebagai gantinya, coba:

element.getAttribute('value')

Sedangkan untuk pertanyaan 2, ya, Anda harus bisa menggunakan nama yang sepenuhnya memenuhi syarat untuk by.binding. Saya menduga bahwa template Anda tidak benar-benar memiliki elemen yang terikat pada risk.name melalui {{}} atau ng-bind.

Jmr
sumber
Ah, kupikir aku sudah mencari kemana-mana, termasuk mencarinya. Dan saya baru saja mengangkat ini sebagai masalah di busur derajat github hari ini atas dasar bahwa saya belum menemukan jawaban. Mengganggu. Elemen saya terikat dengan ng-model, sehingga memiliki "ng-model =" risk.name "" di html. Tapi itu mungkin bukan yang dibutuhkan untuk membuatnya berhasil. Saya akan menyarankan memperbarui dokumen untuk menyarankan menggunakan getAttribute.
PaulL
1
Menambahkan ini untuk anak cucu karena saya menghabiskan waktu terlalu lama untuk memikirkan ini: getAttribute sebenarnya mengembalikan sebuah janji, bukan sebuah string. github.com/angular/protractor/issues/673
boredlamer
Dan menurut saya keajaiban ini berhasil karena perilaku getAttribute, yang sebenarnya akan mendapatkan properti (yaitu ini akan mengembalikan nilai meskipun tidak ada atribut "nilai" di DOM Anda): "..., kecuali atribut itu tidak hadir, dalam hal ini nilai properti dengan nama yang sama dikembalikan "
The Red Pea
6

getText() fungsi tidak akan berfungsi seperti dulu untuk webdriver, untuk membuatnya berfungsi untuk busur derajat Anda perlu membungkusnya dalam sebuah fungsi dan mengembalikan teks seperti yang kami lakukan untuk kerangka busur derajat kami, kami telah menyimpannya di fungsi umum seperti -

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

    },

Dengan ini Anda dapat memiliki teks dari sebuah elemen.

Beri tahu saya jika masih belum jelas.

vdrulerz
sumber
Saya mengerti saya perlu melakukan itu jika saya ingin menggunakan teks secara langsung, tetapi saya pikir Protractor menambal Jasmine mengharapkan matcher untuk menangani janji - sehingga harapan (element.getText ()). ToEqual secara efektif sama dengan elemen .getText (). lalu (harapkan (teks) .toEqual). Benar bukan?
PaulL
Ini juga tidak berhasil untuk saya. Saya telah memperpanjang pertanyaan saya di atas sehingga Anda dapat melihat ini diformat.
PaulL
coba gunakan elemen (by.locator ('abc'). getText (). then (function (text) {console.log (text) expect (text) .toEqual ("sometext");});
vdrulerz
Ia melaporkan bahwa Object [Object Object] tidak memiliki metode 'locator'. Saya tidak melihat metode dalam api busur derajat 'by.locator', dan saya juga tidak bisa melihatnya di kode - dan tentunya jika ada metode by.locator maka itu akan menjadi sesuatu seperti 'oleh. locator ('model', 'risk.name') '?
PaulL
dengan by.locator maksud saya Anda dapat menggunakan sesuatu seperti prot.findelement (By.id), CSS, Xpath atau atribut locator apa pun .... jika masih tidak berfungsi, silakan bagikan kode dan atribut html Anda dengan saya ... pasti akan membantu Anda ...
vdrulerz
2

Saya memiliki masalah ini, saya mencoba solusi Jmr tetapi tidak berhasil untuk saya. Karena semua field input memiliki atribut ng-model, saya dapat menarik atribut tersebut dan mengevaluasinya dan mendapatkan nilainya.

HTML

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

Busur derajat

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

Kode ini berfungsi. Saya memiliki bidang masukan tanggal yang telah disetel ke hanya baca yang memaksa pengguna untuk memilih dari kalender.

untuk tanggal mulai:

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

untuk tanggal akhir:

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);
pengguna5817055
sumber
0

kode di bawah ini berfungsi untuk saya, untuk mendapatkan teks dari input

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

Anda harus menggunakan Promise untuk mencetak atau menyimpan nilai elemen.

 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

                    });
Pranawa Mishra
sumber
-1

Anda bisa mencoba sesuatu seperti ini

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

Daripada Anda dapat memanggil fungsi ini di mana Anda ingin mendapatkan nilainya ..

Sohel Saiyed
sumber
-3

Anda dapat menggunakan jQuery untuk mendapatkan teks di kotak teks (bekerja dengan baik untuk saya), periksa detail gambar

Kode:

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

Masukkan kueri di atas ini ke kode Anda. Detail gambar:

masukkan deskripsi gambar di sini

Dao Minh Dam
sumber