Help us understand the problem. What is going on with this article?

JavaからWinShotを利用する

More than 3 years have passed since last update.

WinShotのコマンドライン引数

WinShotは常駐型のソフトだという印象が強いですが、実はコマンドラインからも利用できます。

コマンドラインには以下のオプションを指定します。

機能オプション(必須)

引数 動作
-Print または -P 印刷
-Preview または -V プレビュー表示
-Copy または -C クリップボードへコピー
-Bitmap または -B ビットマップ保存
-Jpeg または -J JPEG保存

対象オプション(必須)

引数 動作
-ActiveWindow または-A アクティブウィンドウ
-Desktop または -D デスクトップ
-Rectangle または -R 矩形範囲指定
-Client または -CL クライアント領域

その他オプション(任意)

引数 動作
-Negative または -N ネガポジ反転
-Grayscale または -G グレースケール変換
-Close または -X キャプチャ後、常駐せずに終了

例えば、アクティブウィンドウをbitmapで保存したい場合は次のように実行します。

WinShot.exe -B -A -X

-Xが味噌です。WinShotは多重起動できないので-Xオプションで毎回終了させるようにしなければなりません。また、WinShotが起動した状態ではこのコマンドは利用できません。

出力ディレクトリや細かいオプションはコマンドラインからは指定できません。ちょっと残念。

Javaからの利用

Javaから利用するには愚直にexecします。はい。それだけです。

Process process = Runtime.getRuntime().exec(new String[]{"[WinShot.exeのパス]", "-J", "-A", "-X"});
process.waitFor();

Javaからの利用例

これの使い所は自動テストのキャプチャでしょう。もちろんテストフレームワークに付属しているスクリーンキャプチャメソッドを使えば良いのでしょうが、界隈によてテストエビデンスはWinShotで取るという暗黙の了解があったりします。暗黙の了解は満たしつつ自動化するための妥協案というわけです。

以下にSelenideと組み合わせた場合の例を示します。この例では次の3箇所でWinShotを使ってスクリーンキャプチャを取る例です。

  • Googleのページを開いた直後
  • 検索ワードを入力した直後
  • 検索結果を表示した直後
import static com.codeborne.selenide.Selenide.*;
import static org.junit.Assert.*;

import java.io.File;
import java.io.IOException;

import org.junit.After;
import org.junit.Test;

import com.codeborne.selenide.Condition;

public class HogeTest {

    private static final String WINSHOT_EXE = "C:\\Program Files (x86)\\WinShot\\WinShot.exe";
    private static final String WINSHOT_DEST_DIR = "C:\\winshot";
    private static final String REPORT_DIR = "report";

    @After
    public void スクリーンショットを保存用ディレクトリへ() {
        File reportDir = new File(REPORT_DIR);
        reportDir.mkdirs();
        File winshotDir = new File(WINSHOT_DEST_DIR);
        for (File child : winshotDir.listFiles()) {
            File destFile = new File(reportDir, child.getName());
            child.renameTo(destFile);
        }
    }

    @Test
    public void test() {
        open("http://www.google.co.jp/");
        printScreen();

        $("input[type=text]").val("テスト");
        printScreen();

        $("input[type=text]").pressEnter();
        $("#resultStats").waitUntil(Condition.appear, 5000);
        printScreen();
    }

    private void printScreen() {
        try {
            Process process = Runtime.getRuntime().exec(
                    new String[] { WINSHOT_EXE, "-J", "-A", "-X" });
            process.waitFor();
            int exitCode = process.exitValue();
            if (exitCode != 0) {
                fail("スクリーンショットを撮るのに失敗。終了コード:" + exitCode);
            }
        } catch (IOException | InterruptedException e) {
            fail("スクリーンショットを撮るのに失敗。");
        }
    }

}

【結果】


実行すると定数REPORT_DIRに定義したディレクトリにキャプチャした画像が格納されます。テスト内ではだだだっとキャプチャをとって、@Afterでファイルを移動するように作っています。実際は複数のテストがあるでしょうから、ファイル移動の部分はもう少し作り込む必要があるでしょう。

今回は以上

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away