1

我有一个特定的场景,可以通过 COM 和 IHtmlElement 访问 Internet Explorer 的某些部分,但不能(直接)通过 AutomationElements 的 GUI 树访问。(我必须使用树/层次结构来找到我的元素。那个特定的 Internet Explorer 的 GUI 树被破坏了(不知道它是通过自定义还是因为它是旧版本 - 它是给定的)。)

现在有一些我需要的 AutomationElement 属性并且无法从 IHtmlElement 中删除(实际上,从 IHtmlElement 获取此版本 IE 的属性已损坏,但将它们从 AutomationElement 中删除是可行的)。

我天真的方法是简单地获取 IHtmlElement 的坐标(通过 offsetParent 递归),然后使用 AutomationElement.FromPoint(x, y) 将它们转换为 AutomationElement。这当然不是很稳定(虽然工作还不错)。

我尝试通过窗口句柄进行转换,但是.. HTMLElements 似乎只拥有最外面元素的窗口句柄(我理解,否则网站会用掉很多句柄)。

我尝试了一些更“花哨”的方法,试图(再次)获取具有 IID_IAccessible 接口的 COM 对象(如果我将主文档用作 IServiceProvider,这似乎可以工作),但不幸的是,我以后不知道如何制作 AutomationElement我的 IAccessible 对象(来自IHTMLElement -> IAccessible的想法)。

非常欢迎对这种方法或如上所述的我的一般问题提供任何帮助!

一些粗略的代码可以让您了解我的方法(尽管现在我看到我不应该首先使用 mMainDocument ,而是我当前的元素 - 但这会用 null 填充 ae):

        Guid IID_IAccessible = new Guid("618736E0-3C3D-11CF-810C-00AA00389B71");
        IServiceProvider sp = (IServiceProvider)mMainDocument;
        Object ae = null;
        sp.QueryService(ref IID_IAccessible, ref IID_IAccessible, out ae);
        System.Windows.Automation.AutomationElement ae2 = System.Windows.Automation.AutomationElement.FromLocalProvider((System.Windows.Automation.Provider.IRawElementProviderSimple)ae);
        // ae is no AutomationElement, and the last line (with ae2) fails
4

0 回答 0