angularjs - reactivos - tablas angular 4
Cómo obtener texto en una entrada en transportador (8)
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é contiene, debe usar "by.binding".
Tengo un conjunto de códigos 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 comprobando que mi valor se haya guardado realmente. Pero aún se reduce a lo mismo, y este código muestra 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:
element(by.model(''risk.name'')).sendKeys(''A value'');
expect(element(by.binding(''risk.name)).getText()).toEqual(''A value'');
Pero el by.binding no parece gustarle al modelo completamente calificado, me sale un error:
Error: No element found using locator: by.binding("risk.name")
Funciona (después de una moda) 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 da una advertencia de que tengo más de un elemento que coincide con ''nombre''. Y desafortunadamente, el que elige no es el correcto.
Entonces, dos preguntas:
- ¿Debería el by.model ser capaz de devolver un getText (), o hay una decisión de diseño que no lo haga y necesitamos usar by.binding en su lugar?
- ¿Debo poder utilizar una entidad totalmente calificada en el by-binding, o hay una decisión de diseño que 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 el esperado falla al dar el mensaje:
Expected '''' to equal ''A risk name''.
Tengo entendido que el transportador ya arregla la espera para cumplir 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 obtener texto 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 - las obras esperadas. 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 hay un posible defecto con getText?
Debe usar Promise para imprimir o almacenar valores de 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
});
El código siguiente funciona para mí, para obtener texto de entrada
return(this.webelement.getAttribute(''value'').then(function(text)
{
console.log("--------" + text);
}))
Este código funciona Tengo un campo de entrada de fecha que se ha configurado para leer solo, lo que obliga al usuario a seleccionar desde el calendario.
para una fecha de inicio:
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);
para una fecha de finalización:
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);
Esto se responde en las preguntas frecuentes de Protractor: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always-empty
El resultado de getText de un elemento de entrada siempre está vacío
Esta es una peculiaridad de Webdriver. y los elementos siempre tienen valores de getText vacíos. En cambio, intente:
element.getAttribute(''value'')
En cuanto a la pregunta 2, sí, debería poder usar un nombre completo para by.binding. Sospecho que su plantilla en realidad no tiene un elemento que esté vinculado a risk.name a través de {{}} o ng-bind.
Puede usar jQuery para obtener texto en el cuadro de texto (me funciona bien), verifique el detalle de la imagen
Código:
$(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()
Inyecta la consulta anterior a tu código. Detalle de la imagen:
Tuve este problema, probé la solución de Jmr, pero no funcionó. Como todos los campos de entrada tienen atributos ng-model, pude extraer el atributo y evaluarlo y obtener el valor.
HTML
<input ng-model="qty" type="number">
Transportador
var qty = element( by.model(''qty'') );
qty.sendKeys(''10'');
qty.evaluate(qty.getAttribute(''ng-model'')) //-> 10
getText()
función getText()
no funcionará como solía ser para webdriver, con el fin de que funcione para el transportador tendrá que envolverlo en una función y devolver el texto algo así como lo hicimos para nuestro marco transportador que hemos mantenido en una función común como -
getText : function(element, callback) {
element.getText().then (function(text){
callback(text);
});
},
Por esto puedes tener el texto de un elemento.
Avíseme si todavía no está claro.
Puedes probar algo como esto
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;
});
}
Entonces puedes llamar a esta función donde quieras obtener el valor.