Проблемы с асинхронным запуском webdriver.io - щелчок по элементу и последующий ввод текста

Я пытаюсь учесть «выбранные варианты» в моем сценарии автоматического тестирования. Я использую webdriver.io и имею в виду следующую информацию об API: http://webdriver.io/api.html

Мне нужно нажать на «a.chosen-single», который в «выбранном» мире равен пользователю, щелкнувшему по выбору. Это фокусирует пользователя на вводе текста (который позволяет пользователю фильтровать параметры выбора, поэтому почему выбрано круто), и мне нужно затем имитировать ввод текста пользователем.

Проблема в том, что сценарий, который я написал, приводит к щелчку по всем выбранным-выборкам и ТОГДА вводятся ключи. Это означает, что их текст вводится только в последний вход selected-select.

Я вставил паузу () после щелчка по элементу. Я бы ожидал, что пауза будет происходить после каждого щелчка, но вместо этого пауза происходит только в конце, когда щелкается последний элемент, и все ключи для всех элементов вводятся вместе в конце, так что последний элемент имеет значение 'FIL12 '

this.click(container + ' a.chosen-single').then(function(){
                console.log('clicked');
                console.log('value', fields[selectName]);
                this.pause(1000)
                this.keys(fields[selectName])
                //press enter to finalize selection
                //.keys('\uE007')

                console.log('keys pressed');
              });

Вот что я получаю в терминале:

clicked
value F
keys pressed
clicked
value IL
keys pressed
clicked
value 1
keys pressed
clicked
value 2
keys pressed

Я не могу понять, как гарантировать, что следующая задача не будет поставлена ​​в очередь, пока не будут введены нажатия клавиш. Пожалуйста помоги.


person mags    schedule 23.09.2015    source источник


Ответы (2)


pause сам возвращает обещание, поэтому вы должны вызвать then на pause, чтобы выполнить блок после возврата обратного вызова pause.

this.pause(1000).then(function() {
  this.keys(fields[selectName])
  //press enter to finalize selection
  //.keys('\uE007')

  console.log('keys pressed');
});
person berrberr    schedule 23.09.2015
comment
Спасибо, вы правы, что возвращает обещание на паузу. Однако я все еще не решил свою проблему. Я работаю над этим и обновлю свой вопрос, как только разберусь с ним. - person mags; 26.09.2015

Наконец я ответил на свой вопрос. Проблема заключалась в том, что я использовал цикл for () {} для итерации по разным полям, которые я хотел заполнить. Цикл for () {} выполнял каждую команду, не дожидаясь, пока данный выбранный выбор завершит установку с правильным значение (нажмите «Выбрать», введите значение, нажмите «Ввод»). Я решил это, собрав селектор и значение, сохранив их в функции и добавив каждую полную функцию в очередь. Затем я выполнил каждую функцию по очереди, вызывая следующую функцию в обратном вызове «then» команды 'keys' внутри функции before (таким образом, вызывая следующую функцию после нажатия клавиши ввода при последующем выбранном выборе). Я использовал итератор, чтобы захватить каждую следующую функцию в очереди. Любой желающий может проверить мой код и прокомментировать любые вопросы для предложений. Благодарность!

webdriverio = require('webdriverio');

var tester = {};

var options = {
    desiredCapabilities: {
        browserName: 'chrome'
    }
};

var params = {
  //editing this out because info is private
};

//changing the fields because info is private
var fields = {
testField: 'John Smith', 
testSelect: 'USA'

};

var execQueue = [];


var wrapFunction = function(fn, context, params) {
    return function() {
        fn.apply(context, params);
    };
};



function fillFields(driver, fields){
driver.iter = 0;
  driver.elements('select + .chosen-container').then(function(result){
    console.log('how many selects', result.value.length);
    tester.totalSelects = result.value.length;
  });

  //loop through all selects and inputs
 for(property in fields){
    var p = property;
    //closure to preserve value of property
    (function(p){
      //if chosen input then choose from list
     driver.isExisting('div.' + p + ' .chosen-results').then(function(result){

       if(result === true){

        driver.elements('div.' + p + ' select').then(function(result){
          //loop through each select (expiration date has two selections in one container)
          for(var i=0;i<result.value.length;i++){
            var s = result.value[i].ELEMENT;

            //closure
            (function(s){

            //find the name of each select
            driver.elementIdAttribute(s,'name').then(function(result){
              //find the chosen container after select
              var container = 'select[name=' + result.value + '] + .chosen-container';

              var selectName = result.value;
              //find corresponding a.chosen-single

              //this.debug()
              //click on a.chosen-single to activate chosen drop

              var qfunction = function(link, value){
                console.log('#################in qu function ###########', value);
                driver.click(link).then(function(){
                      this.keys([value, '\uE007']).then(function(){
                       driver.iter++;
                        execQueue[driver.iter]();
                      });//end keys.then


                });//end click.then
              }//end qfunction



              execQueue.push(wrapFunction(qfunction, this, [container + ' a.chosen-single', fields[selectName]]));//end push


             if(execQueue.length == tester.totalSelects - 1){
              console.log('**********equal');

                  execQueue[driver.iter]();
              }//end if equal


              console.log('queue so far', execQueue.length);


            });//end elementIdAttribute


            })(s);//end closure



          }//end for selects in container



        });//end driver.elements




        }else{

         driver.addValue('input[name=' + p + ']', fields[p]);


        }

      })//end driver.isExisting


    })(p);




  }//end for each field


};//end fillFields



webdriverio
  .remote(options)
  .init()
  .url('https://' + params.domain + '/' + params.clientId + '/?scope=' + params.scope +  '&cart=' + params.cart + '&cfg=' + params.cfg + '&progress=' + params.progress + '&language=' + params.language + '&currencyId=' + params.currencyId + '&debug=nocache') 
  .then(function(result) {

    fillFields(this, fields);

  });
person mags    schedule 26.09.2015