2016-09-11 34 views
2

私は、ステップの1つがDropzone.jsを介してファイルをアップロードすることであるSeleniumテストケースを作成しています。プログラムによってDropzone経由でファイルをアップロード/追加します。 by Selenium

(あまりにも細かされることをJavaScriptでプログラム的に行うことができますので、もしセレンは、ブラウザでJavaScriptを実行することができたよう。)

私は、ファイルブラウザウィンドウを開いてシミュレートするためにすべての道を行く避けたいです、ファイルの選択などは、Webドライバが処理できるものの外にあり、非常に複雑になります。擬似コードでは、私はこのような何かをしたいと思います:

1. Select some Dropzone element 2. Set file path 3. Submit (upload the file)

「DZ-隠さ入力」要素を使用して、既存の質問(Unable to upload file using python selenium webdriver on http://www.dropzonejs.com)、に記載された1つの可能性の高いアプローチがあります(A DOMファイル入力)。

残念ながら、少なくともDropzoneの現在のバージョンでは動作しません。ファイルを要素に設定すると、Dropzone .filesはまだ空であり、アップロードは行われません。

1. Set file path in the "dz-hidden-input" element 2. Use javascript to retrieve the File object from the element 3. Pass the file to dropzone.addFile(file)

をしかし、私の懸念は、それが隠された入力との両方として、本当にハックです:

ドロップゾーンのソースで見た後、私は上記を拡張することで、実用的なソリューションを思い付きました。 addFileは文書化されておらず、Dropzoneが実装などを変更すると、テストは将来中断されます。

これを行う方法はありますか?

(明確にするために - 私はドロップゾーンFAQに述べたように、既存のファイルを表示しないように、新しいファイルをアップロードしようとしています)入力ボタンに

+0

私たちはサーバー側のSOAPリクエストを介して、セレンを介したUIオートメーションとして、クリックして入力ボタン - > Webドライバのクリップボードを使用する/ Javaロボット - >貼り付け/ファイルの場所を入力する+ファイル名>ロボットを押してください。私は申し訳ありませんが、私はdropzone jsアイデアのアイデアはありませんが、これらはあなたがプログラマチックにjavascriptレベルのアップロードをしたいもの以外の2つの方法です。 –

+0

ありがとう、はい私はJavaロボットを使用して、あなたが言及したようにGUIアクションをシミュレートするようにしました(可能ならそのルートに行く必要はありませんが...)。参考までに、私はいくつかのサンプルコードを見つけました:http://sqa.stackexchange.com/questions/12851/how-can-i-work-with-file-uploads-during-a-webdriver-test私はいくつかのThread.sleepをアクションの間に挿入しなければなりませんでした。 (また、Dropzoneは通常のファイル入力要素ではありませんが、それをIDで見つけてからクリックすると、ファイルブラウザウィンドウが開きます)。 –

+0

はい、十分な数を追加する必要があります。それはファイルエクスプローラとやりとりし、開くために時間がかかり、アップロード後にファイルサイズに応じて必要なスリープが必要になるためです。答えとして追加... –

答えて

1

クリック - >使用ウェブドライバクリップボード/ Javaのロボット - >貼り付け/ファイルの場所の入力+ファイル名>ロボットの入力を入力します。

final String fileName = "textfile.txt"; 
final String filePath = "\\data\\public\\other\\" + fileName; 
zUploadFile (filePath); 

public void zUploadFile (String filePath) throws HarnessException { 

    // Put path to your image in a clipboard 
    StringSelection ss = new StringSelection(filePath); 
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); 
    // OR use java robot for entire filepath 
    Thread.sleep(10000); 

    // Imitate mouse events like ENTER, CTRL+C, CTRL+V 
    Robot robot; 
    try { 
     robot = new Robot(); 
     robot.keyPress(KeyEvent.VK_CONTROL); 
     robot.keyPress(KeyEvent.VK_V); 
     robot.keyRelease(KeyEvent.VK_V); 
     robot.keyRelease(KeyEvent.VK_CONTROL); 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     robot.keyPress(KeyEvent.VK_ENTER); 
     robot.keyRelease(KeyEvent.VK_ENTER); 

    } catch (AWTException e) { 
     e.printStackTrace(); 
    } 
} 
+0

このアプローチが機能することを確認するだけです。しかし、私が質問したところでは、ブラウザを開くようなGUIアクションをシミュレートしないようにすることを望んでいます(ちょっと非決定的な任意の待機を追加する必要があります)。私はDropzoneで直接動作するソリューションを探していますそのようなアプローチは存在します:-) –

+0

ありがとうKen。あなたはあなたのプロジェクトに使用するサーバー側のソリューションを教えていただけますか?私はこれが第2の代替案であり、第3の問題はおそらくDropzoneを介していることを意味しています。残念ながら私はツールとして認識していません。 –

+1

標準のHTTPマルチパート・ファイル要求を受け取り、サーバー上でnode.jsを使用します。しかしこれはクライアント側の問題です。 Dropzone.jsはドラッグ・ドロップ・ファイルを処理できるクライアント側のJavascriptコンポーネントですが、最も単純なユース・ケースでは、通常のHTMLファイル入力コントロールのように動作し、クリックしてファイル・ブラウザを開きます。通常のHTMLファイル入力コントロールの場合、アップロードファイルはWebDriverの呼び出しだけで簡単です。 'driver.findElement(By.xpath(" // input [@ type = 'file'] "))。sendKey(" foo.txt ")';残念ながらDropzoneコンポーネントでは同じことはできません。 –

関連する問題