İletki içindeki bir girişte metin nasıl alınır


105

İletki belgelerinde aşağıdaki örneği görüyorum:

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

Burada açıkça görünen şey, bir giriş kutusunda değerleri ayarlamak için "by.model" i kullanabileceğinizdir, ancak bir giriş kutusuna bakmak ve içinde ne olduğunu görmek istiyorsanız, "by.binding" kullanmanız gerekir.

(Özet olarak) yaptığım bir dizi kodum var:

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

(gerçek kodumda varlığı kaydederim, ardından düzenleme modunda ona geri dönerim ve değerimin gerçekten kaydedilmiş olduğunu kontrol ederim. Ama yine de aynı şeyi gösterir ve bu örnek kod aynı sorunu verir).

Bu bana bir hata veriyor:

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

Teorik olarak, dokümanlardaki örneği takip ederek, bunun yerine yapabilirim:

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

Ancak by.binding, tam nitelikli modeli beğenmiyor, bir hata alıyorum:

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

Yaparsam işe yarıyor (bir modadan sonra):

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

Bu bir öğe bulur, ancak aynı zamanda 'ad' ile eşleşen birden fazla öğem olduğuna dair bir uyarı verir. Ve maalesef seçtiği doğru olanı değil.

Öyleyse, iki soru:

  1. By.model bir getText () döndürebilmeli mi, yoksa bunu yapmayacağına ve bunun yerine by.binding kullanmamız gerektiğine dair bir tasarım kararı var mı?
  2. By.binding'de tam nitelikli bir varlık kullanabilmeli miyim, yoksa by.binding'in tam model adını beğenmediği bir tasarım kararı var mı? Öyleyse, farklı bağlamalarım arasında seçim yapmak için başka hangi niteleyiciyi kullanabilirim?

DÜZENLE:

Vdrulerz tarafından önerilen çözümü de denedim, kodu aşağıdaki gibi değiştirdim:

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

Console.log boş bir değer döndürüyor (bir söz veya bir nesne değil) ve bekleme mesajı vermeyi başaramıyor:

Expected '' to equal 'A risk name'.

Anladığım kadarıyla iletki, vaatle başa çıkma beklentisini zaten yamalıyor, bu yüzden temel sorunun, getText'in bir model aracılığıyla tanımlanan bir alanda çalışmaması olduğunu hissediyorum (etiketler ve diğer gereçler üzerinde başarılı bir şekilde Metin alabilirim).

GetText () yerine getAttribute kullanarak aşağıdaki kodu da çalıştırabilirim:

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

İlk bölüm geçer - beklenen işler. İkinci bölüm de çalışır, vdrulerz 'sözdiziminin de geçerli olduğunu ve konsola' true 'kaydettiğini gösterir. GetText ile ilgili potansiyel bir kusur olduğunu düşünüyorum.

Yanıtlar:


203

Bu, Açıölçer SSS bölümünde yanıtlanmıştır: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always- boş

Bir giriş öğesinden getText sonucu her zaman boştur

Bu bir web sürücüsü tuhaflığıdır. ve öğeler her zaman boş getText değerlerine sahiptir. Bunun yerine şunu deneyin:

element.getAttribute('value')

2. soruya gelince, evet, by.binding için tam nitelikli bir ad kullanabilmelisiniz. Şablonunuzun aslında {{}} veya ng-bind yoluyla risk.name'ye bağlı bir öğeye sahip olmadığından şüpheleniyorum.


Ah, aramak dahil her yere baktığımı düşündüm. Ve bugün bir cevap bulamadığım için bunu iletki github'da bir sorun olarak gündeme getirdim. Zahmet. Öğem ng-modeline bağlı, dolayısıyla html'de "ng-model =" risk.name "" var. Ancak işe yaraması için gereken şey bu olmayabilir. GetAttribute kullanımını önermek için doco'yu güncellemenizi önereceğim.
PaulL

1
Bunu anlamak için çok uzun zaman harcadığım için bunu gelecek nesiller için eklemek: getAttribute aslında bir söz verir, bir dizi değil. github.com/angular/protractor/issues/673
boredlamer

Ve bu sihrin aslında bir özelliği alacak olan getAttribute davranışı nedeniyle işe yaradığını düşünüyorum (yani bu, DOM'nuzda "değer" özelliği olmasa bile bir değer döndürür): "..., bu özellik yoksa mevcut, bu durumda aynı ada sahip mülkün değeri iade edilir "
The Red Pea

6

getText() işlevi, webdriver için eskisi gibi çalışmayacaktır, iletki için çalışmasını sağlamak için onu bir işleve sarmanız ve iletki çerçevemiz için yaptığımız gibi metni geri göndermeniz gerekir. gibi ortak işlev -

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

    },

Bununla bir elemanın metnine sahip olabilirsiniz.

Hâlâ net değilse bana bildirin.


Metni doğrudan kullanmak istiyorsam bunu yapmam gerektiğini anlıyorum, ancak İletki'nin Jasmine'e eşleştiricilerin sözle başa çıkmasını beklediğini düşündüm - böylece wait (element.getText ()). ToEqual aslında element ile aynıydı .getText (). sonra ((text) .toEqual bekliyoruz). Bu doğru değil mi?
PaulL

Bu da benim için çalışmıyor. Yukarıdaki sorumu, biçimlendirilmiş olarak görebilmeniz için genişlettim.
PaulL

öğeyi kullanmayı deneyin (by.locator ('abc'). getText (). sonra (function (metin) {console.log (metin) bekleme (metin) .toEqual ("sometext");});
vdrulerz

Nesnenin [nesne Nesnesi] 'konumlandırıcı' yöntemine sahip olmadığını bildirir. 'By.locator' iletki api'sinde bir yöntem görmüyorum ve kodda da bir tane göremiyorum - ve kesinlikle bir by.locator yöntemi varsa, o zaman 'by. bulucu ('model', 'risk.name') '?
PaulL

by.locator ile prot.findelement (By.id), CSS, Xpath veya herhangi bir yer belirleyici niteliği gibi bir şey kullanabileceğinizi kastettim .... hala çalışmıyorsa, plz kodunuzu ve html niteliklerinizi benimle paylaşın ... kesinlikle sana yardım et ...
vdrulerz

2

Bu sorunu yaşadım Jmr'nin çözümünü denedim ancak benim için işe yaramadı. Tüm girdi alanlarının ng modeli öznitelikleri olduğundan özniteliği alıp değerlendirip değeri alabilirim.

HTML

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

İletki

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

0

Bu kod çalışıyor. Kullanıcıyı takvimden seçim yapmaya zorlayan, salt okunur olarak ayarlanmış bir tarih giriş alanım var.

başlangıç ​​tarihi için:

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

bir bitiş tarihi için:

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

Aşağıdaki kod benim için çalışıyor, girişten metin almak için

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

0

Element değerlerini yazdırmak veya saklamak için Promise'ı kullanmalısınız.

 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

Bunun gibi bir şey deneyebilirsin

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

Daha sonra değeri almak istediğiniz bu işlevi çağırabilirsiniz ..


-3

Metin kutusunda metin almak için jQuery'yi kullanabilirsiniz (benim için iyi çalışın), görüntü ayrıntılarını kontrol edin

Kod:

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

Yukarıdaki sorguyu kodunuza ekleyin. Görüntü detayı:

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.