Как я могу имитировать ввод мыши в Internet Explorer, не требуя, чтобы окно имело фокус? - PullRequest
1 голос
/ 28 июня 2011

Я работаю над фреймворком автоматизации браузера, одним из основных принципов которого является взаимодействие с браузером настолько близко, насколько это возможно пользователю, без необходимости фокусировки окна браузера.Чтобы смоделировать нажатие, зависание и перетаскивание элементов, мне нужно выполнить эти события, используя механизмы на уровне собственной ОС, а не смоделированные события JavaScript.С этой целью я ищу лучший способ заставить IE правильно реагировать на симулированные события мыши.

Использование методов JavaScript или COM для симуляции ввода мыши проблематично, так как они могут блокироваться, если, например,, появляется предупреждение JavaScript () или диалоговое окно выбора файла.

Использование API SendMessage ненадежно. Это сообщение в блоге Раймонда Чена говорит о вводе с клавиатуры, но в равной степени применимо и к вводу с помощью мыши.Сначала может показаться, что использование SendMessage (или PostMessage ) работает, но такие вещи, как наведение на элементы, не будут работать дольше доли секунды.

SendInput API предназначен для имитации чистого ввода в очереди ввода событий мыши и клавиатуры, но делает это на очень низком уровне .Таким образом, для получения ввода от мыши требуется, чтобы окно IE имело фокус.

Существует ли надежный способ имитировать ввод мыши в IE с использованием событий на уровне ОС, не требуя, чтобы окно имело фокус?Если ответ действительно так: «Нет, нет способа выполнить то, что вы хотите», я был бы признателен за указатель на авторитетный источник, описывающий, почему это так для IE.

Ответы [ 2 ]

0 голосов
/ 28 июня 2011

Полагаю, это касается вашей работы с Selenium. Я должен был сделать очень очень похожую вещь в какой-то момент. Насколько я знаю, это невозможно без выделения фокуса окна и последующей имитации реальных событий мыши с помощью SendInput (). Когда я посмотрел на это, я проснулся после нескольких дней расследования и прибег к чрезвычайно хакерскому решению. Возможно, вы не хотите этого делать, но в крайнем случае я перепроектировал часть IE и нашел обработчик, который сопоставил событие, которое я хотел. Затем я написал код, который сканировал определенную байтовую сигнатуру, соответствующую этому обработчику. К счастью, так получилось, что этот конкретный фрагмент кода не сильно изменился по сравнению с версиями IE, для которых мне нужно было протестировать. Затем я внедрил DLL в IE, который сканировал эту сигнатуру во время выполнения, чтобы динамически получить адрес обработчика. DLL использовала IPC для получения команд из другого исполняемого файла, который соответствующим образом вызывал бы эти обработчики.

Я настоятельно рекомендую не использовать этот метод, если у вас нет альтернативы, хотя из-за того, насколько он хакерский и хотя он может работать в настоящее время, нет никакой гарантии, что он продолжит работать для будущих обновлений IE. Конечно, мне не нужно говорить вам это; )

PS. Я не знаю, повезет ли вам с AttachThreadInput () , хотя я думаю, вы обнаружите, что у вас все еще будут проблемы с фокусом окна.

0 голосов
/ 28 июня 2011

Если для тестирования требуются клавиши-модификаторы, такие как ALT и CTRL, SendInput - единственный способСтатья Рэймонда проясняет это.

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