다른 질문에서 말했듯이 저는 오픈 소스 브라우저 자동화 프레임 워크 (Selenium WebDriver)에 기여하고 IE에 어려움을 겪고 있습니다. 프레임 워크는 BHO (Browser Helper Object)가 아닌 C++로 작성된 외부 프로세스를 사용합니다. 요소를 클릭하면 COM을 통해 시뮬레이션 된 클릭이 아닌 Windows 메시지 (WM_LBUTTONDOWN 및 WM_LBUTTONUP)를 사용하여 생성됩니다. 이 디자인 결정에 대한 정당성은 프로젝트 위키 here에서 확인할 수 있습니다.마우스 클릭으로 BeforeNavigate2가 생성되고 이벤트가 발생할 때를 어떻게 확인할 수 있습니까?
탐색이 시작되었는지 확인하기 위해 드라이버 코드가 DWebBrowserEvents2 :: BeforeNavigate2 이벤트에 첨부됩니다. 그러나 클릭 메시지가 IE 창으로 전송 된 후 SendMessage가 반환 할 때까지 (IE 메시지 루프가 메시지를 처리 한 것을 나타냄) BeforeNavigate2가 실행될 때까지 약간의 지연이 있습니다. attachEvent를 사용하여 HTML 요소의 onclick 이벤트에 콜백 함수를 연결하고 처리 할 때까지 기다릴 수 있다고 가정합니다. 그러나 BeforeNavigate2 이벤트와 동기화 될지 확실하지 않습니다.
Windows Sleep() 함수를 임의의 시간 동안 호출하지 않으면 Windows 메시지로 시뮬레이션 한 마우스 클릭을 보내고 BeforeNavigate2 이벤트를 기다리는 방법은 무엇입니까?
네,하지만 문제는 BeforeNavigate2 발사에 전혀 의존 할 수 없다는 것입니다. 클릭 할 요소가 링크가 아닌 div인데, 브라우저 자동화 프레임 워크의 경우에는 드문 경우가 아닌 경우를 생각해보십시오. 내가 원하는 것은 네비게이션이 일어날 것인지를 선험적으로 결정할 수 있고, 그렇다면 이벤트를 기다릴 수 있다는 것입니다. 슬프게도, 이것은 가능하지 않습니다. 현재 IHTMLElement에서 attachEvent를 실험하여 DOM이 클릭을 처리했지만 내 이벤트 핸들러가 호출되지 않았는지 확인합니다. – JimEvans
말할 방법이 없습니다. 임의의 시간이 지난 후에 setTimeout()을 사용하여 브라우저를 탐색하는 onclick 핸들러를 등록 할 수 있습니다. 사실을 알리기위한 유일한 방법은 HTML과 자바 스크립트를 완전히 분석하고 분석하거나 타임머신을 만드는 것입니다. –