Protractor - 如何在不更改代码的情况下在测试用例中使用 ng-file-upload 上传文件?

Protractor - How to upload file using ng-file-upload in test case without changing code?

I am using https://github.com/danialfarid/ng-file-upload for file upload. I have to test it so I wrote protractor test case but it not working.

代码

<div class="col-lg-12 up-buttons">
     <div ng-file-select="" ng-model="files" ng-model-rejected="rejFiles" class="btn btn-default" ng-multiple="false" ng-accept="'text/csv,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'"  ng-model-rejected="rejFiles" tabindex="0">Choose file</div>
</div>

测试用例

it('upload file', function(){   
  var fileToUpload = 'C:/Users/Anusha/Desktop/demo.csv';
  var absolutePath = path.resolve(fileToUpload);
  $('input[type="file"]').sendKeys(absolutePath);
  browser.sleep(1500);
})

我可以上传文件,但它是在 rejFiles 模型而不是 files 模型中接收的,尽管文件格式是正确的。谁能建议我怎么做?

绝对路径对我有帮助:

var fileToUpload = 'D:/file.csv';
var absolutePath = path.resolve(fileToUpload);
$('input[type="file"]').sendKeys(absolutePath);
element(by.css('#doUpload')).click();

(也讨论了 here

Html

<div class="col-lg-12 up-buttons">
    <div ng-file-select="" ng-model="files" ng-model-rejected="rejFiles" class="btn btn-default" ng-multiple="false" ng-accept="'*.csv'"  ng-model-rejected="rejFiles" tabindex="0">Choose file</div>
</div>

测试用例

var path = require('path');
var fileToUpload = file_path;
var absolutePath = path.resolve(fileToUpload);
element.all(by.css('input[type="file"]')).then(function(items) {
  items[0].sendKeys(absolutePath);
});
browser.sleep(500);

我为此苦苦挣扎了一段时间,但发现 在尝试 sendKeys.[= 之前​​,我必须触发对 ngf-select 元素的点击16=]

it('upload file', function(){
  var fileToUpload = 'C:/Users/Anusha/Desktop/demo.csv';
  var absolutePath = path.resolve(fileToUpload);
  var button = element(by.css('[ng-file-select]');
  button.click();
  var input = element(by.css('input[type="file"]'));
  input.sendKeys(absolutePath);
});

点击 ngf-select 指令按钮后,页面底部的 ng-file-upload 添加输入。

此外,我能够像这样为文件使用相对路径(相对于规范文件的位置):

it('upload file', function(){
  var path = require('path');
  var fileToUpload = '../demo.csv';
  var absolutePath = path.resolve(__dirname, fileToUpload);
  var button = element(by.css('[ng-file-select]');
  button.click();
  var input = element(by.css('input[type="file"]'));
  input.sendKeys(absolutePath);
});

这假设您有 运行 npm install path --save-dev.

这是使用 Protractor 2.0.0 和 ng-file-upload 4.0.4

运行时 DOM 元素更改 存在问题。因此我们可以逐个元素的运行时间更改 属性 并且对于文件上传情况,DOM 将 属性 更改为 'input[type="file"]'。否不管上传元素是否有input标签。

element(by.css('input[type="file"]')).sendKeys(absolutePathOfFile);