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 にも同様に適用されます。