2014-12-02 2 views
1

Я хочуфункция Асинхронный зависит от внешнего модуля в тесте транспортир

  1. сохранить файл изображения, который находится в удаленном веб-сервере, и
  2. загрузить его на другой сервер

в испытании проталкивателя.

// depend on a external module 
var fs = require('fs'); 

// save remote file(url) to local(dest) 
var download = function (url, dest) { 

    // let this function be async 
    browser.executeAsyncScript(function (url, dest, done) { 

     var file = fs.createWriteStream(dest); 
     var request = http.get(url, function (response) { 
      response.pipe(file); 
      file.on('finish', function() { 
       file.close(done); 
      }); 
     }); 
    }, url, dest); 
}; 

describe('', function() { 
    it('', function() { 
     browser.get('http://...'); 

     download('http://.../foo.jpg', 'foo.jpg'); /*** DOESN'T WORK! ***/ 

     var absolutePath = path.resolve(__dirname, 'foo.jpg'); 
     $('input[type=file]').sendKeys(absolutePath); 
     $('#uploadButton').click(); 
     ... 

, но это не работает:

Stacktrace: 
    UnknownError: javascript error: fs is not defined 

Когда я поставил var fs = require('fs'); в download функции, сообщение об ошибке ниже:

Stacktrace: 
    UnknownError: javascript error: require is not defined 
+0

Выходя на конечности здесь но транспортир тесты запускаются в браузере? Или в узле? Потому что, если они запускаются в браузере, это объясняет, почему 'require' не работает. – Jackson

+0

@Jackson Цитата из [страницы транспортира github] (https://github.com/angular/protractor#protractor-): 'Транспортир - это сквозная тестовая платформа для приложений AngularJS. Транспортир - это программа Node.js, построенная поверх WebDriverJS. ' – nilsK

+0

@weed, возможно, вам нужно будет потребовать ваш файл из другого каталога, например: «var fs = require ('../ fs');' - в зависимости от настройки вашего проекта. – nilsK

ответ

4

При вызове executeAsyncScript функция, которая вам pass сериализуется в браузере. Функция не будет работать в контексте вашего теста транспортира, но в браузере.

Вам необходимо создать обещание, которое разрешает, когда вы закончите загрузку файла.

// depend on a external module 
var fs = require('fs'); 

describe('', function() { 

    // save remote file(url) to local(dest) 
    var download = function (url, dest) { 
     // Create a promise that will be resolved after download. 
     var d = protractor.promise.defer(); 

     var file = fs.createWriteStream(dest); 
     var request = http.get(url, function (response) { 
      response.pipe(file); 
      file.on('finish', function() { 
       file.close(); 
       // The file has been read, resolve the promise 
       d. fulfill(); 
      }); 
     }); 

     // Return the promise 
     d.promise; 
    }; 

    it('', function() { 
     browser.get('http://...'); 

     // Get the file and wait for the promise to resolve to move on 
     download('http://.../foo.jpg', 'foo.jpg').then(function() { 
      // Make sure you specify a path where you can write and read the file. 
      var absolutePath = path.resolve(__dirname, 'foo.jpg'); 
      $('input[type=file]').sendKeys(absolutePath); 
      $('#uploadButton').click(); 
      ... 
     }); 

Позвольте мне знать, если он работает

Вот документация: https://code.google.com/p/selenium/wiki/WebDriverJs#Deferred_Objects

+0

Большое спасибо, Андрес! – weed

+0

Абсолютно блестящий. Я наткнулся на многих ратолов, прежде чем найти это. Огромное спасибо! –

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