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:
- 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?
- 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?