2011-02-01 4 views
1

저는 다른 브라우저에서 IE를 구동하는 browser automation framework에서 일하고 있습니다. 따라서 사용자가 상호 작용하려는 요소의 화면 좌표를 가져와야합니다. 이러한 좌표를 얻는 데 사용하는 기본 방법은 getBoundingClientRect()를 사용하는 것입니다. 문제는 IE에서 이러한 좌표는 항상 둘러싸는 문서의 왼쪽 위 모서리를 기준으로합니다. 요소가 프레임/iframe에 있으면이 요소는 브라우저 창의 왼쪽 상단 모서리를 기준으로 한 요소의 화면 좌표가 아닐 수 있습니다.IE에서 프레임 내의 요소를 포함하여 HTML 요소의 화면 좌표를 찾는 방법은 무엇입니까?

저는 C++을 통해 COM을 사용하여 브라우저를 구동합니다.이 C++ 드라이버 레이어를 통해 JavaScript를 실행할 수는 있습니다. 나는 또한 아웃 오브 프로세스 (out-of-process)를 추진 중이며, 이는 브라우저 도우미 개체 (BHO 또는 IE 추가 기능) 내에서 실행되지 않는다는 것을 의미합니다. BHO로 이동하는 것은이 프로젝트의 옵션이 아닙니다. IE 6, 7, 8 및 9를 사용하지 않고 브라우저에서 브라우저 호환성을 걱정할 필요가 없습니다. 저에게 jQuery 또는 유사한 것을 사용하는 것은 실제로는 불가능하지만 JavaScript 라이브러리를 사용하는 솔루션이있는 경우 프로젝트에서 사용할 수있는 솔루션을 리버스 엔지니어링 할 수 있습니다. 자바 스크립트 내에서

  • 사용 element.ownerDocument.parentWindow.frameElement :

    는 여기에 지금까지 시도한 몇 가지 있습니다. 포함하는 문서와 프레임 내의 문서가 다른 도메인에있는 경우이 작업은 실패합니다.

  • 프레임 내의 요소가 포함 된 창에서 IHTMLWindow4 :: get_frameElement()를 사용하십시오. 위의 JavaScript 메소드와 동일한 C++이어야합니다. 그러나, 그것을 사용하려고하면 E_NOINTERFACE를 반환합니다.
  • IDisplayServices :: TransformPoint()를 사용하여 요소 왼쪽 위 모퉁이의 좌표를 다른 참조 프레임으로 변환합니다. 이것은 교차 프로세스로 작동하지 않는 것으로 보입니다.

대상 요소가 프레임 또는 iframe 내에있을 때 브라우저 창의 왼쪽 위 모서리를 기준으로 HTML 요소의 화면 좌표를 찾거나 계산하려면 어떻게해야합니까?

+0

프레임 또는 iframe없이 어떻게 처리 했습니까? "브라우저 창의 왼쪽 위 모서리를 기준으로 요소의 좌표"를 "화면의 왼쪽 상단 모서리를 기준으로 요소 좌표"로 어떻게 변환 했습니까? –

+0

허용 된 대답 (내 것임)은 올바른 접근 방식을 설명합니다. 또한 해답에는 솔루션을 시연하는 소스 파일 (C++)에 대한 링크가 있습니다. – JimEvans

답변

0

이 프로젝트의 올바른 접근법은 프레임 또는 iframe 요소가 포함 된 문서를 가져 와서 적절한 프레임을 찾을 때까지 해당 부모 문서의 프레임 세트를 반복하는 것입니다. 일단 거기에서 document.parentWindow.frameElement()를 사용하여 또는 요소를 가져올 수 있으며 거기에서 포함하는 요소의 위치를 ​​계산할 수 있습니다. 문제를 해결하는 실제 코드는 ElementWrapper :: GetFrameOffset()에서 this link에 있습니다.

0

IDisplayServices :: TransformPoint를 사용할 수 있어야합니다. 내가이 인터페이스를 마샬링 할 수는 없다는 것을 기억한다. (왜 그런지 모르겠다) ... 어떻게 교차 프로세스를 사용하고 있는가?

+0

@jeffmaphone IE 및 OS의 버전에 따라 CreateProcess() 또는 IELaunchURL()을 사용하여 브라우저를 시작한 다음 WM_HTML_GETOBJECT와 함께 SendMesssage()를 사용하여 IHTMLDocument2 객체에 대한 참조를 가져옵니다. 거기에서 부모 창을 가져올 수 있으며 QueryService를 사용하여 IWebBrowser2 개체까지 이동할 수 있습니다. 이 코드는 [이 링크] (http://selenium.googlecode.com/svn/trunk/cpp/IEDriver/BrowserFactory.cpp)에서 확인할 수 있습니다. – JimEvans

관련 문제