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


回答:


137

これが私のやり方です:

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();

+1これは機能しています。Andres、これは正解として受け入れられる可能性があるため、フィードバックをOPに依頼する必要があります。
コマ14年

1
分度器でも働きました。
Ilia Barahovski、2014年

6
FWIWは__dirname、一時ディレクトリ(おそらくテストランナーによってテストがコピーされる場所)を指すことがあります。その場合process.cwd()__dirname、代わりに使用できます。
BorisOkunskiy 2015年

これは私にとってクロームで機能していますが、他のブラウザでは、分度器は要素が表示されないと不平を言っています...何かアイデアはありますか?
Omid Ahourai

要素が表示されないため、Firefoxでアップロードできません。パス値を設定するには、要素を表示する必要があります。更新された回答をご覧ください。
Andres D

14

直接はできません。

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

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

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

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

これはうまくいきます:

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

これは質問に答えていないようで、別のサイトにリンクしています
activedecay

4

これは、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);

2
var imagePath = 'http://placehold.it/120x120&text=image1';
element(by.id('fileUpload')).sendKeys(imagePath);

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


1

これは私がfirefoxにファイルをアップロードするために行うことです、このスクリプトはパス値を設定するために要素を可視にします:

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

0

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

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

        callback();
    });

(私はまた、ファイルinput要素のすべてのスタイルを削除しました)


0

// C:\ Directoryからファイルをアップロードするには

{

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();

};


では、変数fileToUploadは何ですか?
Lynx 242

-3

現在ドキュメント化されているソリューションは、ユーザーがjQueryをロードしている場合にのみ機能します。私はすべての異なる状況のユーザーが次のようなエラーを受け取ります:失敗:$が定義されていません

ネイティブのangularjsコードを使用してソリューションを文書化することをお勧めします。

例えば、私は提案する代わりに提案します:

    $('input[type="file"]') .....

提案する:

    angular.element(document.querySelector('input[type="file"]')) .....

後者はより標準的で、角度の上にあり、より重要なのはjqueryを必要としないことです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.