タイトルの通りです。
UI オートメーションを使用したコードの検証 を初めて使ったんですが、ハマってしまいました。
操作の記録とコード化された UI テストのトラブルシューティング には、「IME がサポートされていない」と載っています。
IME がサポートされてないから、Control.ImeMode プロパティ (System.Windows.Forms) を設定していると NG ってこと?
再現コード
Form1.cs
using System.Windows.Forms; namespace CodedUITest検証 { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Shown += (sender, e) => { this.textBox1.ImeMode = ImeMode.Hiragana; }; } } }UIMap.Designer.cs の一部抜粋
public void RecordedMethod1() { #region Variable Declarations WinComboBox uI名前OComboBox = this.UIファイル名を指定して実行Window.UIItemWindow.UI名前OComboBox; WinEdit uI名前OEdit = this.UIファイル名を指定して実行Window.UIItemWindow1.UI名前OEdit; WinEdit uITextBox1Edit = this.UIForm1Window.UITextBox1Window.UITextBox1Edit; WinButton uI閉じるButton = this.UIForm1Window.UIForm1TitleBar.UI閉じるButton; #endregion // キーボード ショートカット キー 'Windows + R' を押す Keyboard.SendKeys(this.RecordedMethod1Params.SendKeys, ModifierKeys.Windows); // '名前(O):' コンボ ボックス の 'C:\〜\CodedUITest検証\CodedUITest検証\bin\Release\CodedUITest検証.exe' をオン uI名前OComboBox.EditableItem = this.RecordedMethod1Params.UI名前OComboBoxEditableItem; // '名前(O):' テキスト ボックス に '{Enter}' を入力 Keyboard.SendKeys(uI名前OEdit, this.RecordedMethod1Params.UI名前OEditSendKeys, ModifierKeys.None); // 'textBox1' テキスト ボックス に 'あいうえお' を入力 uITextBox1Edit.Text = this.RecordedMethod1Params.UITextBox1EditText; // ここで例外が発生! // クリック '閉じる' ボタン Mouse.Click(uI閉じるButton, new Point(26, 6)); }
例外の内容は
テスト メソッド CodedUITest.CodedUITest1.CodedUITestMethod1 が例外をスローしました: Microsoft.VisualStudio.TestTools.UITest.Extension.PlaybackFailureException: コントロールに対しては 'Text の SetProperty (値 "あいうえお")' を実行できません。 追加詳細: TechnologyName: 'MSAA' ControlType: 'Edit' ---> System.Runtime.InteropServices.COMException: HRESULT からの例外: 0xF004F006
で、これを回避するために該当の箇所を次の様に変更しました。
// uITextBox1Edit.Text = this.RecordedMethod1Params.UITextBox1EditText; Keyboard.SendKeys(uITextBox1Edit, this.RecordedMethod1Params.UITextBox1EditText + "{ENTER}", ModifierKeys.None);
こうする事で、例外は発生しなくなりました。
ただ、これが正しい回避方法なのか分かりません。*1
*1:NG なケースがあるかもしれません。