0

在我的测试应用程序中,我不断地打开和重新打开一个表单。每次打开表单时,我必须将表单上的所有元素都放入一个AutomationElementCollection,以便我可以对元素进行操作。但是,重复获取这些元素似乎很昂贵(由于树导航/上下文切换等)。

我试图围绕获取元素的方法设置一个布尔值。如果第一次调用该方法,它将正常运行,并将布尔值设置为 true。如果该方法被第二次调用,它将什么也不做,因为数组已经被填充了。

但是,当我尝试对AutomationElement数组中的任何一个(第二次)执行操作时,这些元素似乎不可用。关闭表单是否会以某种方式“禁用”这些元素?每次打开表单时我都必须找到这些元素,以使它们“新鲜”吗?

我看了看CacheRequest方法,但这似乎只与访问属性/模式有关,而不是与元素有关。

这是代码/错误消息:

AutomationElement GAP;
AutomationElementcollection GAP1;
private bool initGAP1 = false;
    public void initGAP()
    {
        if (!initGAP1)
        {
            int refnum = ...;
            int refnum2 = ...;
            AutomationElementCollection temp = MMChildren[refnum].FindAll(TreeScope.Children, findCondition);
            GAP = temp.FindAll(TreeScope.Children, findCondition)[refnum2];
            GAP1 = GAP.FindAll(TreeScope.Children, findCondition); //this contains the elements I want to operate on
            initGAP1 = true;
        }
    }

System.Windows.Automation.ElementNotEnabledException:引发了“System.Windows.Automation.ElementNotEnabledException”类型的异常。

4

1 回答 1

2

您需要为每个新窗口重新获取自动化元素。据我了解 UI 自动化框架,它为您提供了调查正在运行的窗口的方法。它将使用不同的技术收集信息,具体取决于目标应用程序使用的框架类型。在您的情况下,如果您创建和销毁窗口实例,它们将被视为不同的 AutomationElements,因为它们是不同的窗口(基本上它们在操作系统中具有不同的窗口句柄)。即使底层控制代码相同,它们也是操作系统的不同实例,因此是 UI 自动化。

如果您在遍历中遇到性能问题,则可能值得考虑改用 UI 自动化 COM API,这在某些操作上要快得多。

于 2012-04-01T20:32:11.257 回答