En la documentación del transportador, veo el siguiente ejemplo:
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');
});
Lo que parece claro aquí es que puede usar "by.model" para establecer valores en un cuadro de entrada, pero si desea ver un cuadro de entrada y ver qué hay en él, debe usar "by.binding".
Tengo un conjunto de código donde (en resumen) hago:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');
(en mi código real guardo la entidad y luego vuelvo a ella en modo de edición, y estoy verificando que mi valor se haya guardado realmente. Pero aún se reduce a lo mismo, y este código de muestra da el mismo problema).
Esto me da un error:
Error: Expected '' to equal 'A value'.
En teoría, siguiendo el ejemplo de los documentos, puedo hacer en su lugar:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');
Pero al by.binding no parece gustarle el modelo totalmente calificado, aparece un error:
Error: No element found using locator: by.binding("risk.name")
Funciona (de alguna manera) si lo hago:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');
Esto encuentra un elemento, pero también advierte que tengo más de un elemento que coincide con 'nombre'. Y, lamentablemente, el que elige no es el correcto.
Entonces, dos preguntas:
- ¿Debería by.model poder devolver un getText (), o hay una decisión de diseño de que no lo haga y que necesitemos usar by.binding en su lugar?
- ¿Debo poder usar una entidad totalmente calificada en by.binding, o hay una decisión de diseño que a by.binding no le gusta el nombre completo del modelo? Si es así, ¿qué otro calificador puedo usar para seleccionar entre mis diferentes enlaces?
EDITAR:
También probé la solución sugerida por vdrulerz, modifiqué el código de la siguiente manera:
element(by.model('risk.name')).getText().then(function(text) {
console.log(text);
expect(text).toEqual('A risk name');
});
Console.log está devolviendo un valor en blanco (no una promesa o un objeto), y la expectativa falla dando el mensaje:
Expected '' to equal 'A risk name'.
Tengo entendido que el transportador ya parchea la expectativa de lidiar con la promesa, por lo que creo que el problema subyacente es que getText no funciona en un campo identificado a través de un modelo (puedo getText con éxito en etiquetas y otros widgets).
También puedo ejecutar el siguiente código, usando getAttribute en lugar de 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 primera parte pasa, lo esperado funciona. La segunda parte también funciona, lo que sugiere que la sintaxis de vdrulerz también es válida, y registra "verdadero" en la consola. Creo que existe un defecto potencial con getText.