9

Junit フレームワークで 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 を取得できません。できれば例を教えてください。

4

8 に答える 8

4

これは古い質問ですが、最近これを行うことで問題を解決しました

    //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");
    }

browserは、Seleniumスクリプトが実行しているブラウザーを含む単なる変数であり、コードは明らかにjavaです。

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


#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)

基本的に、ウィンドウのタイトルを取得して最大化し、アップロードするファイルを入力し、選択ボタンをクリックしてSeleniumに戻ります。私は、IE 8でテストしましたが、IEが自動でサポートされているので、_IEライブラリはこれを処理できません。

私は、javascriptが追加のことを実行できるようにするロボットスクリプトやFirefoxハックをたくさん見てきました。これらは両方ともブラウザの変更を必要としません。

コメントが不足していることをお詫び申し上げます。このコードはまだ進行中です。

于 2010-06-18T13:18:24.177 に答える
1

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

Selenium-2 は現在ベータ版ですが、比較的安定しているようです。しかし、Selenium-1 でできることのすべてが Selenium-2 RC エミュレーション モードでサポートされているわけではないので、そうする前によく考えてください。

詳細はこちら: http://seleniumhq.org/docs/09_webdriver.html#emulating-selenium-rc

于 2011-01-25T20:22:06.647 に答える
1

このスクリプトを AutoIt で試すことができます。基本的に、ファイル選択ウィンドウを待ちます。次に、ファイル パスを入力し、Enter クイックを送信します。最後に、ポップアップ エラー メッセージがあったかどうかを確認し、テキストを読み込んで終了コードを 1 に設定し、終了コードを 0 に設定していない場合は、ファイル選択ウィンドウが閉じられるようにします。

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

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

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

そうしないと、クリック コマンドの終了を待って Selenium がハングします。これは、File Chooser ウィンドウが開かれ、閉じられていないために発生しません。

スクリプト:

$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
于 2011-10-28T13:58:21.857 に答える
1

私はこれに対する解決策を得ました。selenium.focus メソッドと selenium.keyPressNative/keyReleaseNative メソッドを使用します。

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

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

次に、入力ファイルが C:\tools\File.txt の場合、次のように文字を入力する必要があります。

selenium.keyDownNative("16"); //シフトオン

selenium.keyPressNative("67"); // c シフトすると C になります

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

selenium.keyUpNative("16"); // シフトオフ

selenium.keyPressNative("47"); // スラッシュ

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

selenium.keyPressNative("79"); // o

selenium.keyPressNative("79"); // o

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

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

selenium.keyPressNative("47"); // スラッシュ

selenium.keyDownNative("16"); //シフトオン

selenium.keyPressNative("70"); // 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"); // バツ

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

selenium.keyPressNative("10"); // 入る

selenium.keyReleaseNative("10"); // 入る

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

于 2009-11-30T09:48:32.987 に答える
1

Selenium / Rspec / Internet Explorer を使用する私の解決策は、Windows マシンで AutoIt スクリプトを作成することでした

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

次に、これを Windows マシンの管理者として実行します。exeファイルを右クリックし、管理者として実行します。

次に、rspec は page.click "あなたの参照ボタンの id" を実行します。Windows マシンでブラウズ ウィンドウが開くと、AutoIt はテキスト ボックスを自動入力して閉じます。これが私を夢中にさせていたので、これが誰かを助けることを願っています。

于 2011-05-18T18:46:46.550 に答える
1

「fileLocator」は URL ではなく、Selenium クラスの javadoc の上部に指定されているロケータです。ファイルの選択に使用される入力のロケーターです。

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

Chrome モードの Firefox (*firefox ではなく browserId=*chrome) では、これは期待どおりに機能します。この browserId でのみ動作することが文書化されています)

例: attachFile("uploadField", Thread.currentThread().getContextClassLoader().getResource("files/sample.pdf").toString());

于 2009-11-30T15:11:27.617 に答える
0

$sel->type と $sel->focus を使用すると、はるかに簡単になります。以下は良い記事です。

http://bitsilearn.blogspot.com/

于 2010-03-21T09:12:04.667 に答える
0

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

私はRubyクライアントを使用しているので、動作させるにはこのようなものでした

$browser.click "css=input.file" # This is the 'Choose File' button
$browser.type "css=input.file", "/absolute/path/to/file.file"
于 2012-02-17T20:06:44.213 に答える