10

Selenium2でファイルをアップロードするための解決策を探していました。

問題は、アップロードしようとしているWeb要素が2つの方法で使用できることです。ドラッグアンドドロップするか、ボタンをクリックします。フィールド入力ボックスはありません。sendKeysを試したことがないわけではありません。ボタンとその周辺のすべての要素で試してみました。

この問題の2番目の部分は、Windowsマシンで書き込むことですが、自動化はLinuxマシンで行われます。つまり、AutoItは機能しません。これはアップロードボックスのHTMLです。

<div class="up-target" id="up-drop-zone">
    <div class="up-drop-zone-pre hidden">
        <p>Please choose a folder to upload</p>
    </div>
    <div class="up-drop-zone-decor">
        <p>Drop one or more files here</p>
        <p>or</p>
        <button name="uploadFile" class="upload">Select Files</button>
        <input type="file" id="up-drop-zone-input" name="files[]" multiple="true">
    </div>
</div>

私はJavaを使用しており、Selenium以外の他のメソッドを使用できます(ただし、選択したMavenリポジトリーしかありません)。

ありがとう!

4

4 に答える 4

9

<input type="file" multiple>残念ながら、Seleniumは要素をサポートしていないため、現時点(2013年1月、Selenium 2.29.1)ではこれを行うことはできません。

プロジェクト開発者自身によるこれに対する機能拡張要求がありますが、まだ実装されていません。そこにスターを付けて、優先順位リストで上に移動できます。

また、私が知る限りWebElement、信頼できる方法でファイルをデスクトップからにドラッグすることはできません。

回避策は、AutoIT(Windowsのみ)またはRobotクラス(同様のセットアップでのみ機能します)を使用し、ダイアログにパスを「ブラインド」で入力することです。

driver.findElement(By.id("up-drop-zone-input")).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);

ひどいですが、うまくいくはずです。これらが必要になる場合があることに注意してください。Robotタイプを`:`にするにはどうすればよいですか?文字列をKeyEventsに変換します(さらに、同様の作業を行う新しくて光沢のKeyEvent#getExtendedKeyCodeForChar()あるものがありますが、JDK7からのみ利用できます)。

于 2013-01-31T14:31:39.023 に答える
1

私はそれを機能させる唯一の方法はAutoItを使用することでした( LittlePandauser3903359による回答のおかげで)。

テストの実行中に他のアクションを実行するとスクリプトが機能しなくなる可能性があるため、スクリプトを改善しました。秘訣は、テキストを入力する前にウィンドウを見つけてアクティブにすることでした。

タイムアウトは、複数のAutoItスクリプトがバックグラウンドでぶらぶらするのを防ぐためです。つまり、テストを停止して独自の作業を行おうとすると、スクリプトが開始されて入力を開始しようとします。

ウィンドウの名前はブラウザによって異なることに注意してください(たとえば、Chromeで「開く」)。

$windowHandle = WinWait("Choose File to Upload", "", 3) ; 3 second timeout - NB the window name will be different in different browsers!

If $windowHandle == 0 Then
   MsgBox(0, "", "Upload popup not found")
Else
   ;MsgBox(0, "", "Upload popup found: " & $windowHandle)
   WinActivate($windowHandle)
   Send("C:\\path\to\myfile.txt")
   Send("{ENTER}")
EndIf

JavaからAutoItスクリプトを実行することは、他のすべての答えと同じように想定しています。

Runtime.getRuntime().exec("MyAutoItScript.exe");

C#からAutoItスクリプトを実行する:

var process = Process.Start(@"C:\\path\to\myAutoItScript.exe");
process.WaitForExit();
Thread.Sleep(200); // IE fix for Modal dialog present exception
于 2018-02-02T08:28:35.087 に答える
0

このようにしてみてください

driver.findElement(By.id("up-drop-zone-input")).sendKeys("filePath");
于 2013-01-30T04:42:50.117 に答える
0

私はautoITが私のテストのJavaコードのほんの一部で問題を解決すると思いました

String[] commands = new String[]{};
commands = new String[]{"c:/test/attachFile.exe"};
Runtime.getRuntime().exec(commands);
于 2013-07-15T07:25:15.360 に答える