getElementsByNameメソッドについて – プログラミング – Home

通知
すべてクリア

[解決済] getElementsByNameメソッドについて


正月ダディ
 正月ダディ
(@正月ダディ)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

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{
// 取得できた
}

以上、ご教授の程、宜しくお願いします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

名前が p のエレメントがいくつかあるため、
>pCollection = pDocument->getElementsByName( _bstr_t( strEdit ) );
で複数取得できているのでしょう。

トップぺージの場合、inputだけなのでうまくいったのでしょう。

回避方法として、何番目かを指定するか、getElementsByIDでID指定で取得する
かが簡単でしょう。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

試してみた。

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の要素すべてに文字が入ります。


返信引用
正月ダディ
 正月ダディ
(@正月ダディ)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

Blueさん、ありがとうございます。
おかげさまで入力できました。

因みに以下のようなコンポーネントだと

<INPUT style=MARGIN: 0px 8px 0px 0px type=submit value=検索>

nameがない場合、typeのsubmitから検索する事も可能なのでしょうか?

getElementsByTagNameメソッドで取得してもNULLが返ってきました。。。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

submitの場合、ふつうはformを取得して、MSHTML::IHTMLFormElementPtrのsubmitを使う
と思いますけど、、、


返信引用
正月ダディ
 正月ダディ
(@正月ダディ)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

はい、最終的にはIHTMLFormElementPtrのsubmitメソッドをコールするのですが、
下記のデータから特定のIHTMLFormElementPtrを取得したい場合、

<INPUT style=MARGIN: 0px 8px 0px 0px type=submit value=検索>

どのように取得すればよいのか思索中です。。。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 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)
{
//
}
}
}


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>特定の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;
}
}
}


返信引用
正月ダディ
 正月ダディ
(@正月ダディ)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

上記の内容で取得とボタン押下できました。
IHTMLInputElementPtrメソッドでvalueが取得出来たんですね↑

この手の参考書等がなく非常に困惑しましたが、
Blueさんのお陰でようやく解決しました。

本当にありがとうございます。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

> IHTMLInputElementPtrメソッドでvalueが取得出来たんですね↑
> この手の参考書等がなく非常に困惑しましたが、
MSDN があります。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました