0

例として、非常に単純な UI を使用します。1Wつのボタン ( ) を持つウィンドウ ( と呼びますB)。コード化された UI の UIMap ではB、 の子ですW。つまり、マップの XML 仕様では、の「子孫」にB表示されます。W

ここで、open の 2 つのインスタンスがW同時にあるとします。と区別する検索プロパティがあります(たとえば、別のW1プロパティがあります) が、親以外で区別する方法はありません。W2NameB1B2W

次の手順でテストを実行します。

  1. ウィンドウの 2 つのインスタンスを開きW1W2
  2. の名前と一致Nameするように UIMap のプロパティを設定します。W UITestControlW1
  3. Mouse.Click()UIMap でaを実行しB UITestControlます。
  4. の名前と一致Nameするように UIMap のプロパティを設定します。W UITestControlW2
  5. Mouse.Click()UIMap でaを実行しB UITestControlます。

私の理解では、「常に検索」構成がない場合、これはステージ 3 と 5 の両方でクリックされることにつながりWます。したがって、私の質問は、次のシナリオで何が起こるかです。BB1

  • Bには「常に検索」が設定されていますが、設定されていWません。
  • Wには「常に検索」が設定されていますが、設定されていBません。
4

1 に答える 1

2

検索を常に構成しないと、エンジンは ui 要素を見つけた後にキャッシュします (キャッシュとは、その要素から取得した MSAA COM オブジェクトへの参照を保持することを意味します)。常に検索すると、あなたが言ったように常に要素を検索します。また、UITestControl.Find() はまったく同じことを行うため、Always Search 構成を設定したくない場合は明示的に使用できます。

コントロールの検索プロパティを変更すると、エンジンは次にそのコントロールを使用するときに要素を検索します (したがって、検索プロパティを変更した後、コントロールは ui 要素への参照を削除します)。ただし、子要素 (この場合はボタン) が既にキャッシュされていて、その親の検索プロパティを変更する場合は、ボタンで Find を呼び出す (または常に検索を設定する) 必要があります。そうしないと、エンジンはキャッシュされた ui 要素を使用します。

同じクラスの複数の UITestControl を使用する場合は、UIMap を忘れて、そのクラスの複数のインスタンスを作成し、それらの検索プロパティを個別に変更する必要があります。UIMap は、要素にアクセスするための単なる方法であり、要素の階層を担当しません。

だからあなたの場合:

var W1 = new MyWindowClass();
var W2 = new MyWindowClass();
W1.SearchProperties.Add( ... );
W2.SearchProperties.Add( ... );

次に、すべてが正しく設定されている場合、W1->B は W1 ウィンドウのボタンになり、W2->B は W2 ウィンドウのボタンになります。

W が最上位要素でない場合、UIMap から親を設定できます。

var W1 = new MyWindowClass(UIMap.UITopWindow);

次の質問も役立つ場合があります。

コード化された UI でアプリケーションの複数のインスタンスを操作する

コード化された UI の SwitchTo メソッド

于 2014-05-22T10:35:55.633 に答える