Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 13.11.11 10:58
Оценка:
Не как не могу понять что не так. тестировал с ya.ru и кнопка нажимает на <a href="http://www.artlebedev.ru" onclick="c(this,17,1084)">Студия Артемия&nbsp;Лебедева</a> и загружает эту ссылку. =((
Пробовал получить идентификаторы кнопок со страничке в лист бокс диалога, что-то не то получаю, не могу понять =(

// Получаем указатель на вид
    CFrameWnd * pF =  (CFrameWnd *)(AfxGetMainWnd());
    ASSERT_VALID( pF );

    CHtmlView * pHV =  (CHtmlView *)(pF->GetActiveView());
    ASSERT_VALID( pHV );

    // Получаем указатель на диспетчерский интерфейс
    // объекта документа
    IDispatch * pDp = pHV->GetHtmlDocument();
    if( pDp != NULL )
    {
        // Получаем указатель на интерфейс IHTMLDocument2 
        // для доступа к свойствам и методам объекта
         IHTMLDocument2 * pHD2;
         HRESULT hr;
         hr = pDp->QueryInterface(IID_IHTMLDocument2,(void**)&pHD2 );
         if(hr == S_OK)
         {
             // Получаем указатель на набор анкеров
             IHTMLElementCollection * pColl = NULL;
             hr = pHD2->get_all( &pColl );
    
             if( hr == S_OK && pColl != NULL )
             {
                LONG nElem;
                hr = pColl->get_length( &nElem );
                 for( long i = 0; i < nElem; i++ )
                {
                    _variant_t vIndex( i );
                    _variant_t vName = vIndex;
                     
                    IDispatch * pDisp2;
                    hr = pColl->item( vName, vIndex, &pDisp2 );

                    IHTMLElement *pElem;
                       
                    hr = pDisp2->QueryInterface(IID_IHTMLElement, (void**) &pElem);
                    pElem ->click();
                          
                 pDisp2->Release();    
                 }

                 pColl->Release();
             }

             pHD2->Release();
         }
         
         pDp->Release();
    }
Re: Как программно нажать кнопку на HTML странице в MFC
От: MTimur  
Дата: 13.11.11 16:31
Оценка:
Здравствуйте, ny4ulo, Вы писали:

N>
N>                 for( long i = 0; i < nElem; i++ )
N>                 {
N>                    ...
N>                    hr = pDisp2->QueryInterface(IID_IHTMLElement, (void**) &pElem);
N>                    pElem ->click();
N>                    ...
N>                 }
N>


Делаем click() для всех элементов страницы? Результат последнего у тебя на экране.
  screenshot
Re[2]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 14.11.11 06:39
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Здравствуйте, ny4ulo, Вы писали:


N>>
N>>                 for( long i = 0; i < nElem; i++ )
N>>                 {
N>>                    ...
N>>                    hr = pDisp2->QueryInterface(IID_IHTMLElement, (void**) &pElem);
N>>                    pElem ->click();
N>>                    ...
N>>                 }
N>>


MT>Делаем click() для всех элементов страницы? Результат последнего у тебя на экране.

MT>
  screenshot
MT>


ну а как тогда найти кнопку по которой нужно нажать?
Re[3]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 14.11.11 06:45
Оценка:
Блин что за неудобный интерфейс форума =((
мне нужно получить указатель на каждый из элементов <Anchor> для получения id кнопок и потом их можно будет включить в список?
Re[4]: Как программно нажать кнопку на HTML странице в MFC
От: MTimur  
Дата: 14.11.11 09:40
Оценка:
Здравствуйте, ny4ulo, Вы писали:

N>Блин что за неудобный интерфейс форума =((

N>мне нужно получить указатель на каждый из элементов <Anchor> для получения id кнопок и потом их можно будет включить в список?

В качестве примера
void CMyView::SetDivText(CString sDivID, CString sText)
{
    IDispatch* pDisp = GetHtmlDocument();
    if (pDisp != NULL)
    {
        CComPtr<IHTMLDocument3> pHTMLDocument3;
        HRESULT hr;

        hr = pDisp->QueryInterface(IID_IHTMLDocument3,
                                (void**)&pHTMLDocument3);
        if (hr == S_OK && pHTMLDocument3 != NULL)
        {
            CComBSTR bstrDivID = CComBSTR(sDivID.GetString());

            if (bstrDivID != NULL)
            {
                CComPtr<IHTMLElement> pDiv;
                hr = pHTMLDocument3->getElementById(bstrDivID, &pDiv);
                if (hr == S_OK && pDiv != NULL)
                {
                    CComBSTR bstrHTML = CComBSTR(sText.GetString());
                    hr = pDiv->put_innerHTML(bstrHTML);
                }
            }
        }
        pDisp->Release();
    }
}


Метод меняет текст на sText для элемента с id == sDivID. Только в случае с ya.ru у кнопки "Найти" нет id, но у нее есть value.
Я не пойму что тебе нужно, создать список (список чего?) или нажать на кнопку "Найти"?
Re[5]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 14.11.11 10:03
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Здравствуйте, ny4ulo, Вы писали:


N>>Блин что за неудобный интерфейс форума =((

N>>мне нужно получить указатель на каждый из элементов <Anchor> для получения id кнопок и потом их можно будет включить в список?

MT>В качестве примера

MT>
void CMyView::SetDivText(CString sDivID, CString sText)
MT>{
MT>    IDispatch* pDisp = GetHtmlDocument();
MT>    if (pDisp != NULL)
MT>    {
MT>        CComPtr<IHTMLDocument3> pHTMLDocument3;
MT>        HRESULT hr;

MT>        hr = pDisp->QueryInterface(IID_IHTMLDocument3,
MT>                                (void**)&pHTMLDocument3);
MT>        if (hr == S_OK && pHTMLDocument3 != NULL)
MT>        {
MT>            CComBSTR bstrDivID = CComBSTR(sDivID.GetString());

MT>            if (bstrDivID != NULL)
MT>            {
MT>                CComPtr<IHTMLElement> pDiv;
MT>                hr = pHTMLDocument3->getElementById(bstrDivID, &pDiv);
MT>                if (hr == S_OK && pDiv != NULL)
MT>                {
MT>                    CComBSTR bstrHTML = CComBSTR(sText.GetString());
MT>                    hr = pDiv->put_innerHTML(bstrHTML);
MT>                }
MT>            }
MT>        }
MT>        pDisp->Release();
MT>    }
MT>}


MT>Метод меняет текст на sText для элемента с id == sDivID. Только в случае с ya.ru у кнопки "Найти" нет id, но у нее есть value.

MT>Я не пойму что тебе нужно, создать список (список чего?) или нажать на кнопку "Найти"?

мне нужно найти на сайте кнопку и нажать ее программно
Re[6]: Как программно нажать кнопку на HTML странице в MFC
От: MTimur  
Дата: 14.11.11 10:17
Оценка:
Здравствуйте, ny4ulo, Вы писали:

N>Здравствуйте, MTimur, Вы писали:

N>мне нужно найти на сайте кнопку и нажать ее программно

Ну так в исходном примере ты это и делаешь, только жмешь на все кнопки. Отфильтруй лишнее, проверяй свойства, которые идентифицируют нужную кнопку однозначно.
Re[7]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 14.11.11 10:20
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Здравствуйте, ny4ulo, Вы писали:


N>>Здравствуйте, MTimur, Вы писали:

N>>мне нужно найти на сайте кнопку и нажать ее программно

MT>Ну так в исходном примере ты это и делаешь, только жмешь на все кнопки. Отфильтруй лишнее, проверяй свойства, которые идентифицируют нужную кнопку однозначно.


я не могу понять как это сделать
Re[8]: Как программно нажать кнопку на HTML странице в MFC
От: MTimur  
Дата: 14.11.11 10:37
Оценка:
Здравствуйте, ny4ulo, Вы писали:

N>Здравствуйте, MTimur, Вы писали:


MT>>Здравствуйте, ny4ulo, Вы писали:


N>>>Здравствуйте, MTimur, Вы писали:

N>>>мне нужно найти на сайте кнопку и нажать ее программно

MT>>Ну так в исходном примере ты это и делаешь, только жмешь на все кнопки. Отфильтруй лишнее, проверяй свойства, которые идентифицируют нужную кнопку однозначно.


N>я не могу понять как это сделать


IHTMLElement::getAttribute Method
В случае с ya.ru нужно получить значение свойства value (strAttributeName = "value"), проверить результат (AttributeValue) на !NULL и на соответствие строке "Найти".
Re[9]: Как программно нажать кнопку на HTML странице в MFC
От: fddima  
Дата: 17.11.11 15:51
Оценка:
Здравствуйте, MTimur, Вы писали:

Эээ... а просвятите!
Не проще все эти программные нажимания и поиск нужной кнопки делать через JS?
Re[10]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 20.11.11 06:39
Оценка:
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, MTimur, Вы писали:


F>Эээ... а просвятите!

F>Не проще все эти программные нажимания и поиск нужной кнопки делать через JS?
проще. но задание было такое=)
как я понимаю этими манипуляциями можно работать с IEplorerom, а как можно обратиться к объектам других браузеров, как я понял они все по разному работают с объектам и все зависит от движка браузера?
Re[11]: Как программно нажать кнопку на HTML странице в MFC
От: fddima  
Дата: 20.11.11 07:43
Оценка:
Здравствуйте, ny4ulo, Вы писали:

N>как я понимаю этими манипуляциями можно работать с IEplorerom, а как можно обратиться к объектам других браузеров, как я понял они все по разному работают с объектам и все зависит от движка браузера?

Именно так — у всех свои ограничения / интерфейсы / свои правила игры. Но у всех есть возможность выполнить кусок JavaScript, — тем более что подобные задачи из JS решаются очень просто, и по факту вероятнее всего — будет даже быстрее, чем сканить DOM извне — это везде очень дорогое удовольствие.
Re[12]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 20.11.11 08:43
Оценка:
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, ny4ulo, Вы писали:


N>>как я понимаю этими манипуляциями можно работать с IEplorerom, а как можно обратиться к объектам других браузеров, как я понял они все по разному работают с объектам и все зависит от движка браузера?

F> Именно так — у всех свои ограничения / интерфейсы / свои правила игры. Но у всех есть возможность выполнить кусок JavaScript, — тем более что подобные задачи из JS решаются очень просто, и по факту вероятнее всего — будет даже быстрее, чем сканить DOM извне — это везде очень дорогое удовольствие.

Хочешь сказать, написать программу на JS которая будет работать с браузерами?
Re[13]: Как программно нажать кнопку на HTML странице в MFC
От: fddima  
Дата: 20.11.11 11:35
Оценка:
Здравствуйте, ny4ulo, Вы писали:

F>> Именно так — у всех свои ограничения / интерфейсы / свои правила игры. Но у всех есть возможность выполнить кусок JavaScript, — тем более что подобные задачи из JS решаются очень просто, и по факту вероятнее всего — будет даже быстрее, чем сканить DOM извне — это везде очень дорогое удовольствие.

N>Хочешь сказать, написать программу на JS которая будет работать с браузерами?
Я хочу сказать, что всё зависит от ситуации.
Если это собственные страницы, то проще что бы она сама предоставляла все необходимые сервисы для нативного кода: т.е. там например в window.view.XXXX был бы уже набор функций для взаимодействия.

Если страницы чужие и нам реально необходимо выполнять поиск, то выполняем простенькие срипты, например нажимаем на button, если id известен:
browser.InvokeScript("document.getElementById('myButton').click();"); // нажимаем кнопку, если её ID известен


И т.д. Опять же, во всех мажорных браузерах последних версий native css selector engine уже есть.

Хотя безусловно причины работать "напрямую" с DOM — могут быть, но едва ли это необходимо для того что бы программно нажать на кнопку.
Re[14]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 21.11.11 10:03
Оценка:
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, ny4ulo, Вы писали:


F>>> Именно так — у всех свои ограничения / интерфейсы / свои правила игры. Но у всех есть возможность выполнить кусок JavaScript, — тем более что подобные задачи из JS решаются очень просто, и по факту вероятнее всего — будет даже быстрее, чем сканить DOM извне — это везде очень дорогое удовольствие.

N>>Хочешь сказать, написать программу на JS которая будет работать с браузерами?
F> Я хочу сказать, что всё зависит от ситуации.
F>Если это собственные страницы, то проще что бы она сама предоставляла все необходимые сервисы для нативного кода: т.е. там например в window.view.XXXX был бы уже набор функций для взаимодействия.

F>Если страницы чужие и нам реально необходимо выполнять поиск, то выполняем простенькие срипты, например нажимаем на button, если id известен:

F>
browser.InvokeScript("document.getElementById('myButton').click();"); // нажимаем кнопку, если её ID известен


F>И т.д. Опять же, во всех мажорных браузерах последних версий native css selector engine уже есть.


F>Хотя безусловно причины работать "напрямую" с DOM — могут быть, но едва ли это необходимо для того что бы программно нажать на кнопку.

хочешь сказать можно написать программу на с++ которая буде работать с браузерами посредством java?
Re[15]: Как программно нажать кнопку на HTML странице в MFC
От: fddima  
Дата: 21.11.11 10:14
Оценка:
Здравствуйте, ny4ulo, Вы писали:

F>>Хотя безусловно причины работать "напрямую" с DOM — могут быть, но едва ли это необходимо для того что бы программно нажать на кнопку.

N>хочешь сказать можно написать программу на с++ которая буде работать с браузерами посредством java?
Да, посредством javascript.
Re[16]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 21.11.11 13:55
Оценка:
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, ny4ulo, Вы писали:


F>>>Хотя безусловно причины работать "напрямую" с DOM — могут быть, но едва ли это необходимо для того что бы программно нажать на кнопку.

N>>хочешь сказать можно написать программу на с++ которая буде работать с браузерами посредством java?
F> Да, посредством javascript.

бла я нуб в это, какой нибудь примерчик можно. или где посмотреть можно.
Re[17]: Как программно нажать кнопку на HTML странице в MFC
От: fddima  
Дата: 21.11.11 14:02
Оценка:
Здравствуйте, ny4ulo, Вы писали:

N>>>хочешь сказать можно написать программу на с++ которая буде работать с браузерами посредством java?

F>> Да, посредством javascript.
N>бла я нуб в это, какой нибудь примерчик можно. или где посмотреть можно.
Я думаю в случае с IE плясать нужно от IHTMLWindow2::execScript().
Re[18]: Как программно нажать кнопку на HTML странице в MFC
От: ny4ulo  
Дата: 24.11.11 13:37
Оценка:
Здравствуйте, fddima, Вы писали:

F>Здравствуйте, ny4ulo, Вы писали:


N>>>>хочешь сказать можно написать программу на с++ которая буде работать с браузерами посредством java?

F>>> Да, посредством javascript.
N>>бла я нуб в это, какой нибудь примерчик можно. или где посмотреть можно.
F> Я думаю в случае с IE плясать нужно от IHTMLWindow2::execScript().
ну а с другими браузерами?Спасибо за подсказку
Re[19]: Как программно нажать кнопку на HTML странице в MFC
От: fddima  
Дата: 24.11.11 15:43
Оценка:
Здравствуйте, ny4ulo, Вы писали:

N>>>бла я нуб в это, какой нибудь примерчик можно. или где посмотреть можно.

F>> Я думаю в случае с IE плясать нужно от IHTMLWindow2::execScript().
N>ну а с другими браузерами?Спасибо за подсказку
Ну и в других есть аналогичные способы. В webkit, по идее у webframe, есть функции executeJavaScript/executeJavaScriptAndReturnValue.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.