web-dev-qa-db-ja.com

angularjs e2e分度器テストでファイルをアップロードする方法

Angularjs e2eテストを使用して、ファイルのアップロードをテストしたいと思います。 e2eテストでこれをどのように行いますか?私は、うめきカルマを通してテストスクリプトを実行します。

81
Pawan Singh

これは私がそれを行う方法です:

var path = require('path');

it('should upload a file', function() {
  var fileToUpload = '../some/path/foo.txt',
      absolutePath = path.resolve(__dirname, fileToUpload);

  element(by.css('input[type="file"]')).sendKeys(absolutePath);    
  element(by.id('uploadButton')).click();
});
  1. pathモジュールを使用して、アップロードするファイルの絶対パスを解決します。
  2. パスをinput type = "file"要素に設定します。
  3. アップロードボタンをクリックします。

これは、Firefoxでは機能しません。要素が表示されないため、分度器は文句を言います。 firefoxでアップロードするには、入力を表示する必要があります。これが私がすることです:

browser.executeAsyncScript(function(callback) {
  // You can use any other selector
  document.querySelectorAll('#input-file-element')[0]
      .style.display = 'inline';
  callback();
});

// Now you can upload.
$('input[type="file"]').sendKeys(absolutePath);    
$('#uploadButton').click();
129
Andres D

直接できません。

セキュリティ上の理由から、ngScenarioなどの機能テストスイート内でシステム上のファイルを選択しているユーザーをシミュレートすることはできません。

分度器では、WebDriverに基づいているため、 このトリック を使用できるはずです。

Q:WebDriverはファイルのアップロードをサポートしていますか? A:はい。

ネイティブOSファイルブラウザーダイアログと直接対話することはできませんが、ファイルアップロード要素でWebElement#sendKeys( "/ path/to/file")を呼び出すと正しい動作が行われるように魔法をかけます。ファイルアップロード要素をWebElement#click()しないでください。そうしないと、ブラウザがハングする可能性があります。

これはうまく機能します:

$('input[type="file"]').sendKeys("/file/path")
9
bdavidxyz

以下は、Andres Dとdavidb583のアドバイスのコンボです。これは、私がこれをやり遂げたときに私を助けてくれただろう...

Flowjsコントロールに対して分度器テストを実行しようとしていました。

    // requires an absolute path
    var fileToUpload = './testPackages/' + packageName + '/' + fileName;
    var absolutePath = path.resolve(__dirname, fileToUpload);

    // Find the file input element
    var fileElem = element(by.css('input[type="file"]'));

    // Need to unhide flowjs's secret file uploader
    browser.executeScript(
      "arguments[0].style.visibility = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1",
      fileElem.getWebElement());

    // Sending the keystrokes will ultimately submit the request.  No need to simulate the click
    fileElem.sendKeys(absolutePath);

    // Not sure how to wait for the upload and response to return first
    // I need this since I have a test that looks at the results after upload
    //  ...  there is probably a better way to do this, but I punted
    browser.sleep(1000);
4
Doug
var imagePath = 'http://placehold.it/120x120&text=image1';
element(by.id('fileUpload')).sendKeys(imagePath);

これは私のために働いています。

2

これは、Firefoxでファイルをアップロードするために行うことです。このスクリプトは、要素を表示してパス値を設定します。

   browser.executeScript("$('input[type=\"file\"]').parent().css('visibility', 'visible').css('height', 1).css('width', 1).css('overflow', 'visible')");
0
Rodrigo Salazar

テストしているWebアプリでのファイル入力は、JavaScriptを使用してスクロールして表示される場合にのみFirefoxで表示されることに気づいたため、Andres DのコードにscrollIntoView()を追加して、アプリで動作するようにしました。

  browser.executeAsyncScript(function (callback) {
        document.querySelectorAll('input')[2]
     .style = '';
        document.querySelectorAll('input')[2].scrollIntoView();

        callback();
    });

(ファイル入力要素のすべてのスタイルも削除しました)

0
pinkninja

// C:\ディレクトリからファイルをアップロードするには

{

var path = require('path');
var dirname = 'C:/';
var fileToUpload = '../filename.txt';
var absolutePath = path.resolve('C:\filename.txt');
var fileElem = ptor.element.all(protractor.By.css('input[type="file"]'));

fileElem.sendKeys(absolutePath);
cb();

};

0
randomguy