Как getText на входе в транспортир
В документации для транспортира я вижу следующий пример:
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');
});
Здесь ясно, что вы можете использовать "by.model" для установки значений в поле ввода, но если вы хотите посмотреть окно ввода и посмотреть, что в нем, вам нужно использовать "by.binding",.
У меня есть набор кода, где (в резюме) я делаю:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.model('risk.name')).getText()).toEqual('A value');
(в моем реальном коде я сохраняю объект, а затем возвращаюсь к нему в режиме редактирования, и я проверяю, что моя ценность была фактически сохранена. Но все равно сводится к тому же, и этот пример кода дает ту же проблему).
Это дает мне ошибку:
Error: Expected '' to equal 'A value'.
В теории, следуя примеру из документов, я могу вместо этого сделать:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('risk.name)).getText()).toEqual('A value');
Но привязка по-видимому не похожа на полностью квалифицированную модель, я получаю сообщение об ошибке:
Error: No element found using locator: by.binding("risk.name")
Он работает (после моды), если я это делаю:
element(by.model('risk.name')).sendKeys('A value');
expect(element(by.binding('name')).getText()).toEqual('A value');
Это находит элемент, но также дает предупреждение, что у меня есть более одного элемента, который соответствует "name". И, к сожалению, тот, который он выбирает, не является правильным.
Итак, два вопроса:
- Если метод by.model может возвращать getText(), или есть дизайнерское решение, что он этого не делает, и нам нужно вместо этого использовать by.binding?
- Должен ли я использовать полностью привязанный объект в каталоге by.binding, или есть дизайнерское решение, которое by.binding не нравится полное имя модели? Если да, то какой другой квалификатор я могу использовать для выбора между моими разными привязками?
EDIT:
Я также попробовал решение, предложенное vdrulerz, я изменил код следующим образом:
element(by.model('risk.name')).getText().then(function(text) {
console.log(text);
expect(text).toEqual('A risk name');
});
Консоль .log возвращает пустое значение (не обещание или объект), и ожидание не дает сообщение:
Expected '' to equal 'A risk name'.
Мое понимание заключается в том, что транспортир уже исправляет ожидаемый ответ на обещание, поэтому я чувствую, что основная проблема заключается в том, что getText не работает в поле, идентифицированном с помощью модели (я могу успешно getText на ярлыках и других виджетах).
Я также могу запустить следующий код, используя getAttribute, а не 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');
});
Первая часть проходит - ожидание работает. Вторая часть также работает, предполагая, что синтаксис vdrulerz также действителен, и он записывает "true" на консоль. Я думаю, что есть потенциальный дефект с getText?
Ответы
Ответ 1
Это ответ на часто задаваемые вопросы в Protractor: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always-empty
Результат getText из входного элемента всегда пуст
Это quirk webdriver. и элементы всегда имеют пустые значения getText. Вместо этого попробуйте:
element.getAttribute('value')
Что касается вопроса 2, да, вы должны иметь возможность использовать полное имя для .binding. Я подозреваю, что на вашем шаблоне нет элемента, связанного с risk.name через {{}} или ng-bind.
Ответ 2
getText()
функция не будет работать так же, как и для webdriver, чтобы заставить ее работать для транспортира, вам нужно будет обернуть ее в функцию и вернуть текст, как мы это делали для нашей структуры транспортира мы сохранили его в общей функции, например -
getText : function(element, callback) {
element.getText().then (function(text){
callback(text);
});
},
При этом вы можете иметь текст элемента.
Сообщите мне, если это все еще неясно.
Ответ 3
У меня была эта проблема, я попробовал решение Jmr, но для меня это не сработало. Поскольку все поля ввода имеют атрибуты ng-model, я мог бы вытащить атрибут и оценить его и получить значение.
HTML
<input ng-model="qty" type="number">
транспортира
var qty = element( by.model('qty') );
qty.sendKeys('10');
qty.evaluate(qty.getAttribute('ng-model')) //-> 10
Ответ 4
Вы можете попробовать что-то вроде этого
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;
});
}
Чем вы можете назвать эту функцию, где хотите получить значение.
Ответ 5
Этот код работает. У меня есть поле ввода даты, которое было настроено только на чтение, которое заставляет пользователя выбирать из календаря.
для даты начала:
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);
для даты окончания:
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);
Ответ 6
ниже код работает для меня, для получения текста с ввода
return(this.webelement.getAttribute('value').then(function(text)
{
console.log("--------" + text);
}))
Ответ 7
Вы можете использовать jQuery для получения текста в текстовом поле (хорошо работайте для меня), проверьте детали изображения
код:
$(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()
Внесите этот вышеприведенный запрос в ваш код. Детали изображения:
![введите описание изображения здесь]()