Эмуляция событий мыши в GeckoFx [C#]

index54[1]Итак, разобрался я, как эмулировать события мыши в GeckoFx.
Все достаточно просто.

Исходники в конце статьи

В JavaScript есть такой класс, как MouseEvent и метод initMouseEvent(). Вот с помощью них и еще парочки классов можно реализовать эмуляцию событий мыши в GeckoFx.
В движке уже реализованы данные классы и их просто нужно использовать в правильном порядке 🙂

Движок поддерживает следующие типы событий мыши:

  • mousedown;
  • mouseup;
  • mousemove;
  • mouseover;
  • mouseout;
  • contextmenu;
  • dblclick;
  • click.

С помощью следующего метода-расширения можно эмулировать события мыши:

Пример использования: движение мыши с точки 0,0 к какому-то элементу:

Для того, чтобы эмулировать движение мыши по всему документу, нужно передавать в метод MouseEventEmulation в качестве первого аргумента Document.Body (т.е. ссылку на весь документ), если же нужно сделать клик по элементу — передавать элемент, по которому нужно произвести клик 🙂

Рассмотрим простой пример, где будем заходить на страницу Google Translate, вводить в поле какой-то текст и нажимать на кнопку «Прослушать».

Создаем новый проект GeckoMouseEvents (.NET Framework v4), подключаем либы GeckoFx 33, устанавливаем Microsoft Async и скачиваем Xulrunner 33.

Атрибуты главной формы: Size = 627; 480, StartPosition = CenterScreen, Text = GeckoMouseEvents, WindowState = Maximized.
Бросаем на форму Panel (Location = 0;0, Size = 610; 25, Name = pnl1), кнопку на панель (Location = 0;0, Size = 75; 23, Name = btnStart, Text = Начнем).

Теперь создаем статический класс с методом, который будет осуществлять эмуляцию событий мыши. Назовем его GeckoExtensionMethods:

Теперь создадим класс, в котором будет логика работы (загрузка страницы, ввод текста и т.д.). Назовем его EmulMouseEvents:

Точка входа здесь метод Start().
После начала открытия страницы происходит запуск таймера с интервалом в 5 секунд. По прошествии 5 секунд считаем, что страница загрузилась. Далее получаем поле для ввода текста с идентификатором source, выполняем набор текста, получаем кнопку «Прослушать» с идентификатором gr-src-listener, эмулируем движение к этому объекту (которое мы все равно не увидим 😀 но счетчики типа Яндекс.Метрика такое движение зафиксируют) и, после, эмулируем нажатие на кнопку.

Так-с, теперь весь этот код нужно вызвать. Переходим на главную форму, в конструкторе формы производим инициализацию GeckoFx:

И добавляем обработчик события нажатия на кнопку:

Не забываем добавить поле главной формы:

2015-04-25 15-16-18 GeckoMouseEvents Вот, собственно, и всё 🙂

Скачать исходники можно на GitHub.

Запись опубликована в рубрике Статьи по C# с метками , , , . Добавьте в закладки постоянную ссылку.

12 комментариев на «Эмуляция событий мыши в GeckoFx [C#]»

  1. Александр говорит:

    Приветствую, закомментировал сам клик — //await this.MouseClickOnElement( listenElement );

    Не наводит на прослушать, mousemove не работает!!! скачал исходник тоже самое! когда реальную мышь наводим на прослушать, стает активным значок, у Вашем примере этого не вижу! Или я туплю, чего-то не понимаю. И второе, нужно кликать по координатах ссылки, то есть по ширине ссылке и по длине, в разных местах нужно делать клик. Иногда попадаются системы которые секут наведение на ссылку клик по координатах… Считают что кликер! Подскажите пожалуйста как это организовать? нужно довести до оригинальной мыши! Спасибо за код…

    • admin говорит:

      1. А Вы знаете, что это за событие вообще «mousemove», прежде чем бросаться фразами «оно не работает»? И для какого элемента оно в коде эмулируется? И что его метрика фиксирует? И может быть такое, что двигло (или его порт) не умеет эмулировать, например, событие mouseenter, а «активным» значок может становится только при таком событии? И что если эмулировать событие mouseover для этого объекта, то появиться надпись «прослушать»?
      2. Ну так кликайте, координаты указывать можно. Я же не запрещаю 🙂
      П.С. Если нужно «довести до оригинальной мыши», то доводите. Исходники открыты, информация для старта есть. Я же ни за кого ботов писать не буду.

      • Anton говорит:

        Респект автору, за проделанную работу.
        Александр, тут в статье не говорилось о решении всех Ваших задач, к то му же по новым Вашим требованьям вообще не поднимался вопрос. Попробуйте через PostMessage (http://zhyk.ru/forum/showthread.php?t=970170) может решит Вашу проблему. А теперь к автору и все таки есть привязка к координатам обрабатываемого объекта(screenX, screenY, clientX, clientY). Может я ранее не правильно выразился так прошу прошения, я не программист, это только так для себя хобби в свободное от работы и домашних занятий время.

      • admin говорит:

        Ну конечно есть привязка к координатам. Как ее может не быть? Если мы эмулируем событие движения мыши для всего документа и нам нужно подвести указатель к какому-то объекту в этом документе, тот как мы сможем это сделать без координат?

  2. Александр говорит:

    Пробовал кликнуть по ссылке на сайте, не кликает! Вот например нажать на кнопку войти — Google Translate, тоже не нажимает( Подскажите пожалуйста, куда копать?

  3. ivan говорит:

    Здравствуйте.
    Сталкивались ли вы с обработкой события, которое отвечает за открытие окна OpenFileDialog в GeckoFX?
    Когда я попытался загрузить файл на сторонний сайт, то, оказалось, что средствами GeckoFX невозможно отловить событие upload window. Сталкивались ли вы с подобной ситуацией и можете ли подсказать решение?
    Благодарю.

    • admin говорит:

      Сталкивался с перехватом события сохранения файла, но это нужно по сусекам поскребти и не факт, что в новых версиях будет работать.

  4. Иван говорит:

    Не работает. От слова вообще!

  5. Иван говорит:

    Прошу прощения. В 2010-й студии ассинхрон не воткнул. Всё рвботает.

  6. Алексей говорит:

    Доброе время суток. У меня то же не выходит клик по ссылке, по кнопкам не проблема все отрабатывает на ура. Не могли бы Вы подсказать причину из за чего не выполняет переход, хотя бы по той же ссылке на вход в логин Google Translate.
    GeckoElement listenElement = this._webBrowser.Document.GetElementById(«gb_70»);
    await this.MoveMouseToElement( listenElement );
    await this.MouseClickOnElement( listenElement );

    может, что то не правильно делаю?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *