3

UI要素を検索するメソッドを使用します。

public static bool findtopuielm(string uiitemname)
        {
            bool res = false;
            try
            {
                AutomationElement desktopelem = AutomationElement.RootElement;
                if (desktopelem != null)
                {
                    Condition condition = new PropertyCondition(AutomationElement.NameProperty, uiitemname);
                    AutomationElement appElement = desktopelem.FindFirst(TreeScope.Descendants, condition);
                    if (appElement != null)
                    {
                        res = true;
                    }

                }
                return res;
            }
            catch (Win32Exception)
            {
                // To do: error handling
                return false;
            }
        }

このメソッドは、デスクトップに表示されるまで要素を待機する別のメソッドによって呼び出されます。

public static void waittopuielm(string appname, int retries = 1000, int retrytimeout = 1000)
        {
        for (int i = 1; i <= retries; i++)
        {
            if (findtopuielm(appname))

                break;
                Thread.Sleep(retrytimeout);

            }
        }

たとえば、最後の関数を呼び出すと、次のようになります。

waittopuielm( "テスト");

要素が見つからない場合でも常にtrueを返します。その場合、テストを失敗させます。どんな提案でも歓迎されます。

4

1 に答える 1

2

waittopuielemメソッドがvoidを返すようです-ブール値を返すこのバージョンのようなものを投稿するつもりでしたか?

    public static bool waittopuielm(string appname, int retries = 1000, int retrytimeout = 1000)
    {
        bool foundMatch = false;
        for (int i = 1; i <= retries; i++)
        {
            if (findtopuielm(appname))
            {
                foundMatch = true;
                break;
            }
            else
            {
                Console.WriteLine("No match found, sleeping...");
            }
            Thread.Sleep(retrytimeout);
        }
        return foundMatch;
    }

それ以外は、あなたのコードは私にとって期待通りに機能しているようです。

1つの提案:findtopuielmメソッドで、デスクトップ要素検索のTreeScope値をTreeScope.DescendantsからTreeScope.Childrenに変更します。

AutomationElement appElement = desktopelem.FindFirst(TreeScope.Children, condition);

TreeScope.Descendantsは、おそらく必要以上に再帰的な検索を実行しています。デスクトップ要素のすべての子と、それらの要素(ボタン、編集コントロールなど)のすべての子が検索されます。

したがって、NameProperty PropertyConditionをAndCondition内の他のプロパティと組み合わせて検索を絞り込まない限り、比較的一般的な文字列を検索するときに間違った要素を見つける可能性が高くなります。

于 2012-12-23T00:10:00.680 に答える