2010-07-13 4 views
1

다른 질문에서 말했듯이 저는 오픈 소스 브라우저 자동화 프레임 워크 (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 이벤트를 기다리는 방법은 무엇입니까?

답변

0

내비게이션 코드는 모두 비동기식이므로 DWBE2 :: BeforeNavigate2를 싱크하고 실행을 기다리면됩니다. 잠자기 할 필요없이 메시지 루프를 실행하십시오.

발생하기 전에 어떤 일이 일어나는지 알 수있는 방법이 없습니다. "<a> 태그와 같은 간단한 경우가 많이 있지만 IE를 탐색하는 방법은 거의 무한합니다. 예를 들어 onclick 처리기를 무작위 요소에 넣은 다음 setTimeout()을 사용하여 일부 브라우저에서 탐색합니다 부적절한 방법으로 탐색하거나 난수를 기반으로 탐색 할 수 있습니다. 또 다른 방법은 document.write()를 통해 window.location을 변경하는 javascript가 포함 된 CDATA 블록이 맨 위에있는 xsl 스타일 시트와 함께 xml 파일을 포함하는 것입니다 (심각하게 팝 - 차단까지)이 사건을 처리했다.

그래서, 기본적으로, 당신은 (즉 등의 HTML, 자바 스크립트 구문 분석) 선행 분석을 많이하지 않고 말할 수

.

+0

네,하지만 문제는 BeforeNavigate2 발사에 전혀 의존 할 수 없다는 것입니다. 클릭 할 요소가 링크가 아닌 div인데, 브라우저 자동화 프레임 워크의 경우에는 드문 경우가 아닌 경우를 생각해보십시오. 내가 원하는 것은 네비게이션이 일어날 것인지를 선험적으로 결정할 수 있고, 그렇다면 이벤트를 기다릴 수 있다는 것입니다. 슬프게도, 이것은 가능하지 않습니다. 현재 IHTMLElement에서 attachEvent를 실험하여 DOM이 클릭을 처리했지만 내 이벤트 핸들러가 호출되지 않았는지 확인합니다. – JimEvans

+0

말할 방법이 없습니다. 임의의 시간이 지난 후에 setTimeout()을 사용하여 브라우저를 탐색하는 onclick 핸들러를 등록 할 수 있습니다. 사실을 알리기위한 유일한 방법은 HTML과 자바 스크립트를 완전히 분석하고 분석하거나 타임머신을 만드는 것입니다. –

0

을 어떻게 가지고에 대해 BeforeNavigate2 이벤트 싱크가 이벤트를 발생시키기 전에 이벤트를 기다리는 클릭 메시지를 보내는 프로세스 (및 안전을위한 다른 일부 제한 시간)?

탐색을 성공적으로 수행 한 경우에만 다음 조치를 취해야하는 이유에 대한 설명에 사용자의 설명이 포함되어 있지 않은 것 같습니다. 사용자가 구성해야 할 수도 있습니다.

+0

다시 말하지만 탐색을 생성하는 클릭에 의존 할 수는 없습니다. 클릭이 DOM을 조작하는 JavaScript 함수를 실행하는 것일 수도 있습니다 (많은 JS 위젯 프레임 워크에서 공통적입니다). 탐색을 생성하지 않는 각 클릭에 대해 시간 초과 전체를 기다리고있을 것입니다.대기 동작의 이론적 근거는 탐색하는 클릭 후 자동 스크립트의 다음 동작이 대상 페이지를 대상으로 할 가능성이 높으므로 계속하기 전에 탐색이 완료 될 때까지 기다려야한다는 것입니다. – JimEvans

+0

자동화 스크립트에서 페이지로드를 기다리거나 섹션으로 스크립트를 중단하여 새로로드 된 페이지에서 실행되는 스크립트가 페이지로드로 인해 만료되도록 지정하는 방법이있을 것이라고 생각합니다. 이전 페이지로. 나에게 이것은 스크립트에서 결정되어야하며 click 명령의 설계에 맡겨져서는 안된다. –

관련 문제