String Login = "testlogin";
IHTMLDocument2 *HTMLDocument = NULL;
LONG ilFramesCount = 0;
if(!Browser->Busy && Browser->Document &&
AnsiString(Browser->LocationURL) != "about :blank" &&
SUCCEEDED(Browser->Document->QueryInterface(
IID_IHTMLDocument2, (LPVOID*)&HTMLDocument)))
{
IHTMLFramesCollection2 *pFrames = NULL;
if(SUCCEEDED(HTMLDocument->get_frames(&pFrames)))
{
pFrames->get_length(&ilFramesCount);
if(ilFramesCount < 2) ilFramesCount= 0;
VARIANT vFrame;
VARIANT ret;
vFrame.vt = VT_UINT;
vFrame.lVal = 3;//ilFrameIndex
if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
{
IHTMLWindow2 *pWindow = NULL;
IHTMLDocument2 *iDoc_go=NULL;
IHTMLElementCollection *iEcol_go=NULL;
IHTMLElement *Links_element=NULL;
if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,(LPVOID*)&pWindow)))
{
TVariant vName1 = "login", vIndex = 0;
IDispatch *pDisp1 = NULL;
if ( SUCCEEDED ( pWindow -> item ( vName1, vIndex) ) && pDisp1 )
{IHTMLInputElement *pInput = NULL;
if ( SUCCEEDED ( pDisp1 -> QueryInterface ( IID_IHTMLInputElement, ( LPVOID* )&pInput ) ) && pInput )
{pInput -> put_value (); pInput -> Release ();}
pDisp1 -> Release (); } }
pWindow -> Release ( Login ); }
}
}
}*/
}
}
HTMLDocument->Release();
}
Работа с фреймами в CppWebBrowser
чекалть боксы и нажимать кнопки.
На обычном сайте все работает ок.
Только вот не знаю как это организовать
на сайте с фреймами. Допустим есть 4 фрейма,
программа должна нажать Submit во втором фрейме.
Имя фрейма меняется с перезагрузкой страницы.
Есть какие либо идеи?
А если в кратце, то тебе нужно:
у IHTMLDocument2 есть функция get_frames(IHTMLFramesCollection2 *pFrames);
далее
pFrames->get_length(&ilFramesCount);
ilFramesCount - количество фреймов на странице.
Далее в цикле перебираешь нужные тебе фреймы.
это я нашел давно вот только не знаю куда вставить сам код выполняющий сабмит(
IHTMLDocument2 *pHTMLDocument = NULL;
WideString Login = WideString(LoginString); //WideString(LoginPromt);
WideString Password = WideString(PasswordString); //WideString(PasswordPromt);
if(SUCCEEDED(CppWebBrowser1 -> Document -> QueryInterface ( IID_IHTMLDocument2, ( LPVOID* )&pHTMLDocument ) ) )
{if(pHTMLDocument != NULL ){IHTMLElementCollection *pAll = NULL;
if ( SUCCEEDED ( pHTMLDocument -> get_all ( &pAll ) ) && pAll )
{TVariant vName1 = "login", vName2 = "password";
TVariant vIndex = 0;
IDispatch *pDisp1 = NULL; // UserID
if ( SUCCEEDED ( pAll -> item ( vName1, vIndex, &pDisp1 ) ) && pDisp1 )
{IHTMLInputElement *pInput = NULL;
if ( SUCCEEDED ( pDisp1 -> QueryInterface ( IID_IHTMLInputElement, ( LPVOID* )&pInput ) ) && pInput )
{ pInput->put_value( Login ); pInput -> Release ();
} pDisp1 -> Release (); }
IDispatch *pDisp2 = NULL;
if ( SUCCEEDED ( pAll -> item ( vName2, vIndex, &pDisp2 ) ) && pDisp2 )
{IHTMLInputElement *pInput = NULL;
if ( SUCCEEDED ( pDisp2 -> QueryInterface ( IID_IHTMLInputElement, ( LPVOID* )&pInput ) ) && pInput )
{pInput -> put_value ( Password ); pInput -> Release ();}
pDisp2 -> Release (); } }
pAll -> Release (); }
// click SUBMIT Button
IHTMLElementCollection *HTMLForms = NULL;
if ( SUCCEEDED ( pHTMLDocument -> get_forms ( &HTMLForms ) ) && HTMLForms )
{
TVariant vName3 = "F1";
TVariant vIndex3 = 0;
IDispatch *pDisp3 = NULL;
if ( SUCCEEDED ( HTMLForms->item( vName3, vIndex3, &pDisp3 ) ) && pDisp3 )
{
IHTMLFormElement *HTMLForm = NULL;
if ( SUCCEEDED ( pDisp3 -> QueryInterface ( IID_IHTMLFormElement, ( LPVOID* )&HTMLForm ) ) && HTMLForm )
{
HTMLForm -> submit ();
HTMLForm -> Release ();
} pDisp3 -> Release (); } HTMLForms -> Release (); }
pHTMLDocument -> Release ();
}
фрейм по счету четвертый, но номер у него 3
Код:
// полуяаем коллекцию фреймов
if(SUCCEEDED(iDoc->get_frames(&pFrames)))
{
//узнаем сколько всего фреймов
pFrames->get_length(&ilFramesCount);
if(ilFramesCount < 2) ilFramesCount= 0;
VARIANT vFrame;
VARIANT ret;
vFrame.vt = VT_UINT;
//получаем доступ к каждому определенному фрейму
for(long ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)
{
vFrame.lVal = ilFrameIndex; // индекс фрейма
if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
{
IHTMLWindow2 *pWindow = NULL;
IHTMLDocument2 *iDoc_go=NULL;
IHTMLElementCollection *iEcol_go=NULL;
IHTMLElement *Links_element=NULL;
if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,(LPVOID*)&pWindow)))
{
/*
pWindow - через него можем управлять фреймом
*/
}
}
}
}
if(SUCCEEDED(iDoc->get_frames(&pFrames)))
{
//узнаем сколько всего фреймов
pFrames->get_length(&ilFramesCount);
if(ilFramesCount < 2) ilFramesCount= 0;
VARIANT vFrame;
VARIANT ret;
vFrame.vt = VT_UINT;
//получаем доступ к каждому определенному фрейму
for(long ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)
{
vFrame.lVal = ilFrameIndex; // индекс фрейма
if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
{
IHTMLWindow2 *pWindow = NULL;
IHTMLDocument2 *iDoc_go=NULL;
IHTMLElementCollection *iEcol_go=NULL;
IHTMLElement *Links_element=NULL;
if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,(LPVOID*)&pWindow)))
{
/*
pWindow - через него можем управлять фреймом
*/
}
}
}
}
pishu s moba big thx kogda pridu domoi poprobuiu
наверное тут все криво поставлено, подскажите плз чтоб зарботало
Код:
Надо работать только с 3им фреймом, остальные не нужны
спасибо всем сам разобрался
разобрался сАм помоги другим =). выложив окончательный рабочий вариант =)