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

Ваш аккаунт

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

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

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

найти input в webbrowser

45K
05 мая 2010 года
rookie
21 / / 15.10.2009
Всем привет!
вот таким образом
Код:
void* CrtDlg::ElemFromID(LPWSTR szID , IID nTypeIID)
{
HRESULT hr;
IHTMLDocument2* pDoc= (IHTMLDocument2*) m_axBrowser.get_Document();
IHTMLElementCollection* pAll=  NULL;
hr= pDoc->get_all( &pAll );

CComVariant vElement( szID );
CComVariant vIndex(0,VT_I4);  
 
IDispatch* pDisp;
hr= pAll->item(vElement,vIndex,&pDisp);
void* pElement;  
hr= pDisp->QueryInterface( nTypeIID,(void**)&pElement);

return pElement;
}

получаю по id или name примерно такое поле
[HTML]
<input type="password" name="Passwd" class="gaia le val" id="Passwd" size="18">
[/HTML]
Вопрос:
Как получить доступ к такому inputu
[HTML]
<input type="submit" value="Войти" class="gaia le button">
[/HTML]
11
05 мая 2010 года
oxotnik333
2.9K / / 03.08.2007
ищем по id потом переводим в IHTMLInputElement
45K
05 мая 2010 года
rookie
21 / / 15.10.2009
Цитата: oxotnik333
ищем по id потом переводим в IHTMLInputElement



а где ты видишь там id?

11
05 мая 2010 года
oxotnik333
2.9K / / 03.08.2007
сорри... тоды перебором всех элементов и сравнением их имен с заданной строкой
8.2K
05 мая 2010 года
bagie2
299 / / 26.10.2008
только перебор лучше наверное не всех элементов, а полученных с помощью IHTMLDocument3::getElementsByTagName
45K
05 мая 2010 года
rookie
21 / / 15.10.2009
Цитата: bagie2
только перебор лучше наверное не всех элементов, а полученных с помощью IHTMLDocument3::getElementsByTagName


Можно небольшой кусочек кода, напутственный.

45K
06 мая 2010 года
rookie
21 / / 15.10.2009
Как получить список inputov понял
Код:
CComQIPtr<IHTMLDocument2> spDocument = (IHTMLDocument2*)m_axBrowser.get_Document() ;
   
    CComQIPtr<IHTMLDocument3> spDoc3 = spDocument;
    CComQIPtr<IHTMLElementCollection> spInputCollection;
    HRESULT hRes = spDoc3->getElementsByTagName(CComBSTR("input"), &spInputCollection);
    long Len;
    hRes = spInputCollection->get_length(&Len);
    for(long i = 0; i <Len; ++i)
    {
            //  ?
    }

а как теперь сравнить с моим inputom?
8.2K
06 мая 2010 года
bagie2
299 / / 26.10.2008
попробуйте 2 варианта:

1/можно попробовать у каждого элемента (только привести их к IHTMLInputElement) получить значение value, defaultValue и сравнить с "Войти"
2/либо брать элемент как IHTMLElement, использовать IHTMLElement::getAttribute и получать атрибут class, который сравнивать с "gaia le button"

Вроде бы оба варианта должны работать. Можно их скомбинировать (искать по классу и начальному значению). Также, может быть, стоит проверять тип input'а
45K
06 мая 2010 года
rookie
21 / / 15.10.2009
Цитата: bagie2

1/можно попробовать у каждого элемента (только привести их к IHTMLInputElement) получить значение value, defaultValue и сравнить с "Войти"


Код:
void CrtDlg::ElemFromTagName(LPWSTR szTagName)
{
CComQIPtr<IHTMLDocument2> spDocument = (IHTMLDocument2*)m_axBrowser.get_Document() ;
CComQIPtr<IHTMLDocument3> spDoc3 = spDocument;
CComQIPtr<IHTMLElementCollection> spInputCollection;
   
HRESULT hRes = spDoc3->getElementsByTagName(CComBSTR("input"), &spInputCollection);

long Len;
VARIANT vt;
hRes = spInputCollection->get_length(&Len);
vt.vt = VT_I4;

IHTMLElement* pSubmit = NULL;
IDispatch *pDisp = NULL;
IHTMLInputElement *pElem = NULL;
   
for(long i = 0; i <Len; ++i)
{
vt.intVal = i;
if((spInputCollection->item(vt,vt,&pDisp) == S_OK ))
if ((pDisp->QueryInterface (IID_IHTMLInputElement, (void**)&pElem) ==S_OK))
{      
BSTR sType(L"");
BSTR sValue(L"");
pElem->get_type(&sType);
pElem->get_value(&sValue);

if(lstrcmpW(sType,L"submit") && lstrcmpW(sValue,L"Войти")  )
{
pSubmit= (IHTMLElement*)pElem; pElem->
pSubmit->click();
}
}
}
}

Вроде все правильно, но выдается ошибка:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
Компилятор отправляет в dbghook.c
Если закоментить //pSubmit->click(); ошибки нет.
11
06 мая 2010 года
oxotnik333
2.9K / / 03.08.2007
C-style cast в COM может сыграть очень плохую службу. Кастить интерфейс надо исключительно через QueryInterface
45K
06 мая 2010 года
rookie
21 / / 15.10.2009
Все разобрался вместо
 
Код:
pSubmit= (IHTMLElement*)pElem

сделал
 
Код:
pDisp->QueryInterface(IID_IHTMLElement, (void**)&pSubmit);

Всем спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог