MSHTML::IHTMLDocument3Ptr等を使用して
WEB上のエディットボックスのIHTMLElementCollectionPtr取得方法に困っています。
例えば
http://yahoo.co.jpの場合、pの名前からエディットボックスと判断し取得出来ました。
(FROMのnameがpのため)
同様に http://headlines.yahoo.co.jp/hlのエディットボックスを取得しようと試みたと
ころ、
FROMのnameがpなので同様にpで取得しようとしても取得出来ません。
<FORM style=MARGIN: 0px name=p action=http:.... target=uhd>
WEB上のコンポーネントを認識するnameとはどこを参照すればよいのでしょうか?
コードとしては以下のようになります。
SHDocVw::IWebBrowser2Ptr m_pBrowser;
// URLにアクセスしたと仮定します
MSHTML::IHTMLDocument3Ptr pDocument( m_pBrowser->Document );
MSHTML::IHTMLElementCollectionPtr pCollection;
CString strEdit(p);
pCollection = pDocument->getElementsByName( _bstr_t( strEdit ) );
MSHTML::IHTMLInputTextElementPtr pText( pCollection->item() );
if( pText == NULL ){
// 取得できなかった
}els{
// 取得できた
}
以上、ご教授の程、宜しくお願いします。
名前が p のエレメントがいくつかあるため、
>pCollection = pDocument->getElementsByName( _bstr_t( strEdit ) );
で複数取得できているのでしょう。
トップぺージの場合、inputだけなのでうまくいったのでしょう。
回避方法として、何番目かを指定するか、getElementsByIDでID指定で取得する
かが簡単でしょう。
試してみた。
MSHTML::IHTMLElementCollectionPtr pCollection
= pDocument->getElementsByName(_bstr_t(Lp));
for (long i = 1; i <= pCollection->length; ++i)
{
MSHTML::IHTMLElementPtr pElem(pCollection->item(_variant_t(i)));
if (!_wcsicmp(pElem->tagName, Linput))
{
MSHTML::IHTMLInputTextElementPtr pText(pElem);
if (pText)
{
pText->value = _bstr_t(Lほげ);
}
}
}
これだと、input,name=p,type=textの要素すべてに文字が入ります。
Blueさん、ありがとうございます。
おかげさまで入力できました。
因みに以下のようなコンポーネントだと
<INPUT style=MARGIN: 0px 8px 0px 0px type=submit value=検索>
nameがない場合、typeのsubmitから検索する事も可能なのでしょうか?
getElementsByTagNameメソッドで取得してもNULLが返ってきました。。。
submitの場合、ふつうはformを取得して、MSHTML::IHTMLFormElementPtrのsubmitを使う
と思いますけど、、、
はい、最終的にはIHTMLFormElementPtrのsubmitメソッドをコールするのですが、
下記のデータから特定のIHTMLFormElementPtrを取得したい場合、
<INPUT style=MARGIN: 0px 8px 0px 0px type=submit value=検索>
どのように取得すればよいのか思索中です。。。
> for (long i = 1; i <= pCollection->length; ++i)
は
for (long i = 0; i < pCollection->length; ++i)
でした。
MSHTML::IHTMLElementCollectionPtr pCollection
= pDocument->getElementsByTagName(_bstr_t(Linput));
for (long i = 0; i < pCollection->length; ++i)
{
MSHTML::IHTMLInputElementPtr pInput(pCollection->item(_variant_t(i)));
if (!_wcsicmp(pInput->type, Lsubmit))
{
MSHTML::IHTMLInputButtonElementPtr pButton(pInput);
if (pButton)
{
//
}
}
}
>特定のIHTMLFormElementPtrを取得
なら
MSHTML::IHTMLElementCollectionPtr pCollection
= pDocument->getElementsByTagName(_bstr_t(Linput));
for (long i = 0; i < pCollection->length; ++i)
{
MSHTML::IHTMLInputElementPtr pInput(pCollection->item(_variant_t(i)));
if (!_wcsicmp(pInput->type, Ltext))
pInput->value = _bstr_t(Lほげ);
else if (!_wcsicmp(pInput->type, Lsubmit) &&
pInput->value == _bstr_t(L検索))
{
MSHTML::IHTMLFormElementPtr pForm(pInput->form);
if (pForm)
{
hr = pForm->submit();
break;
}
}
}
上記の内容で取得とボタン押下できました。
IHTMLInputElementPtrメソッドでvalueが取得出来たんですね↑
この手の参考書等がなく非常に困惑しましたが、
Blueさんのお陰でようやく解決しました。
本当にありがとうございます。
> IHTMLInputElementPtrメソッドでvalueが取得出来たんですね↑
> この手の参考書等がなく非常に困惑しましたが、
MSDN があります。