如何使用Nightwatch和Browserstack将文件从本地PC上传到远程服务器?

时间:2018-02-13 15:37:36

标签: javascript nightwatch.js browserstack

我正在使用nightwatch和browserstack,我想测试上传/下载功能。它在我的本地计算机上工作正常,但在browserstack上失败,因为它试图在该主机而不是本地PC上查找文件。 我知道,因为selenium 2它支持使用FileDetector上传文件以删除服务器:

var remote = require('selenium-webdriver/remote');
browser.setFileDetector(new remote.FileDetector());
var input = element(by.model("fileInput")),
input.sendKeys(path.resolve(__dirname, "filename."));

nightwatch是否提供将本地文件上传到远程服务器的任何功能?

另外,据我所知,nightwatch不使用selenium-webdriver而是将HTTP请求发送到远程服务器,所以我认为应该可以通过发送HTTP请求来实现此功能,如果删除服务器支持,对吧?

3 个答案:

答案 0 :(得分:0)

要使用Remotewebdriver实例上传文件,Webdriver有一个FileDetector模块,可帮助检测本地计算机上的文件,首先将文件上传到Browserstack /任何云虚拟机,然后上传到您的Web应用程序。似乎Nightwatch没有实现selenium webdriver' remote.FileDetector'。但是,您可能希望在夜班测试中包含一个vanilla节点实现文件上传。您可以将浏览器实例移植到selenium webdriver实例并使用类似的东西:

driver.setFileDetector(new remote.FileDetector);


driver.get('http://www.fileconvoy.com/').then(function(){
  driver.findElement(webdriver.By.id('upfile_0')).sendKeys('/home/user/file_name').then(function(){
    driver.findElement(webdriver.By.id('readTermsOfUse')).click().then(function(){
      driver.findElement(webdriver.By.id('upload_button')).click().then(function(){
        driver.getTitle().then(function(title) {
          console.log(title);
          driver.quit();
        });
      });
    });

注意:您可能需要以下导入/依赖项:require(' selenium-webdriver');要求('硒 - 的webdriver /远程&#39);

答案 1 :(得分:0)

Nightwatch提供了使用自定义命令扩展它的功能。 波纹管用于将文件发送到selenium网格设置。

  Actions.uploadFile = function(filePath, callback) {
    var archiver = require('archiver'),
      zip = archiver('zip'),
      fs = require('fs');
    var buffers = [];
    var getStream = function(filePath) {
      return fs.readFileSync(filePath);
    };

    // This just pipes the read stream to the response object (which goes to the client)
    zip.on('data', function(data) {
      buffers.push(data);
    });
    zip.on('finish', function() {
      postRequest(
        '/file',
        { file: Buffer.concat(buffers).toString('base64') },
        callback
      );
    });

    zip.on('error', function(err) {
      reject(err);
    });
    var filename = filePath.split('\\').pop().split('/').pop();
    zip.append(getStream(filePath), { name: filename });

    zip.finalize();
  };

答案 2 :(得分:-1)

browser.setFileDetector(new remote.FileDetector());在Node.js中不起作用。

setFileDetector不是函数。