2015-09-23 2 views
1

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

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

Проблема заключается в том, что скрипт, который я написал, приводит к нажатию всех выбранных-selects и THEN вводят ключи. Это означает, что текст вводится только в окончательный выбранный выбор.

Я вставил паузу() после нажатия на элемент. Я ожидаю, что пауза произойдет после каждого щелчка, но вместо этого пауза происходит только в конце, когда нажимается последний элемент, и все ключи набираются в конце, так что последний элемент имеет значение '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 

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

ответ

1

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

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

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

Спасибо, вы правы, когда пауза возвращает обещание. Однако я все еще не решил свою проблему. Я работаю над этим и обновляю свой вопрос, как только выясню это. – mags

0

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

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

    }); 

 Смежные вопросы

  • Нет связанных вопросов^_^