2009-11-10 14 views
8

私はJunitフレームワークでSelenium RCを使用しています。私はattachFile()メソッドを使用してファイルをアップロードしようとしています。Selenium RC> attachFile()を使用してファイルをアップロードする方法

attachFile: (Information collected from selenium API http://release.seleniumhq.org/selenium-remote-control/1.0-beta-2/doc/java/com/thoughtworks/selenium/Selenium.html#attachFile(java.lang.String,%20java.lang.String)) 

void attachFile(java.lang.String fieldLocator, 
      java.lang.String fileLocator) 

Sets a file input (upload) field to the file listed in fileLocator 

Parameters: 
    fieldLocator - an element locator 
    fileLocator - a URL pointing to the specified file. Before the file can be set 
    in the input field (fieldLocator), Selenium RC may need to transfer the file to 
    the local machine before attaching the file in a web page form. This is common in 
    selenium grid configurations where the RC server driving the browser is not the 
    same machine that started the test. Supported Browsers: Firefox ("*chrome") only. 

誰がどのように"fileLocator"を定義する方法を教えてくださいすることができます。私はここで指定するURLを取得していません。可能であれば、私に例を挙げてください。

+0

誰を動作させるために、このようなものだったので、私はRubyのクライアントを使用しています? PLZは私を助けます... – Saara

答えて

1

私はselenium.focus方法及びselenium.keyPressNative/keyReleaseNativeメソッドを使用し、このためのソリューションを得ました。

あなたは使用して、テキストボックスにフォーカスを与える必要があります:

selenium.focus(「テキストボックスロケータを」);

は、その後、あなたの入力ファイルは、Cの場合:\ツールは、あなたがそうのような文字を入力する必要がFILE.TXTを\:

selenium.keyDownNative( "16")。

selenium.keyPressNative( "67")ON // SHIFT。 // Cのシフトは、C

selenium.keyPressNative( "59")を行います。 //;シフトはそれを作る:(あなたが直接コロンを行うことはできません)

selenium.keyUpNative( "16"); //

selenium.keyPressNative( "47")非番。 //

selenium.keyPressNative( "84")をスラッシュ。 // t

selenium.keyPressNative( "79"); //

selenium.keyPressNative( "79"); //

selenium.keyPressNative( "76"); // L

selenium.keyPressNative( "83")。 // s

selenium.keyPressNative( "47"); //

selenium.keyDownNative( "16")をスラッシュ。

selenium.keyPressNative( "70")ON // SHIFT。 // Fシフトは、F

selenium.keyUpNative( "16")を行います。 //

selenium.keyPressNative( "73")非番。 //私

selenium.keyPressNative( "76"); // l

selenium.keyPressNative( "69"); //e

selenium.keyPressNative( "46"); //

selenium.keyPressNative( "84"); // t

selenium.keyPressNative( "88"); // x

selenium.keyPressNative( "84"); // t

セレン。keyPressNative( "10"); // Enter

selenium.keyReleaseNative( "10"); //入力してください

私は 'Enter'文字でsequqnceを終了しました。場合によってはこれが機能しないため、ボタンをクリックする必要があるかもしれません(要素ロケータがわかっている場合)。

+0

\はスラッシュではなく、アンチ・スラッシュと呼ばれます。あなたの方法は、すべてのキーボード、すべての種類のテキスト、およびすべてのOSで動作しません。 –

+0

@PierreGardin a)フランス語でアンチ・スラッシュと呼ばれるものです。英語ではバックスラッシュです。b)Java KeyCodeなので、プラグインしているキーボードに関係なく動作します。すべてのOSで動作しますが、いずれもパスとして文字列として入力されません。どちらかの方法で前提条件を設定する必要があります。これは素晴らしい回避策です –

1

"fileLocator"はurlではなく、Seleniumクラスのjavadocの一番上に指定されているロケータです。 ファイルを選択するために使用される入力のロケータです。

"fieldLocator"は、引用しているドキュメントで指定されているように、フォームの入力フィールドに設定するファイルを指すURLです。

Firefoxをchromeモード(browserId = * firefoxではなくchrome)にすると、これは期待どおりに動作します。

例:attachFile( "uploadField"、Thread.currentThread()。getContextClassLoader()。getResource( "files/sample.pdf")。toString());これは、このブラウザーでのみ動作することが文書化されています。

+0

実際に私のアプリケーションはFirefoxをサポートしていません...このattachFileメソッドは私のためには機能しませんでした...そしてkeyPressNative/keyReleaseNativeメソッドはIE7で動作します... – Saara

+0

私はそれが逆です。 – hoymkot

4

これは、古い質問ですが、私は最近、セレンスクリプトが実行されていて、コードはJavaで明らかであるものをブラウザ含むちょうど変数である。この

//Start an auto it script that selects the file manually 
    if(browser.contains("iexplore")){ 
     Runtime r= Runtime.getRuntime(); 
     Process p = null; 
     try { 
      p = r.exec("C:\\uploadFile.exe \"Files\" \"ctl00$ContentPlaceHolder1$FilesView$ctl02$NewFile\" \"C:\\GhostTagBug2.ttx\""); 

     }catch(Exception e){} 
     p.waitFor(); 
    } else { 
     //Tested on firefox 
     //Get focus and type the path manually 
     selenium.focus("xpath=//input[contains(@id,\"_NewFile\")]"); 
     selenium.type("xpath=//input[contains(@id,\"_NewFile\")]", "C:\\GhostTagBug2.ttx"); 
    } 

ブラウザをやって問題を解決しました。

IEの場合、uploadFile.exeは次のような自動itスクリプトです。


#include IE.au3 
AutoItSetOption("WinTitleMatchMode","2") ; set the select mode to select using substring 

;Normally run from command line 
if($cmdLine[0] > 2) then 
    $titlex = $cmdLine[1] ;Title of the window 
    $form = $cmdLine[2] ;Name of the file upload/save form object 
    $file = $cmdLine[3] ;Path of the file to upload 
Else 
    ;Testing fields 
    $titlex = "Files" 
    $form = "ctl00$ContentPlaceHolder1$FilesView$ctl02$NewFile" 
    $file = "C:\\GhostTagBug2.ttx" 
EndIf 

WinWait($titlex) ; match the window with substring 
$title = WinGetTitle($titlex) ; retrives whole window title 
WinSetState($title, "", @SW_MAXIMIZE) ;Maximize the window incase button is hidden 
WinActivate($title) 
WinWaitActive($title) 

$oIE = _IEAttach ("Files") 
$oT = _IEGetObjByName ($oIE, $form) 
;Move the mouse to the button on the form and click it 
MouseMove (_IEPropertyGet ($oT, "screenx") + _IEPropertyGet ($oT, "width") - 10, _IEPropertyGet ($oT, "screeny") + _IEPropertyGet ($oT, "height")/2) 
MouseClick ("left") 

;Wait for upload screen then input the file and close it 
WinWait ("Choose File to Upload") 
$hChoose = WinGetHandle ("Choose File to Upload") 
ControlSetText ($hChoose, "", "Edit1", $file) 
ControlClick ($hChoose, "", "Button2") 

;Restore window state 
WinSetState($title, "", @SW_RESTORE) 

それは、本質的に、ウィンドウのタイトルをつかみ、それを最大化し、アップロードするファイルを入力、選択ボタンをクリックし、バックセレンになると、「私はIE 8罰金でそれをテストしてみたが、私はドンなぜそれが_IEライブラリであるかによって自動的にサポートされるIEはこれを処理できないだろうか。

私は、ロボットスクリプトとFirefoxのハックを見てきました。そこでは、JavaScriptで余分なことをすることができます。どちらもブラウザの変更は必要ありません。

私はコメントがないことをお詫びしますが、このコードはまだ進行中です。

+0

戻ってあなたのソリューションを追加してくれてありがとう! –

+0

+1 - クロムの作品 –

1

私の解決策は、RCエミュレーションモードでSelenium-2を使用することです。これにより、従来のSelenium-1テストをそのまま使用できますが、ファイルアップロードなどのタスクを実行するために必要なときにSelenium-2 APIに切り替えることができます。

現在、セレン-2はベータ版ですが、比較的安定しているようです。しかし、Selenium-1が行うことができるすべてがSelenium-2 RCエミュレーションモードでサポートされているわけではありません。

ここで、この上の詳細: http://seleniumhq.org/docs/09_webdriver.html#emulating-selenium-rc

1

セレン/ RSPEC/Internet Explorerが 私のソリューションは、

WinWaitActive("Choose File to Upload") 
Send("c:\tests\school.jpg") 
Send("{ENTER}") 
run("selectfile2.exe") 

がその後に管理者としてこれを実行して、私のWindowsマシン上でのAutoItスクリプトを作成することでした使い方をWindowsマシン。 exeファイルを右クリックし、管理者として実行します。

次に、rspecはpage.click「閲覧ボタンのID」を行います。ブラウズウィンドウがWindowsマシン上で開くと、AutoItはテキストボックスを自動入力して閉じます。これは私がナットを運転していたので、これが誰かを助けることを望む。

1

このスクリプトはAutoItで試してみてください。基本的には、ファイル選択ウィンドウが待ち受けています。その後、ファイルのパスを入力し、迅速に入力を送信します。最後に、ポップアップエラーメッセージがあるかどうかチェックし、テキストがあればexitcodeを1に設定し、終了コードが0に設定されていない場合はチェックします。 スクリプトは、ファイル選択ウィンドウも閉じていることを確認します。

スクリプトはAut2Exeによって実行可能(.exe)に変換できます。コンソールにマークすることは重要ですか?チェックボックス、その後、exeはjavaから実行できます。(Runtime.getRuntime().exec()).

別のスレッドでファイルアップロードボタンをクリックすることも重要です。

new Thread() { 
    public voi run() { 
    browser.click([LOCALTOR]). 
} 
}.start(); 

そうでない場合はセレンは、ファイル選択窓が開閉されなかったため発生したことはありませんクリックコマンド仕上げのために待ってハングします。

スクリプト:

$title="Choose File to Upload" 
If($cmdLine[0] == 1 OR $cmdLine[0] == 2) Then 
    $file=$cmdLine[1] 
    If ($cmdLine[0] == 2) Then 
     $title=$cmdLine[0] 
    EndIf 
Else 
    ConsoleWriteError("Wrong number of argument. Use 2 argument: [FILE PATH] [FILE UPLOAD WINDOW TITLE]. Second argument is optional") 
    Exit(-1)  
EndIf 


If WinWaitActive($title,"",5)==0 Then ; wait 5 sec. 
    ConsoleWriteError($title & " window wasn't opened") 
    Exit (2) 
EndIf 

Send($file) 
Send("{ENTER}") 

$status=WinWaitActive($title, "", 1) 
$success = ($status = 0) 

If Not $success Then 
    $text = ControlGetText($title,"","[CLASS:Static; INSTANCE:2]") 
    WinClose($title)  
    WinClose($title)  
    ConsoleWriteError($text) 
EndIf 

Exit Not $success 
0

私は正常にブラウザとしてFirefoxの*を使用するように設定セレンを使用してファイルをアップロードしました。彼らはまだドキュメントを更新していないと思います。

このクエリに答えることが

$browser.click "css=input.file" # This is the 'Choose File' button 
$browser.type "css=input.file", "/absolute/path/to/file.file" 
関連する問題