質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1646閲覧

Friendlyを使用したフォームアプリのテスト実施後の画面キャプチャ取得方法

JanTh1989

総合スコア87

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

2クリップ

投稿2019/03/26 07:58

<前提>
C#で生成しているフォームアプリの結合テストを、Codeer.Friendlyを用いた自動化テストによる実施を考えています。
Codder.Friendlyは、テスト対象のフォームアプリとは別のプロジェクトの単体テストプロジェクトで使用しています。
実際に各テストケースの動作自体はできました。

<問題>
この結合テストは、テストケース実施後、フォームアプリのキャプチャをエビデンスとして残したいです。
しかし、スクリーン全体であれば取得も可能なのですが、フォームアプリのみの画像に絞ろうとすると方法が分かりません。
フォームサイズなどは、WindowControlクラスから取得できるようなのですが、位置情報の取得に難航という状況です。
ProcessクラスやWindowsAppFriendクラスなどから取得できないかなども調査していますが、こちらも遅々として進まずといった具合です。
Codeer.Friendlyを用いたウィンドウキャプチャ取得方法はないでしょうか?

例)

C#

1// 実行ボタンクリックを経由して、テキストボックスの値をラベルに表示する動作のフォームアプリ対象 2namespace FriendlyTest 3{ 4 [TestClass] 5 public class FriendlyTest 6 { 7 Process process; 8 WindowsAppFrinend App; 9 WindowControl Form; 10 FormsButton ExeButton; 11 FormsTextBox MessageTextBox; 12 FormsLabel MessageLabel; 13 14 [TestInitialize] 15 public void TestInitialize() 16 { 17 process = Process.Start("Sample.exe"); 18 App = new WindowsAppFriend(process); 19 WindowControl = new WindowControl(App.Type<Application>().OpenForms[0]); 20 ExeButton = new FormsButton(Form.Dynamic().ExeButton); 21 MessageTextBox = new FormsTextBox(Form.Dynamic().MessageTextBox); 22 MessageLabel = new FormsLabel(Form.Dynamic().MessageLabel); 23 } 24 25 [TestCleanup] 26 public void TestCleanup() 27 { 28 Process.GetProcessById(App.ProcessId).CloseMainWindow(); 29 } 30 31 private void SaveCapture(string filePath) 32 { 33 Bitmap bmp = new Bitmap(Form.Size.Width, Form.Size.Height, PixelFormat.Format32bppArgb); 34 using (Graphics g = Graphics.FromImage(bmp)) 35 { 36 g.CopyFromScreen(X位置, Y位置, 0, 0, Form.Size, CopyPixelOperation.SourceCopy); 37 // ↑この処理の第1引数、第2引数の値に難航しています。 38 } 39 bmp.Save(filePath, ImageFormat.Png); 40 } 41 42 [TestMethod] 43 public void テストケース001() 44 { 45 string inputMessage = "メッセージ"; 46 47 MessageTextBox.EmulateChangeText(inputMessage); 48 ExeButton.EmulateClick(); 49 50 Assert.AreEqual(inputMessage, MessageLabel.Text); 51 52 SaveCapture(MethodBase.GetCurrentMethod().Name + ".Png"); 53 } 54 } 55} 56

<補足>
開発言語:C#
開発環境:VisualStudio2015 Professional
.NET:バージョン4.6

IYEMON018👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

いえいえー。
ちなみにDynamic関数はdynamic型を戻します。
それにプロパティがあるというより、Formクラスのプロパティを対象プロセスで実行して、その値を取得するという意味です。

C#

1//これで対象プロセスのオブジェクトへの参照を取得できる 2//普通にFormのAPI(というかそれを継承したクラスのAPI)を全部使える 3//ていうか、これもApplicationクラスのプロパティを対象プロセス内で実行している 4dynamic form = App.Type<Application>().OpenForms[0]; 5 6//これはそれをラップしたもの 7var wrap = new WindowControl(form); 8 9//dynamicはラップを外してdyanmicに戻す 10dynamic form2 = wrap.Dynamic(); 11 12//ややこしいんだけど、これは相手プロセス内のオブジェクトへの参照が取得できる 13//オブジェクトはまだ相手プロセスの中にある 14dynamic p = form.Location; 15 16//実際の型に代入することで、コピーを取得できる 17//この瞬間にコピーが対象プロセスから転送されてくる 18Point pos = p; 19 20//ちなみにAPIは全部使えます 21//例えばBackColorとかも 22//これもColorをシリアライズして対象プロセスへ転送して代入しています。 23form.BackColor = Color.Red; 24

Friendlyの本質は別プロセスのAPIを外部から全部呼び出すというものです。
GitHubのドキュメントとか、私のブログとかを参照お願いします。
https://github.com/Codeer-Software/Friendly
ささいなことですが
疑問点あれば、また質問してくださいねー。
それから、Codeerではテスト自動化支援とか実装補助ツール販売とかやってますので、そちらのご利用も是非w

投稿2019/03/28 14:23

codeer-ishikawa

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/03/29 02:31

詳細情報までありがとうございます。 先の回答内容で実装してみた結果、求めていた通りのエビデンスファイルが作れました。 これで進めていこうと思います。 その他ツールにつきましては、自社の人と相談して検討ということでw
codeer-ishikawa

2019/03/29 13:34

上手くいって良かったですね。 >自社の人と相談して検討ということでw よろしくお願いしますw
guest

0

ベストアンサー

作者です。Friendlyのエゴサで見つけました。
こんな感じでいかがでしょうか?

c#

1var form = new WindowControl(App.Type<Application>().OpenForms[0]); 2 3//左上 4Point pos = form.Dynamic().Location; 5Size size = form.Dynamic().Size; 6Bitmap bmp = new Bitmap(size.Width, size.Height, PixelFormat.Format32bppArgb); 7using (Graphics g = Graphics.FromImage(bmp)) 8{ 9 g.CopyFromScreen(pos.X, pos.X, 0, 0, size, CopyPixelOperation.SourceCopy); 10 Clipboard.SetDataObject(bmp, true); 11} 12

投稿2019/03/27 14:02

codeer-ishikawa

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/03/27 15:06

ご回答ありがとうございます。 作者様から回答が来るとは思いませんでした。 感謝極まりという感じです。 WindowControlクラス直下の情報しか見れていませんでした。 Dynamic関数にLocationプロパティがあるのは盲点でした・・・。 作業は自社PCになってくるので、確認は明日となってしまいますが、明日朝一で見てみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問