2

を使用して古いプログラムを操作していUIAutomationます。私が抱えている問題は、を使用してボタンを押すことInvokePatternです。

エクスプローラ ウィンドウを開くボタンを押してAutomationElementウィンドウの を取得した後AutomationELement、「開く」ボタンの 、実際にはSplitButton. 要素を簡単に見つけることができますが、コントロールではなくペイン コントロールとして表示されSplitButtonます。ただし、Button 要素を探す前にブレークポイントを挿入し、デバッグ モードでコードを手動でステップ実行すると、[開く] ボタンがボタンとして認識されます。

要素を見つけた後にブレークポイントを挿入するButtonと、要素の名前と要素AutomationIDは正しいですがControlType、ボタンではなくペインです。エクスプローラー ウィンドウを取得した後に遅延を入れても問題ありません。デバッグ中にのみ機能します。奇妙です。

問題のあるコードは次のとおりです。

InvokePattern bPattern = (InvokePattern)button.GetCurrentPattern(InvokePattern.Pattern);
        bPattern.Invoke();

        for (int wait = 0; wait < 50; wait++)
        {
            if (explorerWindow != null)
                break;

            explorerWindow = reportWindow.FindFirst(TreeScope.Children,
                                            new PropertyCondition(AutomationElement.NameProperty, "Select Report"));

            Thread.Sleep(200);
        }

        explorerOpenButton = explorerWindow.FindFirst(TreeScope.Children,
                                new PropertyCondition(AutomationElement.NameProperty, "Open"));
4

1 に答える 1

0

ボタンの名前用とボタンのクラス名用 ( ? )のAndCondition2 つの を含む を作成してみてください。ウィンドウを探すときに行ったように、そのロジックを while/for ループ内に配置します。そのようです:PropertyConditionSplitButton

var andCondition = new AndCondition(new PropertyCondition(AutomationElement.NameProperty, "Open"), new PropertyCondition(AutomationElement.ClassNameProperty, "SplitButton"));

名前が同じでクラス名が異なる 2 つの要素が、ビジュアル ツリーの同じ階層に何らかの形で表示される可能性があると思います。

それでも問題が解決しない場合は、同じ方法でプロパティをクエリして、RuntimeId返されるかどうかを確認してください。

于 2013-09-06T11:40:57.267 に答える