Appium+Node.js+Mocha. Как заполнить текстовое поле в случае, если оно не содержит нужный текс?

appium
nodejs
mocha
Теги: #<Tag:0x00007fedc02528c0> #<Tag:0x00007fedc0252690> #<Tag:0x00007fedc0252208>

(Dez Dezsson) #1

Привет!
Столкнулся с проблемой при написании теста в связке Appium+Node.js+Mocha
Есть текстовое поле c id="com.my.app:id/user". Это поле может быть либо пустым либо заполненным.
Нужно проверить, что если поле заполнено нужным мне текстом - то тест идет дальше, если же нет - то поле очищаем и затем заполняем нужным текстом.

Пробовал такой вариант:

    wd.addElementPromiseChainMethod('enterText', function(txt) {
      return this.text()
       .then(function(cur_text) {
          console.log('Current text is ' + cur_text);
          if (cur_text != txt) {
            this.then(function() {
              this.clear().setText(txt);})
        }});
    });

Затем вызывал через
.elementById("com.my.app:id/user").enterText('name')
Получил

Cannot read property 'then' of undefined

Пробовал и такое

    .elementById("com.my.app:id/user")
        .text().should.not.be.equal('username')
        .then(function(el){
          el.clear();
          el.setText('username');})
        .catch(function(el){ return el;})

Получил

TypeError: driver.elementById(...).text(...).should.not.be.equal(...).then is not a function

Вобщем проблема в том что я новичек в Аппиуме, в Ноде и в промисах((
Гуру, помогите, поставте на правильный путь)
Спасибо!


(Stan) #2

А зачем использовать промисы если не знаешь что это?) просто получаете текст, в колбэке проверяете его и если ничего нет там же добавляете.

PS отформатируйте код нормально


(Dez Dezsson) #3

Спасибо за отклик!
Согласен что использование промисов было дурацкой затеей. Просто пример с промисами был в code_samples для appium, вот и решил попробовать сделать что-то похожее.
Может быть вы посоветуете какую-либо литературу для связки Appium+Node.js?


(Dez Dezsson) #4

Решил вот таким способом:

driver
.elementById("com.my.app:id/user").textPresent(username)
.then(function(present){
    return (present)?driver.elementById("com.my.app:id/user"):driver.elementById("com.my.app:id/user").clear().setText(username);
})

Есть ли тут какие-нибудь подводные камни, которые я упустил?


(Dez Dezsson) #5

Теперь вот мозгую как это обернуть в метод, который можно было бы использовать с другими элементами.
Написал вот такое

wd.addElementPromiseMethod('enterText', function(txt) {
  this.textPresent(txt)
        .then(function(present){
          return (present)?this:this.clear().setText(txt);
        })
});

Но упорно не хочет вводить нужный текст, хотя в else ветку заходит.
Помогите пожалуйста кто разбирается


(brbrr) #6

Я слабо знаком с js, но все таки мне кажется что вы что-то мудрите слишком. напишу на псевдо коде как бы сделал сам:

var text_field = wd.findElementByID('el_ID');
if (text_field.value != 'Expected text') {
  text_field.setText('Required text')
}

обернуть это в функцию думаю понятно как

Так же хочу подчеркнуть, что текст в текстовом поле находится в атрибуте value, а не text как в div-aх например.