Na documentação do transferidor, vejo o seguinte exemplo:
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');
});
O que parece claro aqui é que você pode usar "by.model" para definir valores em uma caixa de entrada, mas se quiser olhar para uma caixa de entrada e ver o que há nela, você precisa usar "by.binding".
Eu tenho um conjunto de códigos onde (em resumo) eu faço:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');
(em meu código real, salvo a entidade e depois volto a ela no modo de edição e estou verificando se meu valor foi realmente salvo. Mas ainda assim se resume à mesma coisa, e este código de amostra apresenta o mesmo problema).
Isso me dá um erro:
Error: Expected '' to equal 'A value'.
Em teoria, seguindo o exemplo dos documentos, posso fazer:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');
Mas o by.binding não parece gostar do modelo totalmente qualificado, recebo um erro:
Error: No element found using locator: by.binding("risk.name")
Funciona (depois de uma moda) se eu:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');
Isso encontra um elemento, mas também avisa que tenho mais de um elemento que corresponde a 'nome'. E, infelizmente, aquele que ele escolhe não é o certo.
Então, duas perguntas:
- O by.model deve ser capaz de retornar getText () ou há uma decisão de design de que ele não faça isso e precisamos usar by.binding em vez disso?
- Devo ser capaz de usar uma entidade totalmente qualificada no by.binding ou há uma decisão de design que o by.binding não gosta do nome completo do modelo? Em caso afirmativo, que outro qualificador posso usar para selecionar entre minhas diferentes ligações?
EDITAR:
Também tentei a solução sugerida por vdrulerz, modifiquei o código da seguinte maneira:
element(by.model('risk.name')).getText().then(function(text) {
console.log(text);
expect(text).toEqual('A risk name');
});
O console.log está retornando um valor em branco (não uma promessa ou um objeto), e o expect falha ao fornecer a mensagem:
Expected '' to equal 'A risk name'.
Meu entendimento é que o transferidor já corrige a expectativa para lidar com a promessa, então sinto que o problema subjacente é o getText não funcionar em um campo identificado por meio de um modelo (posso obter o texto em rótulos e outros widgets).
Também posso executar o seguinte código, usando getAttribute em vez 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');
});
A primeira parte passa - a expectativa funciona. A segunda parte também funciona, sugerindo que a sintaxe de vdrulerz também é válida e registra 'true' no console. Eu acho que há um defeito potencial com getText?