webdriver.IO异步问题-点击一个元素,然后输入文本
webdriver.io async issues - clicking on an element and then entering text
我试图在我的自动化测试脚本中解释"选择的选择"。我正在使用webdriver。io并引用以下API信息:http://webdriver.io/api.html
我需要点击"a.s chosen-single",这在"selected"世界中等于用户点击进入选择。这将使用户专注于文本输入(这允许用户通过选择选项进行过滤,因此为什么选择很酷),然后我需要模拟用户输入文本。
问题是,我写的脚本结果在所有选择被点击,然后键被输入。这意味着它们的文本只会被输入到最终的选择输入中。
我在元素被点击后插入了一个pause()。我希望每次单击后都发生暂停,但相反,暂停只发生在最后一个元素被单击时,并且所有元素的键都在末尾键入在一起,因此最后一个元素的值为'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
我不知道如何确保下一个任务在输入按键之前不会排队。请帮助。
pause
它自己返回一个promise,所以你应该在pause
回调返回之后在pause
上调用then
来执行block
this.pause(1000).then(function() {
this.keys(fields[selectName])
//press enter to finalize selection
//.keys(''uE007')
console.log('keys pressed');
});
我终于回答了自己的问题。问题是我正在使用for(){}循环来遍历我想要填充的不同字段。for(){}循环执行每个命令,而不等待给定的选择完成正确的值设置(单击选择,键入值,按enter键)。我通过收集选择器和值来解决这个问题,将它们存储在函数中,并将每个完整的函数添加到队列中。然后,我一次一个地执行每个函数,在函数之前的"keys"命令的"then"回调中调用下一个函数(因此,在按下enter键后调用下一个函数)。我使用了一个迭代器来获取队列中的每个next函数。任何有兴趣的人都可以检查我的代码和评论任何问题的建议。谢谢!
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 + '¤cyId=' + params.currencyId + '&debug=nocache')
.then(function(result) {
fillFields(this, fields);
});
相关文章:
- 使用clickToggle并在单击另一个元素时关闭元素
- 表追加而不附加最后一个元素
- 滚动到容器中的下一个元素-几乎到了
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- 使用CSS或js,使用动态选择器选择任意li的下一个元素
- 按我自己的类克隆另一个元素的内容和顺序
- Javascript获取上一个元素的内容
- 如何通过HTML+CSS中的另一个元素Selector更改元素的属性值
- 在数组中的一个元素上设置多个值
- 指令的模板必须只有一个根元素:With restrict E&替换true
- HTML JavaScript,我如何能够通过给每个元素一个不同的Id来使用JavaScript使这个函数工作
- 如何创建一个独立的 DOM 元素?一个不从父母那里继承 css 等
- 如何给图像元素一个“;选择“;使用Raphael.js查看
- 如何显示隐藏的
- 元素一个接一个或全部同时
- 使用"span"创建一个自定义的基于web的文本编辑器;元素——一个坏主意
- 引导旋转木马传递元素一个接一个
- 给所有元素一个匹配数组内容的ID
- 我如何得到Json数组元素一个接一个的jquery上不同的id'
- 一次淡入附加元素一个
- 如何使用AngularJS检索外部网站的内容(一个元素一个元素)