2011-02-01 50 views
1

我正在致力於在其他瀏覽器中驅動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元素相對於瀏覽器窗口左上角的屏幕座標?

+0

即使沒有框架或iframe,您是如何做到的?你是如何將「元素相對於瀏覽器窗口左上角的座標」翻譯成「元素相對於屏幕左上角的座標」的? – 2011-04-27 02:18:36

+0

接受的答案(這是我的)描述了正確的方法。此外,答案還包含指向解決方案的源文件(C++)的鏈接。 – JimEvans 2011-04-27 12:47:59

回答

0

該項目的正確方法是獲取包含框架或iframe元素的文檔,並循環瀏覽該父文檔中的一組框架,直到找到合適的框架。一旦出現,就可以使用document.parentWindow.frameElement()獲取或元素,並可以從那裏計算包含元素的位置。解決問題的實際代碼可以在ElementWrapper :: GetFrameOffset()中找到,其格式爲this link

0

您應該可以使用IDisplayServices :: TransformPoint。正如我記得你不能編組這個接口(我不知道爲什麼)......你如何使用它的跨進程?