Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Программное заполнение web-форм

3.0K
23 января 2010 года
ctraus
91 / / 16.06.2006
Здравствуйте.Требуется программно заполнить форму в IE, используя IWebBrowser.
Код:
IDispatch *spDispatch;
    IHTMLElementCollection *pForms;
    IHTMLElement *pHtml;
if (SUCCEEDED(pBrowser2->get_Document(&spDispatch))) //Здесь корректно все
             {
           
            spHTML = spDispatch;
         spHTML->get_body(&pHtml);//тело тоже получает
         spHTML->get_forms(&pForms);
          VARIANT id, index,name;
                    IDispatch* spDispatch1=NULL;
                    V_VT(&name)=VT_BSTR;
                    V_BSTR(&name)=in;//in-тег,который ищем
                    V_VT(&id) = VT_I4;
                    V_I4(&id) = 0;
                    V_VT(&index) = VT_I4;
                    V_I4(&index) = 0;
                    spDispatch1=NULL;
                    long p=0;
                    pForms->get_length(&p);//Сюда записывает 1,что вроде похоже тк на странице авторизации яндекса 1 форма
    if(SUCCEEDED(pForms->tags(name,&spDispatch1)))//Сюда входит даже если искать строку "asdfg",которой никак нету на странице яндекса!
                        {
        pForms>get_length(&p);  //произвольный кусок кода дабы проверить вхождение
                        }

в общем вопрос почему истино if(SUCCEEDED(pForms->tags(name,&spDispatch1))) и как надо.и как дальше,например,нажать кнопку найдя тег INPUT.
Воспользоваться чем то кроме IWebBrowser не предлагать.Студия 2008.Заранее спасибо
8.2K
24 января 2010 года
bagie2
299 / / 26.10.2008
В С++ не силен, но вот код на C#

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

Код:
string siteName = "http://google.com", formName = "f", inputName = "q", query = "Шо искать будем?";

            webBrowser1.Navigate(siteName);
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
                Thread.Sleep(50);
            }            

            if (webBrowser1.Document == null)
            {
                MessageBox.Show("ERROR: хахаха");
                return;
            }

            object doc = webBrowser1.Document.DomDocument;

            object form = (doc as IHTMLDocument2).forms.item(formName, null);
            if (form == null)
            {
                MessageBox.Show(String.Format("ERROR: форма не найдена \"{0}\"", formName));
                return;
            }
       
            object input = (form as IHTMLFormElement3).namedItem(inputName);
            if (input == null)
            {
                MessageBox.Show(String.Format("ERROR: поле ввода не найдено \"{0}\"", inputName));
                return;
            }

            (input as IHTMLInputElement).value = query;

            (form as IHTMLFormElement).submit();
8.2K
24 января 2010 года
bagie2
299 / / 26.10.2008
Сам пример если что.
3.0K
25 января 2010 года
ctraus
91 / / 16.06.2006
Вот как раз с объектами вроде понятно что и как.
А вот как осуществляться должна была пересылка данных не ясно было.
Сам отвечаю.Вдруг кому понадобится.
SUCCEDED возвращает true даже если найдет тэг,просто это означает успешное выполнение функции.
А дальше после вызова item или tags надо определить тип GetTypeObject(как то так) метод IDispatch и Далее GetObject первый параметр это тип,который определили,второй переменная нужного типа,куда будет записан результат для дальнейшей отработки.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог