【トラブル】Selenium に関するトラブルシューティング ~ ファイルダウンロード編 ~

 【1】ファイルダイアログが表示されてしまう

ZIPファイルをダウンロードするサイトに対して、

http://design-ambience.com/wordpress/?p=114

などのサイトを参考に、ファイルダイアログ(下記「ダイアログ表示内容」を参照)が表示されないような
JUnitテストコード(下記「サンプル」を参照)を組んだが、
ファイルダイアログが表示されてしまう。

 ダイアログ表示内容

ファイル名

  ファイルの種類: HTMLドキュメント
  ファイルの場所: http://localhost:8080

 サンプル

@Test
public void DownloadSample() throws Exception {
   // プロファイルの作成
   FirefoxProfile profile = new FirefoxProfile();
   // ダウンロードするファイルの保存先フォルダを指定
   //  0:デスクトップ 1:ダウンロードフォルダ 2:ダウンロードに指定された最後のフォルダ
   profile.setPreference("browser.download.folderList", 0);
   // ダウンロードするファイルの保存先フォルダが指定してあればそれを使う
   profile.setPreference("browser.download.useDownloadDir", true);
   // ダウンロードフォルダ
   profile.setPreference("browser.download.dir","c:/temp");
   // 指定したmimeタイプは有無を言わさずダウンロードする
   profile.setPreference("browser.helperApps.neverAsk.saveToDisk",
         "text/plain, application/vnd.ms-excel, text/csv, application/zip, text/comma-separated-values, application/octet-stream");
   // ダウンロードダイアログを見せないようにする
   profile.setPreference("browser.download.manager.showWhenStarting", false);

 対応策

修正前

// 指定したmimeタイプは有無を言わさずダウンロードする
profile.setPreference("browser.helperApps.neverAsk.saveToDisk",
         "text/plain, application/vnd.ms-excel, text/csv, application/zip, text/comma-separated-values, application/octet-stream");

修正後(「text/html」を追加)

// 指定したmimeタイプは有無を言わさずダウンロードする
profile.setPreference("browser.helperApps.neverAsk.saveToDisk",
         "text/html, text/plain, application/vnd.ms-excel, text/csv, application/zip, text/comma-separated-values, application/octet-stream");

 補足

 * 今回、ファイルダイアログの表示が「ファイルの種類: HTMLドキュメント」だったので、「text/html」を追加したが、
   もし、ファイルの種類が違えば、別の対応をする必要がある

 【2】エラー「ClientAbortException ... java.net.SocketException: Broken pipe」が表示されてしまう

 * 以下のサンプルにあるようなコードで、ファイルダウンロード試験していたら、
 サーバ側で、エラー「ClientAbortException ... java.net.SocketException: Broken pipe」が表示されてしまう

 サンプル

@Test
public void DownloadSample() throws Exception {

   // プロファイルの作成
   FirefoxProfile profile = new FirefoxProfile();
   // ダウンロードするファイルの保存先フォルダを指定
   //  0:デスクトップ 1:ダウンロードフォルダ 2:ダウンロードに指定された最後のフォルダ
   profile.setPreference("browser.download.folderList", 0);
   // ダウンロードするファイルの保存先フォルダが指定してあればそれを使う
   profile.setPreference("browser.download.useDownloadDir", true);
   // ダウンロードフォルダ
   profile.setPreference("browser.download.dir","c:/temp");
   // 指定したmimeタイプは有無を言わさずダウンロードする
   profile.setPreference("browser.helperApps.neverAsk.saveToDisk",
         "text/plain, text/plain, application/vnd.ms-excel, text/csv, application/zip, text/comma-separated-values, application/octet-stream");
   // ダウンロードダイアログを見せないようにする
   profile.setPreference("browser.download.manager.showWhenStarting", false);

   // 作成したプロファイルでFirefox(のドライバー)を起動する
   driver = new FirefoxDriver(profile);
   driver.get("http://localhost:8080/");

   FileLoader(driver);

   driver.quit();
}

private static void FileLoader(WebDriver driver) throws InterruptedException {
   WebElement download = driver.findElement(By.linkText("Download"));
   // ここでダウンロードする
   download.click();

   // ダウンロードファイルの確認処理(省略)
}

 原因

 * ダウンロードを行った直後に、ダウンロードファイルの確認処理を行ってしまっている。
   ただ、ダウンロードがまだ完了していないので、確認処理でファイルがなくて、エラーとしてしまっている
   エラーになると、Client側でダウンロード処理を中断するので、「ClientAbortException」が発生する

 対応策(サンプルを修正)

   download.click();

   // ★ここを追加★
   Thread.sleep(3000);

   // ダウンロードファイルの確認処理(省略)

関連記事

Selenium IDE
https://dk521123.hatenablog.com/entry/2015/05/19/233246
Selenium WebDriver + Java ~ 初期設定編 ~
https://dk521123.hatenablog.com/entry/2015/05/12/230924
Selenium に関するトラブルシューティング ~ 設定編 ~
https://dk521123.hatenablog.com/entry/2015/05/11/210707