Selenium WebDriver を使用して Windows ファイルのアップロードを処理するにはどうすればよいでしょうか? 質問する

Selenium WebDriver を使用して Windows ファイルのアップロードを処理するにはどうすればよいでしょうか? 質問する

Stack Overflow で、Selenium WebDriver を使用したファイルのアップロードに関する多くの質問と解決策を見てきました。しかし、それらのどれも次のシナリオでは機能しません。

誰かが次のような解決策を提示しました

// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");

しかし、まだウィンドウ ハンドルが見つかりません。どうすれば解決できますか?

スクリーンショット

上記のシナリオに対する解決策を探しています。

以下のいずれかのウェブサイトでご確認ください。

http://www.uploadify.com/demos/
http://www.zamzar.com/

ベストアンサー1

// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");

ねえ、それはどこかから持ってきた私のものです :)。


の場合ザムザールウェブでは完璧に動作するはずです。クリックしないでください要素にパスを入力するだけです。具体的には、次のようになります。

driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg");

の場合アップロードWeb の場合、アップロードは ではinputなく Flash オブジェクトであるため、困ったことになります。ブラウザ ダイアログ (または Flash オブジェクト) を操作できる WebDriver 用の API はありません。

したがって、Flash 要素をクリックすると、制御できないウィンドウがポップアップ表示されます。私が知っているブラウザーとオペレーティング システムでは、ウィンドウが開いた後、カーソルが入力内にあるとほぼ想定できますFile name。この想定があなたのケースでも当てはまることを確認してください。

Alt + Nそうでない場合は、少なくとも Windows では、 を押してそこにジャンプしてみてください...

もしそうなら、Robotクラス。あなたの場合、それは次のようなものになります:

driver.findElement(By.id("SWFUpload_0")).click();
Robot r = new Robot();
r.keyPress(KeyEvent.VK_C);        // C
r.keyRelease(KeyEvent.VK_C);
r.keyPress(KeyEvent.VK_COLON);    // : (colon)
r.keyRelease(KeyEvent.VK_COLON);
r.keyPress(KeyEvent.VK_SLASH);    // / (slash)
r.keyRelease(KeyEvent.VK_SLASH);
// etc. for the whole file path

r.keyPress(KeyEvent.VK_ENTER);    // confirm by pressing Enter in the end
r.keyRelease(KeyEvent.VK_ENTER);

面倒ですが、動作するはずです。次のものが必要になる可能性があることに注意してください:ロボットに `:` と入力させるにはどうしたらいいでしょうか?そして文字列をKeyEventsに変換する(さらに新しくてピカピカのKeyEvent#getExtendedKeyCodeForChar()同様の機能を実行しますが、JDK7 からのみ利用可能です。


Flashの場合、私が知っている唯一の代替手段は(この議論) はダークテクニックを使うことです:

まず、フラッシュ アプリケーションのソース コードを変更し、ActionScript の ExternalInterface API を使用して内部メソッドを公開します。公開されると、これらのメソッドはブラウザーの JavaScript によって呼び出すことができるようになります。

次に、JavaScript がフラッシュ アプリの内部メソッドを呼び出すことができるようになったので、WebDriver を使用して Web ページで JavaScript 呼び出しを行い、フラッシュ アプリを呼び出します。

このテクニックについては、flash-selenium プロジェクトのドキュメントでさらに詳しく説明されています。http://code.google.com/p/flash-selenium/) ですが、このテクニックの背後にある考え方は WebDriver にも同様に適用されます。

おすすめ記事