Come ottenere il testo su un input in goniometro


105

Nella documentazione per il goniometro, vedo il seguente esempio:

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

Ciò che appare chiaro qui è che puoi usare "by.model" per impostare valori in una casella di input, ma se vuoi guardare una casella di input e vedere cosa c'è dentro, devi usare "by.binding".

Ho un set di codice dove (in sintesi) faccio:

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

(nel mio codice reale salvo l'entità, quindi ci torno in modalità di modifica e sto verificando che il mio valore sia stato effettivamente salvato. Ma si riduce comunque alla stessa cosa e questo codice di esempio dà lo stesso problema).

Questo mi dà un errore:

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

In teoria, seguendo l'esempio della documentazione, posso invece fare:

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

Ma il by.binding non sembra gradire il modello completo, ottengo un errore:

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

Funziona (in qualche modo) se lo faccio:

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

Questo trova un elemento, ma fornisce anche un avviso che ho più di un elemento che corrisponde a "nome". E sfortunatamente quello che sceglie non è quello giusto.

Quindi, due domande:

  1. Il by.model dovrebbe essere in grado di restituire un getText (), o c'è una decisione di progettazione che non lo faccia e dobbiamo usare by.binding invece?
  2. Devo essere in grado di utilizzare un'entità pienamente qualificata in by.binding o c'è una decisione di progettazione a cui by.binding non piace il nome completo del modello? In tal caso, quale altro qualificatore posso utilizzare per selezionare tra i miei diversi attacchi?

MODIFICARE:

Ho provato anche la soluzione suggerita da vdrulerz, ho modificato il codice come segue:

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

Console.log restituisce un valore vuoto (non una promessa o un oggetto) e l'aspettativa non riesce a fornire il messaggio:

Expected '' to equal 'A risk name'.

La mia comprensione è che il goniometro corregge già l'aspettativa di gestire la promessa, quindi sento che il problema sottostante è il getText che non funziona su un campo identificato tramite un modello (posso ottenere con successo il testo su etichette e altri widget).

Posso anche eseguire il seguente codice, usando getAttribute invece di 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');  
});

La prima parte passa - l'aspettativa funziona. Anche la seconda parte funziona, suggerendo che anche la sintassi di vdrulerz è valida e registra "true" nella console. Penso che ci sia potenzialmente un difetto con getText?

Risposte:


202

Questa è una risposta nelle FAQ del goniometro: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always- vuoto

Il risultato di getText da un elemento di input è sempre vuoto

Questa è una stranezza del webdriver. e gli elementi hanno sempre valori getText vuoti. Prova invece:

element.getAttribute('value')

Per quanto riguarda la domanda 2, sì, dovresti essere in grado di utilizzare un nome completo per by.binding. Sospetto che il tuo modello non abbia effettivamente un elemento associato a risk.name tramite {{}} o ng-bind.


Ah, pensavo di aver cercato ovunque, compresa la ricerca. E ho appena sollevato questo problema come problema nel github del goniometro oggi sulla base del fatto che non avevo trovato una risposta. Bother. Il mio elemento è associato a ng-model, quindi ha "ng-model =" risk.name "" nell'html. Ma potrebbe non essere quello che serve per farlo funzionare. Suggerirò di aggiornare il doco per suggerire di usare getAttribute.
PaulL

1
Aggiungendo questo per i posteri visto che ho passato troppo tempo a capirlo: getAttribute restituisce effettivamente una promessa, non una stringa. github.com/angular/protractor/issues/673
boredlamer

E penso che questa magia funzioni a causa del comportamento di getAttribute, che in realtà otterrà una proprietà (cioè questo restituirà un valore anche se nessun attributo "valore" è presente nel tuo DOM): "..., a meno che quell'attributo non lo sia presente, nel qual caso viene restituito il valore della proprietà con lo stesso nome "
The Red Pea

6

getText() la funzione non funzionerà come una volta per il webdriver, per farla funzionare con il goniometro dovrai racchiuderla in una funzione e restituire il testo come abbiamo fatto per il nostro framework del goniometro, l'abbiamo tenuto in un funzione comune come -

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

    },

Con questo puoi avere il testo di un elemento.

Fammi sapere se non è ancora chiaro.


Capisco che ho bisogno di farlo se voglio usare il testo direttamente, ma ho pensato che Goniometro ha patchato il Jasmine si aspetta che i matcher si occupino della promessa, quindi aspettarsi (element.getText ()). ToEqual era effettivamente lo stesso di element .getText (). allora (si aspettano (testo) .toEqual). Non è corretto?
PaulL

Anche questo non funziona per me. Ho esteso la mia domanda sopra in modo che tu possa vedere questo formattato.
PaulL

prova a usare element (by.locator ('abc'). getText (). then (function (text) {console.log (text) wait (text) .toEqual ("sometext");});
vdrulerz

Segnala che Object [Object Object] non ha un metodo "locator". Non vedo un metodo nell'api del goniometro di "by.locator", e non riesco a vederne nemmeno uno nel codice - e sicuramente se ci fosse un metodo by.locator, sarebbe qualcosa come "by. locator ('model', 'risk.name') '?
PaulL

con by.locator volevo dire che puoi usare qualcosa come prot.findelement (By.id), CSS, Xpath o qualsiasi attributo locator ... se ancora non funziona, condividi il tuo codice e gli attributi html con me ... lo farò sicuramente aiutarti ...
vdrulerz

2

Ho avuto questo problema, ho provato la soluzione di Jmr ma non ha funzionato per me. Poiché tutti i campi di input hanno attributi ng-model, potrei estrarre l'attributo e valutarlo e ottenere il valore.

HTML

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

Goniometro

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

0

Questo codice funziona. Ho un campo di immissione della data impostato per la sola lettura che obbliga l'utente a selezionare dal calendario.

per una data di inizio:

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

per una data di fine:

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

sotto il codice funziona per me, per ottenere testo dall'input

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

0

È necessario utilizzare Promise per stampare o memorizzare i valori dell'elemento.

 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

Puoi provare qualcosa di simile

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

Quindi puoi chiamare questa funzione dove vuoi ottenere il valore ..


-3

Puoi usare jQuery per ottenere il testo nella casella di testo (funziona bene per me), controlla i dettagli dell'immagine

Codice:

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

Iniettare questa query sopra al tuo codice. Dettaglio immagine:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.