我正在致力於在其他瀏覽器中驅動IE的browser automation framework。因此,我需要獲取用戶想要與之交互的元素的屏幕座標。我們用來獲取這些座標的主要方法是使用getBoundingClientRect()。問題是在IE中,這些座標總是相對於封閉文檔的左上角給出的。如果該元素位於frame/iframe中,則該元素可能不是該元素相對於瀏覽器窗口左上角的屏幕座標。在IE中,如何找到包含框架內元素的HTML元素的屏幕座標?
我通過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,您是如何做到的?你是如何將「元素相對於瀏覽器窗口左上角的座標」翻譯成「元素相對於屏幕左上角的座標」的? – 2011-04-27 02:18:36
接受的答案(這是我的)描述了正確的方法。此外,答案還包含指向解決方案的源文件(C++)的鏈接。 – JimEvans 2011-04-27 12:47:59