ファイルアップロードのテスト

私の携わっているシステムでは、何箇所かファイルアップロードを行う機能があります。SeleniumJavaScriptで動作しており、通常はセキュリティの問題でファイルアップロード欄には入力("type")することはできないですが、Firefoxは設定を変更することで可能なようです。IEはどうあがいてもダメみたいです。。

以下のサイトを参考にしました。
File upload with Selenium
Fileupload with Selenium 0.7


Selenium Coreを使用する場合には、以下の方法でFirefoxによるファイルアップロード欄への入力が可能です。
1.Firefoxを起動しアドレスバーに"about:config"と入力し設定を呼び出す。
2."signed.applets.codebase_principal_support"プロパティを “true”に変更する。
3.Firefoxを再起動します。
4.SeleniumCoreにて"scripts/selenium-api.js"を開き、"Selenium.prototype.doType"を以下のように変更する(try〜を追加)。

if (this.browserbot.controlKeyDown || this.browserbot.altKeyDown || this.browserbot.metaKeyDown) {
    throw new SeleniumError("type not supported immediately after call to controlKeyDown() or altKeyDown() or metaKeyDown()");
}
try{
    netscape.security.PrivilegeManager.enablePrivilege("UniversalFileRead");
} catch (e) {
}
          
// TODO fail if it can't be typed into.
var element = this.browserbot.findElement(locator);
if (this.browserbot.shiftKeyDown) {
    value = new String(value).toUpperCase();
}
this.browserbot.replaceText(element, value);

5.テスト実行時に"ローカルファイルを読み書きする権限"についての確認ダイアログが表示されるので許可する。


Seleniumサーバ経由の場合には、毎回テンポラリなFirefoxプロファイルが作成されるので、上記の方法でFirefoxの設定を変更しても反映されず、"ローカルファイルを読み書きする権限"についての確認ダイアログが毎回表示されてしまい自動でテストできません。

Seleniumサーバが使用するFirefoxのプロファイルは、起動時の引数の"-firefoxProfileTemplate"でを指定することができるはずですが、私が試したところうまく指定したプロファイルを使ってくれませんでした。。なのでちょっと強引ですが、selenium-server.jarの"customProfileDirCUSTFF"にあるプロファイルを使用しているようので、ここにuser.jsというファイルを以下の内容で作成して動かしています。暫定的な対応ということで。。

user_pref('signed.applets.codebase_principal_support', true);
user_pref("capability.principal.codebase.p0.granted", "UniversalFileRead");
user_pref("capability.principal.codebase.p0.id", "http://localhost:8080");*1
user_pref("capability.principal.codebase.p0.subjectName", "");

2008/1/14 追加

最新版(1.0-beta2)では、上記の作業を行わなくてもファイルアップロード欄に入力可能でした。

2008/1/15 追加

こちらを参照。

*1:localhost:8080というのはテストするアプリケーションの動作するWebサーバのURLです