Javascript webdriver.io在重新加载页面后继续脚本
我正在用webdriver.io编写一个自动脚本,用于在网页上填写输入/选择并截图。如果一个用户操作,比如改变选择的值,会导致页面加载到自动化脚本执行的中间?有没有一种方法可以在脚本中找到您中断的地方,比如说一些输入在那个时候已经被填充了,它们通过会话数据保留了它们的值,但是您希望继续填充其余的输入 据我所知,一旦页面重新加载,脚本就会停止执行 如果无法从您停止的地方恢复,那么如何通过检测页面加载然后重新执行脚本从一开始就触发脚本 响应评论:我不认为我需要粘贴代码,虽然我会这样做,因为问题实际上是如何通过WebDr.R.IO检测页面加载,当页面加载发生在脚本执行的中间,而不是脚本本身启动的时候。 更新!!:我使用waitForExist解决了这个问题,只需等待每个输入/选择存在,然后再与之交互。这并不理想,但很有效。如果有人有更好的解决方案,请告诉我! 代码如下:Javascript webdriver.io在重新加载页面后继续脚本,javascript,selenium,selenium-webdriver,webdriver-io,Javascript,Selenium,Selenium Webdriver,Webdriver Io,我正在用webdriver.io编写一个自动脚本,用于在网页上填写输入/选择并截图。如果一个用户操作,比如改变选择的值,会导致页面加载到自动化脚本执行的中间?有没有一种方法可以在脚本中找到您中断的地方,比如说一些输入在那个时候已经被填充了,它们通过会话数据保留了它们的值,但是您希望继续填充其余的输入 据我所知,一旦页面重新加载,脚本就会停止执行 如果无法从您停止的地方恢复,那么如何通过检测页面加载然后重新执行脚本从一开始就触发脚本 响应评论:我不认为我需要粘贴代码,虽然我会这样做,因为问题实际上
webdriverio = require('webdriverio');
var tester = {};
tester.iter = 0;
var options = {
desiredCapabilities: {
browserName: 'chrome'
}
};
var params = {
[[I've removed these because it's private info]]
};
var fields = {
deliveryCompany: 'ABC Inc',
deliveryFirstname: 'John',
deliveryLastname: 'Smith',
deliveryStreet1: '123 Main St.',
deliveryCity: 'Boston',
};
var execQueue = [];
var wrapFunction = function(fn, context, params) {
return function() {
fn.apply(context, params);
};
};
var takeScreenshot = function(){
console.log('take screenshot', this);
this.saveScreenshot('./checkout.png')
.click('input.CBSubmit').then(function(value) {
this.waitForExist('#mjPaymentReview').then(function(){
this.saveScreenshot('./review.png').then(function(){
this.click('input.CBSubmit').then(function(){
this.waitForExist('#mjCartFinal').then(function(){
this.saveScreenshot('./confirmation.png').then(function(){
this.end();
});
});//end wait for exists
});//end click.then
});// Save the screenshot to disk
});//end pause.then
});//end click.then
};//end takeScreenshot
function fillFields(driver, fields){
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(){
tester.iter++;
console.log('tester.iter', tester.iter);
console.log('tester.totalSelects', tester.totalSelects);
if(tester.iter == tester.totalSelects-1){
takeScreenshot.call(this, null);
}
execQueue[tester.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[tester.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) // navigate to the web page
.then(function(result) {
fillFields(this, fields);
});
按顺序运行代码行line@MahsumAkbas一行一行。。。与???相反,据我所知,他不知道哪里会出错。所以,在这种情况下,我这样做,你无法真正检测到是否发生了页面重新加载。您应该非常了解页面,知道是什么触发了重新加载,然后编写代码来检测页面何时被加载并准备好与之交互。