Як отриматиText на вході в транспортир


105

У документації на транспортир я бачу такий приклад:

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');

Але, здається, що by.binding не подобається повністю кваліфікованій моделі, я отримую помилку:

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'. І на жаль, той, який він вибирає, не є правильним.

Отже, два питання:

  1. Чи має бути by.model повернути getText (), чи є проектне рішення, що цього не робити, і нам потрібно використовувати by.binding?
  2. Чи повинен я мати можливість використовувати повністю кваліфіковану сутність у by.binding, чи є проектне рішення, яке by.binding не любить повну назву моделі? Якщо так, то який інший класифікатор я можу використовувати для вибору між різними прив'язками?

Редагувати:

Я також спробував рішення, запропоноване vdrulerz, я змінив код наступним чином:

element(by.model('risk.name')).getText().then(function(text) {
  console.log(text);
  expect(text).toEqual('A risk name');  
});

Console.log повертає порожнє значення (не обіцянку чи об'єкт), і очікування не дає повідомлення:

Expected '' to equal 'A risk name'.

Я розумію, що транспортир вже виправляє очікування на вирішення обіцянки, тому я відчуваю, що основна проблема полягає в тому, що getText не працює над полем, визначеним через модель (я можу успішно отриматиText на мітках та інших віджетах).

Я також можу запустити наступний код, використовуючи 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?

Відповіді:


202

На це відповідає відповідь у FAQ щодо транспортира: https://github.com/angular/protractor/blob/master/docs/faq.md#the-result-of-gettext-from-an-input-element-is-always- порожній

Результат getText від елемента вводу завжди порожній

Це химерність веб-драйвера. а елементи завжди мають порожні значення getText. Натомість спробуйте:

element.getAttribute('value')

Що стосується питання 2, так, ви повинні мати можливість використовувати повністю кваліфіковане ім'я для by.binding. Я підозрюю, що у вашому шаблоні насправді немає елемента, який пов'язаний із ризиком.name через {{}} або ng-bind.


Ах, я думав, що шукав всюди, в тому числі шукав. І я щойно підняв це як питання про транспортувальний github сьогодні, виходячи з того, що не знайшов відповіді. Набридати. Мій елемент пов'язаний з ng-моделлю, тому в html він має "ng-model =" risk.name "". Але це може бути не тим, що потрібно, щоб воно працювало. Я запропоную оновити doco, щоб запропонувати використовувати getAttribute.
PaulL

1
Додаючи це для нащадків, оскільки я щойно витратив занадто багато часу, щоб зрозуміти це: getAttribute фактично повертає обіцянку, а не рядок. github.com/angular/protractor/isissue/673
нудьга

І я думаю, що ця магія спрацьовує через поведінку getAttribute, яка фактично отримає властивість (тобто це поверне значення, навіть якщо атрибут "value" не присутній у вашому DOM): "..., якщо цей атрибут не є тепер, у такому разі повертається вартість майна з такою ж назвою "
The Red Pea

6

getText() Функція не працюватиме так, як це було раніше для веб-драйвера, для того, щоб змусити її працювати для транспортира, вам потрібно буде загорнути його у функцію і повернути текст так, як ми це зробили для нашої рамки транспортування. Ми зберегли його в загальна функція, як -

getText : function(element, callback) {
        element.getText().then (function(text){             
            callback(text);
         });        

    },

Цим ви можете мати текст елемента.

Повідомте мене, якщо це все ще незрозуміло.


Я розумію, що мені потрібно це зробити, якщо я хочу використовувати текст безпосередньо, але я подумав, що Protractor виправляв очікувачі, що очікують Жасмін, щоб розібратися з обіцянкою - так що очікувати (element.getText ()). .getText (). тоді (очікувати (текст) .toEqual). Це не правильно?
PaulL

Це також не працює для мене. Я продовжив своє запитання вище, щоб ви могли бачити це відформатованим.
PaulL

спробуйте використовувати елемент (by.locator ('abc'). getText (). тоді (функція (текст) {console.log (текст) очікувати (текст) .toEqual ("деякий текст");});
vdrulerz

Він повідомляє, що у Object [object Object] немає методу "locator". Я не бачу методу в aptractor api 'by.locator', і я не можу його побачити в коді - і, звичайно, якби був метод by.locator, то це було б щось на зразок 'by. локатор ('модель', 'risk.name') '?
PaulL

З by.locator я мав на увазі, що ви можете використовувати щось на зразок prot.findelement (By.id), CSS, Xpath або будь-який атрибут локатора .... якщо він все ще не працює, поділіться зі мною атрибутами коду та html ... допомогти вам ...
vdrulerz

2

У мене була ця проблема, я спробував рішення 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

0

Цей код працює. У мене є поле введення дати, яке встановлено лише для читання, що змушує користувача вибрати з календаря.

для дати початку:

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);

0

нижче код працює для мене, щоб отримати текст із введення

return(this.webelement.getAttribute('value').then(function(text)
    {
        console.log("--------" + text);
}))

0

Ви повинні використовувати Promise для друку або збереження значень елемента.

 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

                    });

-1

Можна спробувати щось подібне

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;
            });
        }

Тоді ви можете викликати цю функцію там, де ви хочете отримати значення ..


-3

Ви можете використовувати 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()

Вставте цей вище запит у свій код. Деталі зображення:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.