2014-12-02 49 views
1

我想异步函数依赖于量角器测试外置模块上

  1. 保存图像文件这是远程Web服务器,并
  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 2014-12-02 08:59:48

+0

@Jackson来自[量角器github页面]的引用(https://github.com/angular/protractor#protractor-): 'Protractor是AngularJS应用程序的端到端测试框架。量角器是建立在WebDriverJS之上的Node.js程序。' – nilsK 2014-12-02 14:11:15

+0

@weed也许你需要从另一个目录需要你的文件,例如:'var fs = require('../ fs');' - 取决于你的项目设置。 – nilsK 2014-12-02 14:12:14

回答

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

非常感谢Andres! – weed 2014-12-03 00:07:23

+0

绝对的辉煌。在找到这件事之前,我偶然发现了许多酒糟。非常感谢! – 2015-02-20 19:35:20