2014-09-01 8 views
0

Я использую 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

+0

Кажется, вы используете правильный и рекомендуемый метод. Async и Q используются для разных вещей - в то время как Q используется для интерфейса с обещаниями, Async используется для управления потоком. Есть способы написать это без async, но зачем вы хотите это сделать? –

ответ

0

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

Если

Если вы хотите удалить async, есть несколько вариантов:

  • использование управления Q потока реализации
  • Copy Paste ASync в
  • реализовать его самостоятельно

Если вы попытаетесь использовать управление потоком Q, он будет выглядеть примерно так (псевдокод):

var getTextActions = []; 
    function createAction(element){ 
     return function(){ 
      return element.getText(); 
     } 
    } 

    each(elements, function(element){ getTextActions.push(createAction(element)) }); 
    Q.all(getTextActions).then(function(results) { 
     ... iterate all results and resolve promise with first matching element.. 
    }); 

примечание, что эта реализация имеет худшие характеристики. Сначала он получит текст из всех элементов и только затем попытается решить ваше обещание. Вы выполняете реализацию лучше, так как все работает параллельно.

Я не рекомендую использовать его самостоятельно, но если вы все еще хотите, это будет выглядеть примерно так (псевдо-код):

var elementsCount = elements.length; 
elements.each(function(e){ 
    element.getText(function(err, result){ 
     elementsCount --; 
     if (!!err) { logger.error(err); /** async handles this much better **/ } 
     if (isThisTheElement(result)) { deferred.resolve(result); } 
     if (elementsCount == 0){ // in case we ran through all elements and didn't find any 
      deferred.resolve(null); // since deferred is resolved only once, calling this again if we found the item will have no effect 
     } 
    }) 
}) 

если что-то непонятно, или если бы я не сделал нажмите на место, дайте мне знать, и я улучшу ответ.

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

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