Как я могу определить, когда BeforeNavigate2 будет сгенерирован щелчком мыши, и ждать события? - PullRequest
1 голос
/ 13 июля 2010

Как я уже говорил в других вопросах, я участвую в инфраструктуре автоматизации браузера с открытым исходным кодом ( Selenium WebDriver ) и испытываю трудности с IE. Фреймворк использует внешний процесс, написанный на C ++, а не объект Browser Helper Object (BHO). Клики по элементам генерируются с использованием сообщений Windows (WM_LBUTTONDOWN и WM_LBUTTONUP), а не симулированных кликов через COM. Обоснование этого дизайнерского решения можно найти в вики проекта здесь .

Чтобы определить, запущена ли навигация, код драйвера присоединяется к событию DWebBrowserEvents2 :: BeforeNavigate2. Однако после того, как сообщения о щелчках отправляются в окно IE, возникает некоторая задержка между возвратом SendMessage (указывающим на то, что цикл обработки сообщений IE обработал сообщение), и тем, когда сработает BeforeNavigate2. Я полагаю, что мог бы использовать attachEvent, чтобы прикрепить функцию обратного вызова к событию onclick элемента HTML и дождаться его обработки, но я не уверен, будет ли это синхронно с событием BeforeNavigate2.

Без вызова функции Windows Sleep () в течение произвольного промежутка времени, как я могу ждать события BeforeNavigate2 после отправки щелчка мыши, имитируемого сообщениями Windows?

Ответы [ 2 ]

0 голосов
/ 13 октября 2010

Как насчет того, чтобы приемник событий BeforeNavigate2 вызывал событие, а процесс отправлял сообщение о клике, ожидающее событие (и некоторое другое время ожидания для безопасности)?

Похоже, оно не рассматривается в вашемописание того, почему вы хотели бы подождать, если следующее действие после щелчка произойдет только в том случае, если навигация прошла успешно - может быть, это должно быть настроено пользователем?

0 голосов
/ 14 июля 2010

Весь навигационный код является асинхронным, поэтому все, что вы можете сделать, это получить DWBE2 :: BeforeNavigate2 и дождаться его запуска.Вам не нужно спать, просто включите цикл обработки сообщений.

Невозможно сказать, что произойдет до того, как это произойдет.Есть много простых случаев, таких как "это тег <a>, но существует почти бесконечное число способов навигации по IE. Один из примеров - установка обработчика onclick на случайный элемент и затем использование setTimeout()перемещаться по браузеру некоторым хитрым способом или перемещаться на основе случайного числа. Другой способ - встроить XML-файл с таблицей стилей xsl с блоком CDATA в верхней части, который содержит javascript, который изменяет window.location через document.write () (серьезно - блокировщик всплывающих окон должен был обработать этот случай).

Так что, по сути, вы не можете сказать, не выполнив много предварительного анализа (т. е. проанализируйте HTML, javascript и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...