【发布时间】:2020-01-07 06:56:43
【问题描述】:
我正在开发一个browser automation framework,在其他浏览器中驱动IE。因此,我需要获取用户想要与之交互的元素的屏幕坐标。我们用来获取这些坐标的主要方法是使用 getBoundingClientRect()。问题是在 IE 中,这些坐标总是相对于封闭文档的左上角给出。如果元素在 frame/iframe 中,这可能不是元素相对于浏览器窗口左上角的屏幕坐标。
我通过 C++ 使用 COM 来驱动浏览器,尽管我能够通过该 C++ 驱动程序层执行 JavaScript。我也在将它驱动到进程外,这意味着我没有在浏览器帮助对象(BHO 或 IE 插件)中执行。迁移到 BHO 不是该项目的选择。除了使用 IE 6、7、8 和 9 之外,我不必担心我能找到的任何方法的跨浏览器兼容性。使用 jQuery 或类似的东西对我来说确实不是一个选项,但如果有一个使用 JavaScript 库的解决方案,我可能能够逆向工程一个可以在项目中使用的解决方案。
以下是我迄今为止尝试过的一些事情:
- 在 JavaScript 中使用 element.ownerDocument.parentWindow.frameElement。如果包含文档和框架内的文档位于不同的域中,这将失败。
- 在包含框架内元素的窗口上使用 IHTMLWindow4::get_frameElement()。这应该是上面 JavaScript 方法的 C++ 等价物;但是,当我尝试使用它时,它会返回 E_NOINTERFACE。
- 使用 IDisplayServices::TransformPoint() 将元素左上角的坐标转换为不同的参考系。这似乎不能跨进程工作。
当目标元素可能存在于框架或 iframe 中时,如何查找或计算 HTML 元素相对于浏览器窗口左上角的屏幕坐标?
【问题讨论】:
-
即使没有框架或 iframe,您是如何做到的。您是如何将“元素相对于浏览器窗口左上角的坐标”转换为“元素相对于屏幕左上角的坐标”的?
-
接受的答案(这是我的)描述了正确的方法。此外,答案还有一个指向演示解决方案的源文件 (C++) 的链接。
标签: c++ internet-explorer com