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); //произвольный кусок кода дабы проверить вхождение
}
Программное заполнение web-форм
Код:
в общем вопрос почему истино if(SUCCEEDED(pForms->tags(name,&spDispatch1))) и как надо.и как дальше,например,нажать кнопку найдя тег INPUT.
Воспользоваться чем то кроме IWebBrowser не предлагать.Студия 2008.Заранее спасибо
Сделал с использованием неуправляемых интерфейсов, чтобы понятно было как юзать вообще:
Код:
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();
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();
Сам пример если что.
А вот как осуществляться должна была пересылка данных не ясно было.
Сам отвечаю.Вдруг кому понадобится.
SUCCEDED возвращает true даже если найдет тэг,просто это означает успешное выполнение функции.
А дальше после вызова item или tags надо определить тип GetTypeObject(как то так) метод IDispatch и Далее GetObject первый параметр это тип,который определили,второй переменная нужного типа,куда будет записан результат для дальнейшей отработки.