Использование Gecko в C# [GeckoFx]

geckoНе всех устраивает стандартный движок IE в Винде. Но, к счастью, есть много альтернативных движков для C#, Gecko входит в их число и в этом посте я опишу, как использовать GeckoFx в своих проектах.

Исходники можно найти в конце статьи.

На момент написания статьи последняя версия GeckoFx для C# это 22. Давненько не было обновлений и, возможно, проект умер, но даже 22 версия лучше IE. Так что начнем 🙂

Напишем приложение, которое будет заходить на главную станицу гугла, вводить какой-то запрос и переходить по случайному сайту в выдаче.
Создаем новый проект (Приложение Windows Forms), называем его «GeckoExample«, переименовываем главную форму в «FrmMain«, размеры главной формы = 514; 399.

Для работы нам понадобиться:

  1. Скачать библиотеки здесь. Распаковать;
  2. Скачать сам движок с офф. фтп Мозиллы. Распаковать;
  3. Установить Async Targeting Pack для .NET 4.0 в проект.

Теперь в созданном проекте добавляем ссылки на Geckofx-Core.dll и Geckofx-Winforms.dll.
1Бросаем на форму Panel (Name = pnl1,  Location = 0;0, Size = 495; 25), на эту панель добавляем Button (Name = «btnStart», Location = 0;0, Size = 75; 23, Text = Начнем), рядом с кнопкой бросаем TextBox (Name = «tbUrl», Location = 84; 2, Size = 244; 20).

В свойствах проекта переключаем конечную платформу на x86.
2Теперь приступим к написанию кода.
В using класса главной формы подключаем:

Добавляем приватное поле _webBrowser типа GeckoWebBrowser:

В конструкторе класса главной формы пишем следующее:

Т.е. мы инициализируем движок, указывая путь к движку (у меня он находится в папке с программой). Далее создаем экземпляр класса GeckoWebBrowser (т.е. наш браузер), создаем обработчик события DocumentCompleted (который будет изменять текущий адрес страницы в tbUrl), меняем наш юа и добавляем контрол браузера на форму.
Кстати, вот реализация метода _webBrowser_DocumentCompleted:

Настало время написать класс, который будет иметь следующие методы:

  • загрузка главной страницы гугла;
  • написание произвольного поискового запроса в текстовое поле;
  • клик по случайному сайту на странице выдачи.

Добавляем новый класс GoogleExample и следующие поля:

Поле _webBrowser — это ссылка на наш браузер, _loadingTimer через 2000 (т.е. две секунды) миллисекунд будет изменять состояние загрузки страницы и _loading — статус загрузки (этому полю наш таймер будет присваивать значение false).

Незабываем в using подключить следующее:

Теперь напишем конструктор класса GoogleExample:

Конструктор принимает ссылку на браузер, инициализирует таймер. Также создается обработчик события CreateWindow2. Это событие вызывается перед созданием окна. Нужно нам это событие для того, чтобы «глушить» открытие новых окон при нажатии на ссылку результата на странице выдачи гугла.

В этом событии мы отменяем открытие нового окна и заставляем главное окно перейти на ссылку, которую хотело открыть новое окно.

Реализация события Tick для _loadingTimer:

Все просто: останавливаем таймер и изменяем значение переменной _loading, это значение указывает на статус загрузки страницы.

Реализация метода WaitForLoading:

Обычный цикл, каждые 200 миллисекунд проверяется статус загрузки страницы.

Реализация метода Navigate:

Открываем браузером страницу, запускаем таймер и асинхронно ждем загрузки страницы.

Основные методы готовы. Начнем открывать гугл 🙂

Метод OpenGoogle загружает главную страницу гугла. Но есть один момент: гугл может быть на английском, потому цикл foreach нужен для того, чтобы пройтись по всем ссылкам на главной странице и найти ту ссылку (если она есть), при нажатии на которую можно переключить язык на русский.

Следующий в очереди метод ввода поискового запроса — WriteQuery.

Этот метод получает все input‘ы, далее выбирает первый input, который имеет имя «q». Далее запускается цикл, с помощью которого поисковый запрос вводиться побуквенно (типа, реальный пользователь набирает текст :D). После цикла выбираем все button‘ы и кликаем по первому, у которого имя равно «btnG» (это синяя кнопка для поиска) и ждем загрузки страницы.

Ну и последний метод в нашем классе — ClickRandomLink.

Собственно, получаем все ссылки, инициализируем список «нужных ссылок» и запускаем цикл по списку всех ссылок, в котором ищем ссылки, атрибут «onmousedown» которых начинается с «return rwt(» и сама ссылка не содержит «webcache.googleusercontent.com» (иначе получим ссылку на сохраненную копию). дофига ща раз было слово «ссылка». Конструкцию try..catch нужно использовать обязательно, т.к. если попытаться получить доступ к несуществующему атрибуту элемента, то движок выбросит исключение. Например, в том же HtmlAgilityPack все по-другому (и, как мне кажется, удобнее): в методе получения атрибута элемента мы заранее указываем, что нам возвращать, если у элемента нет такого атрибута. Ну да ладно 🙂

Возвращаемся к классу формы. Создаем обработчик события Click кнопки btnStart, добавляем к этому методу модификатор async и пишем следующее:

Ну вот и всё. Можно компилить, тыкать на кнопку и наблюдать результат 🙂

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

result

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

66 комментариев на «Использование Gecko в C# [GeckoFx]»

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

    А примерчик на почту можно?

    • admin говорит:

      В блоге статья будет.

      • Anton говорит:

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

      • admin говорит:

        Ориентировочно в пятницу.
        «Привязка к объекту обработки» что?

  2. Anton говорит:

    Объект обработки — это ссылка, кнопка и т.д, по которой необходимо кликнуть мышкой

    • admin говорит:

      Я же писал выше, что разобрался, как нативно с помощью GeckoFx эмулировать события мыши, то какой может быть рабочий стол?

  3. Anton говорит:

    Сори за не корректный ворос. Ждем Вашу статью

  4. Павел говорит:

    Добрый день!

    Получаю вот такие ошибки в output. Gecko установил в VS2012 через Nuget. Подскажите, куда копать?

    Gecko.Xpcom.DirectoryServiceProvider.GetFile: not implemented: permissionDBPDir
    A first chance exception of type ‘System.IO.FileNotFoundException’ occurred in mscorlib.dll
    ‘Gramsquare.vshost.exe’ (Managed (v4.0.30319)): Loaded ‘Microsoft.GeneratedCode’
    Gecko.Xpcom.DirectoryServiceProvider.GetFile: not implemented: LclSt
    Gecko.Xpcom.DirectoryServiceProvider.GetFile: not implemented: WinD
    Gecko.Xpcom.DirectoryServiceProvider.GetFile: not implemented: AppData
    Gecko.Xpcom.DirectoryServiceProvider.GetFile: not implemented: plugin.scan.Quicktime

  5. Denis говорит:

    Подскажите пожалуйста, где вы нашли мануал по GeckoFX?

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

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