Використання gecko в c # geckofx, новинний блог - статті по c #, php, delphi, безкоштовні програми

Використання gecko в c # geckofx, новинний блог - статті по c #, php, delphi, безкоштовні програми
Не всіх влаштовує стандартний двигун IE в Винда. Але, на щастя, є багато альтернативних движків для C #. Gecko входить в їх число і в цьому пості я опишу, як використовувати GeckoFx в своїх проектах.

Вихідні тексти можна знайти в кінці статті.

На момент написання статті остання версія GeckoFx для C # це 22. Давненько не було оновлень і, можливо, проект помер, але навіть 22 версія краще IE. Так що почнемо 🙂

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

Для роботи нам знадобитися:

Тепер в створеному проекті додаємо посилання на Geckofx-Core.dll і Geckofx-Winforms.dll.

Використання gecko в c # geckofx, новинний блог - статті по c #, php, delphi, безкоштовні програми
Кидаємо на форму 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.

Використання gecko в c # geckofx, новинний блог - статті по c #, php, delphi, безкоштовні програми
Тепер приступимо до написання коду.
У using класу головної форми підключаємо:

Це приклад, так що очікувати від нього якоїсь гнучкості (щоб відразу скопіював і працювало, як потрібно), не варто 😉
На рахунок розмірів, то я, думаю, не складно поставити крапку після this._webBrowser і глянути, які у цього об'єкта є поля і методи.
Серед них є такі поля, як Height (висота) і Width (ширина), за допомогою яких можна налаштувати розміри контролери. Також слід встановити властивість Anchor в AnchorStyles.Left | AnchorStyles.Top. тому в прикладі з допомогою якорів (AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom) контролери «чіпляється» до всіх краях форми.

Точно. Дякуємо!
Документації, як я зрозумів, немає на нього, навіть англійською?

Документації немає. Колись знаходив приклади (для 16 версії, начебто) на англ.
Так що метод наукового тику рулить 🙂

Я бачу що Ви дуже непогано розібралися з Geckofx. Підкажіть якщо знаєте. По властивості geckoWebBrowser1.Document ми отримуємо доступ до документа, який був уже розпарсити движком. Але бувають випадки коли оригінал исходника веб сторінки з сервера, не відповідає OuterHtml. Хоча движок і вірно відображає сторінку, властивість geckoWebBrowser1.Document вже втратило деякі дані і до них не отримати доступ. якщо зробити geckoWebBrowser1.Navigate ( «view-source:" + url); то код без втрат, але по-перше він відображається на сторінці, що не завжди потрібно, по-друге запитується з сервера ще раз, а по-третє він тільки виглядає вірно, а отримати доступ до html документу як? OuterHtml це буде вже не оригінал, туди додасться розмітка оформлення для виведення коду. Сподіваюся ви зрозуміли, що я хочу дізнатися. Заздалегідь дякую.

Я не в курсі, як отримати оригінал коду, який віддає сервак, за допомогою GeckoFx. Оскільки який сенс тягати за собою таке двигло, якщо потрібно отримати просто код (без рендеринга і т.д.), який віддає сервак? Для таких цілей є WebClient 🙂

Спасибі за відповідь. Тягати двигло має сенс в певних ситуаціях. Мета його використання в конкретній проблемі була не в отриманні вихідного коду, движок використовується за призначенням. Просто паралельно і таке питання виникло, щоб програмно обробити дані зі сторінки. На жаль в зв'язку з мізерним документуванням сам відповіді не знайшов. Погодьтеся, раз движок все ж використовується, то нерозумно городити милиці і звертатися через WebClient, коли цю конкретну сторінку вже отримав і відобразив движок. Гаразд, будемо шукати, можливо не всі розгублено.

Городити милиці в програмуванні потрібно мало не постійно 😉 Оскільки не всі ліби мають потрібний функціонал / працюють так, як потрібно.
Ну, або перенести (допілівать) цей движок самому з преферанс і поетесами. Але на це піде набагато більше часу, ніж спорудити милицю.

Також можна спробувати задати питання тим, хто портував двигло тут.
П.С. На рахунок view-source. Можна схитрувати і отримати доступ до коду так:
_webBrowser.Navigate ( "view-source: someurl");
string html = _webBrowser.Document.GetElementsByTagName ( "html") [0] .TextContent;
У теорії, має спрацювати 🙂

Просто відбувається не просто відкриття вікна, а ще й відправка post-запиту, тому і повідомляє про помилку.
Тут вже потрібно сидіти і копати (і гуглити :)), у мене зараз часу на це немає, зайнятий іншим проектом.

У мене таке питання дивний. Не можу розібратися як працює ваша синхронізація? Як дізнатися що сторінка повністю прогрузити і з нею можна далі працювати?
зі звичайним компонентом webBrowser я перевіряв на ReadyState, якщо він completed то йдемо далі.
Але тут як то не можу розібратися, підкажіть, а?)

я просто не знайшов залежності таймера і завантаження. він просто змінює змінну і каже, що сторінка завантажилася через 2 секунди? а якщо вона не встигла завантажитися за цей час?
або я що щось упустив?

В даному прикладі таймер вирішує: завантажилася сторінки чи ні 🙂 Це ж приклад, лінь було щось «мега-круте» для простого прикладу робити.
А якщо вона не встигла завантажиться, то робота продовжитися з не завантаженою сторінкою.

ага, я зрозумів. Дякуємо.
а може підкажіть ще якісь сторонні компоненти, в яких це вирішується простіше, при мопощі методів і властивостей?

проблема стандартного веб-браузера в тому, що він чомусь не перевантажує вміст документа, взагалі ніяк. (Як завантажив після першої навігації, так і все)
я так зрозумів в Gecko з цим все ок, ось тільки потрібно милицях із синхронізацією?

Я нижче описав, що ні в одному компоненті (з яким я стикався 🙂) не можна одним методом / подією визначити повне завантаження сторінки (ще в Делфі 7 і вище з цієї фігньою стикався і перепробував ще тоді купу компонент). Навіть звичайний браузер (Хром, Лиса) не може цього зробити 🙂
А милицю із завантаженням досить простий: використовуємо таймер і перевірку якості IsBusy. Таймер «заводимо» на, наприклад, 10 секунд, при спрацьовуванні таймера змінюється значення змінної _loading в false.
А в методі відкриття посилання, де відбувається очікування завантаження сторінки, робимо простий цикл:
while (_wb.IsBusy # 038; _loading)
// чекаємо
>
_loadingTimer.Stop ();
// працюємо зі сторінкою

Використовувати таймер в будь-якому випадку потрібно, тому що може якийсь скрипт якогось нафіг непотрібного лічильника, який завантажується синхронно, «повешана» сторінку (тобто вантажитиметься вічно або дуже довго) і в підсумку програма буде чекати, як Хатіко 🙂

Приветсвую, ось на Яві робочий приклад:

var event = document.createEvent ( 'MouseEvents');
event.initMouseEvent ( 'click', true, true, window, 1, 10, 10, 10, 10, false, false, false, false, 0, null);
document.getElementById ( 'idid'). dispatchEvent (event);
>

Ось думаю пробувати вшити в Геска. Пробував слати SendMessage все вийшло, правда коли повертаю додаток то клацає не на всіх сайтах. Причина поки неізвесно, але зробив через нульову прозорість форми, так то все працює відмінно, клацає без реальної миші. Правда, приховувати форму не дуже правильно. Хочу розібратись в чому собсвенно справу. Якщо є час підключайтеся до пошуку вирішення цієї проблеми ..