Имитация нажатия клавиш в невидимом веб-браузере объекта C # - PullRequest
3 голосов
/ 27 мая 2009

В настоящее время я работаю в приложении, которое должно перемещаться по веб-странице и собирать данные о продуктах, ценах, ... с объектом webbrowser в .net 3.5.

Проблема в том, что на странице есть несколько полей со сценарием подсказки в ajax, и я не могу просто изменить свойство innerText, потому что скрипт также сохраняет коды в скрытом поле ввода.

Мне нужен способ смоделировать ввод в это поле и затем отправить ключ «Ввод», или запустить скрипт ajax, а затем отправить ключ «Ввод», или любые другие лучшие способы сделать это.

Ответы [ 4 ]

3 голосов
/ 27 мая 2009

Использование Watin

Тогда вы можете использовать это решение .

2 голосов
/ 27 мая 2009

Чтобы отправить форму или запустить скрипт, вы можете сделать это: Если вы знаете имя скрипта, вы можете использовать InvoekScript объекта Document:

myWebBrowser.Document.InvokeScript("script-name",null);

второй аргумент - массив объектов для передачи значений параметров.

если вы знаете имя элемента, для которого событие click запускает скрипт, вы можете сделать это:

HtmlElement element=myWebBrower.Document.GetElementById("element-name")[0];
element.InvokeMember("click");
1 голос
/ 10 декабря 2009

Существует несколько способов сделать это с помощью стандартного элемента управления WebBrowser.

Для HTML: Если вы хотите заполнить текстовое поле, а затем нажать «Отправить», даже не нажимайте клавишу. Сделайте это:

webbrowser1.Navigate("javascript:function%20E(){f0=document.forms[0];f0['login'].value='foo';}E()")
webbrowser1.Navigate("javascript:document.forms[0].submit()")

Это будет намного надежнее, чем пытаться отправить нажатия клавиш для HTML.

** Для Flash: ** Если на веб-странице есть элемент flash, который нужно нажать, он не будет работать. В этом случае SendKeys надежен, но отправляет только активному приложению, поэтому он не будет работать в фоновом режиме. Вы можете отправлять сообщения Windows следующим образом (например, нажмите клавишу «F»):

Dim c as char = "f"c
Dim classname As New System.Text.StringBuilder(100)
Dim ExplorerHandle As IntPtr = webbrowser1.Handle
GetClassNameA(ExplorerHandle, classname, classname.Capacity)
Do While classname.ToString <> "Internet Explorer_Server"
    ExplorerHandle = GetWindow(GetExplorerHandle, GetWindow_Cmd.GW_CHILD)
    GetClassNameA(ExplorerHandle, classname, classname.Capacity)
Loop

PostMessageA(ExplorerHandle, WM_Constants.WM_KEYDOWN, IntPtr.Zero, IntPtr.Zero)
PostMessageA(ExplorerHandle, WM_Constants.WM_KEYUP, CType(VkKeyScanA(CType(Asc(c), Byte)), IntPtr), IntPtr.Zero)

Вы можете найти определения для PostMessage, GetClassName, GetWindow и т. Д. Онлайн на pinvoke.net. Обратите внимание, что WM_KEYUP использует c, но WM_KEYDOWN отправляет фиктивный ключ (0). KEYDOWN и KEYUP должны идти парами, иначе ключ не будет зарегистрирован, но если вы удерживаете нажатой клавишу Control во время отправки, например, KEYDOWN «p», он активирует функцию печати IE. Для всех букв и цифр вы можете отправить 0 для KEYDOWN и правильное письмо для KEYUP. Backspace, похоже, нужен реальный KEYDOWN, а не 0, но Control-Backspace, похоже, мало что делает в IE, поэтому если c = vbBack, KEYDOWN должен отличаться.

Нажатия клавиш тоже не очень точны, и 1 раз из 500 он пропускает. Но вы можете сделать это с свернутым окном, без проблем и стандартным элементом управления WebBrowser.

Другим вариантом является использование AxWebBrowser. Элемент управления ActiveX, по-видимому, позволяет избежать проблемы Control-P, но манипулировать им не так просто, потому что это не очень хороший элемент управления .Net.

0 голосов
/ 27 мая 2009

Некоторые элементы AJAX не реагируют на element.InvokeMember ("click").

Простой скрипт sendkeys может работать для вашего проекта, но самый надежный способ - подключить управление через веб-браузер (очень сложно, но выполнимо). Или вы покупаете готовый компонент, такой как iMacros: http://www.iopus.com/iMacros/component.htm

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