Я использую Javascript, webdriverio (v2.1.2), чтобы выполнить извлечение данных с внутреннего сайта. Так идеяJavascript Loop over elements и щелкните ссылку, используя WebdriverIO
- Аутентифицировать
- Откройте требуемый URL, когда проверка подлинности
- В новой странице поиска для тега привязки, имеющего определенное ключевое слово
- Найдя, нажмите на якорный тег
Ниже приведено то, что я пробовал, и он работает (последние две точки). Я должен был использовать Q и async для его достижения. Я надеялся использовать только Q для его достижения. Может кто-нибудь мне помочь, о том, как добиться этого, используя только Q?
var EmployeeAllocationDetails = (function() {
'use stricy';
/*jslint nomen: true */
var Q = require('Q'),
async = require('async'),
_ead_name = 'Employee Allocation Details',
goToEadFromHome;
goToEadFromHome = function (browserClient) {
browserClient.pause(500);
var deferred = Q.defer();
browserClient.elements('table.rmg td.workListTD div.tab2 div.contentDiv>a', function (err, results) {
if (err) {
deferred.reject(new Error('Unable to get EAD page. ' + JSON.stringify(err)));
} else {
async.each(results.value, function (oneResult, callback) {
console.log('Processing: ' + JSON.stringify(oneResult));
browserClient.elementIdText(oneResult.ELEMENT, function (err, result) {
if (err) {
if (err.message.indexOf('referenced element is no longer attached to the DOM') > -1){
callback();
} else {
callback('Error while processing :' + JSON.stringify(oneResult) + '. ' + err);
}
} else if(!result){
console.log('result undefined. Cannot process: ' + JSON.stringify(oneResult));
callback();
} else if(result.value.trim() === _ead_name){
deferred.resolve(oneResult);
callback();
}
});
}, function (err) {
// if any of the processing produced an error, err would equal that error
if(err) {
// One of the iterations produced an error.
// All processing will now stop.
console.log('A processing failed to process. ' + err);
} else {
console.log('All results have been processed successfully');
}
}); //end of async.each
}
});
return deferred.promise;
};
return {
launchEad : goToEadFromHome
}
})();
module.exports = EmployeeAllocationDetails;
Связанные Github Issue ссылка https://github.com/webdriverio/webdriverio/issues/123
Кажется, вы используете правильный и рекомендуемый метод. Async и Q используются для разных вещей - в то время как Q используется для интерфейса с обещаниями, Async используется для управления потоком. Есть способы написать это без async, но зачем вы хотите это сделать? –