IFRAMEのオブジェクト取得について

解決


たけひら  2005-01-25 04:16:27  No: 119164

こんにちは、
サイトにログインする、プログラムを作成しておりますが
IFRAMEオブジェクトがあるサイトにログインできないという
悲しい壁にぶちあたっております。

現在、InternetexplorerオブジェクトをCreateObjectして
以下のようなプログラムで、HTMLを出力することまではできたのですが
INPUTエレメントまで参照することができず、値がセットできません。。。

この手法では、IFRAMEを超えてのアクセスはできないのでしょうか?

 Dim vObj2 As Object
 For Each vObj2 In IE.document.frames("detail").document.All
   If UCase(vObj2.nodeName) = "IFRAME" Then
      If UCase(vObj2.NAME) = "FRAMELOGIN" Then
          Debug.Print vObj2.outerHTML
      End If
   End If
 Next

-----
イミディエイト出力:
<IFRAME border=0 name=frameLogin marginWidth=0 marginHeight=0 src="loginstatus.asp" frameBorder=0 width=205 scrolling=no height=250 allowTransparency></IFRAME>
-----
↑ この例は、ハンゲーム http://www.hangame.co.jp/にアクセスした例です

お気づきの点がございましたら、ご指導いただきたいと思います。
どうぞよろしくお願いします。


IMA  2005-01-26 21:57:37  No: 119165

この下位のフレームがご希望のDocumentのはずです。

また、"fraRTA"はどうなっていますか?
 For Each vObj2 In IE.document.frames("detail").document.All
   If UCase(vObj2.nodeName) = "IFRAME" Then
      If UCase(vObj2.NAME) = "fraRTA" Then
          Debug.Print vObj2.outerHTML
      End If
   End If
 Next

私はこのようなサイト分析には、最下層まで再帰的にDom分析できるような
もの(ツリー表示で、各フレームをクリックすることで詳細ソース表示)
を作っています。こうするとわかりやすいですよ。


たけひら  2005-01-27 07:48:26  No: 119166

>また、"fraRTA"はどうなっていますか?
上記のプログラムを試しましたが、何も出力されませんでした。
念のため、
>If UCase(vObj2.NAME) = "fraRTA" Then

>If UCase(vObj2.NAME) = "FRARTA" Then
に変えて試してみましたが、やはり駄目でした。。。

----
想定例のハンゲーム http://www.hangame.co.jp/のサイトでいいますと
トップページのページは、
 ・top.htm
 ・login.htm
 ・bar.htm
にフレームわけされています。

このうち、login.htm の中に、
<iframe name="frameLogin" src="loginstatus.asp" height="250"
 width="205" marginheight="0" marginwidth="0" border="0"
 frameborder="0" scrolling="no" allowtransparency="true"></iframe>
という記述があり、この”loginstatus.asp”というプログラムで
Form構文を出力しているのではないかとあたりをつけました。

loginstatus.aspの出力したHTML構文を確認したところ、
以下の構文があることが確認できました。
---
<form name="loginform" method="post"
  action="http://id.hangame.co.jp/login.asp">
<input type="text" name="strmemberid" value="">
<input type="password" name="strpassword" value="">
<input type="hidden" name="nxtURL" 
 value="http://www.hangame.co.jp/loginstatus.asp">
</form>
---

このstrmemberidとstrpassword の .Valueを
VBで取得したいのですが、悲しいかな、うまくいきません。。。

上記HTML構文の確認には、VBから、ではなくブラウザで(IEではソース表示が禁止されているようで、LunaScapeで)確認しました。

IFRAMEタグのouterHTMLまではたどりつくのですが
その先をどう参照すればよいのかが、分からず行き詰まってしまいました。

IMA様からご指導いただいた
>この下位のフレームがご希望のDocumentのはずです。
の、下位のフレームを確認する方法をご指導頂ければ大変嬉しいです。
何か、私自身、根本的な部分を理解していないため
頓珍漢な質問になっているかもしれませんが、ご容赦ください。

ウォッチ式などで、オブジェクト構造などを確認したのですが、
IEのオブジェクトは、複雑すぎて、行き詰まってしまったしだいです。

よろしくお願いいたします。

p.s.
>私はこのようなサイト分析には、最下層まで再帰的にDom分析できるような
>もの(ツリー表示で、各フレームをクリックすることで詳細ソース表示)
>を作っています。こうするとわかりやすいですよ。
すばらしいですね。今の私には、スキルが追いつかず
作るのはムズカシそうですが、少しづつ作っていきたいと思います。


IMA  2005-01-28 00:50:31  No: 119167

昨日は十分な検証をせずに誤爆しまして申し訳ありません

さて、単純にID,PassWordは以下で参照或いは設定ができます(確認済み)
oIE.document.frames(1).frames(0).document.Forms("loginform").strmemberid.Value
'oIE.document.frames(1).frames(0).document.Forms(0).strmemberid.Value でも可のはず
oIE.document.frames(1).frames(0).document.Forms("loginform").strpassword.Value

次にフレームの列挙ですが、昔のNetscape4.7頃にはHPのソースを階層表示できるようになっていて、それをIEのDOMに準じたもので取得できればと作ったものです。 ( VB6 )
私は本職ではないので、見にくいコードですいません。御参考まで
(コードは抜き出して記載していますので、エラーが出るかも知れません)
TreeView1とText1(MultiLine,ScrollBarをtrue)を用意
→私の場合、Text1の代わりにタグがカラー表示できるK2Editorへ出力しています。

MSHTML.TBL を参照設定して下さい

TreeView1に表示されるノードの表示が
  FRAME(1)なら
  oIE.document.frames(1).document.・・・
  FRAME(10)なら
  oIE.document.frames(1).frames(0).document.・・・
  FRAME(100)なら
  oIE.document.frames(1).frames(0).frames(0).document.・・・
で参照できます。

---------------------------------------------------------------------------------
Option Explicit

Private oIE As Object
Private TreeColl As New Collection

Private Sub Form_Load()
    Set oIE = CreateObject("InternetExplorer.Application")
    oIE.Navigate2 "http://www.hangame.co.jp/"
    oIE.Visible = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
        Set oIE = Nothing
End Sub

Private Sub Command1_Click()
    Call AutoDisplayDOM_Attributes
    Me.Caption = " " & oIE.LocationName & " ( " & oIE.LocationURL & " )"
End Sub

Private Sub AutoDisplayDOM_Attributes()
Dim NewNode As Node
    ' 新規コレクション作成
    On Error Resume Next
    If TreeColl.Count > 0 Then
        Set TreeColl = Nothing
    End If
    On Error GoTo 0
    Set TreeColl = New Collection
    ' TreeViewをクリア
    If TreeView1.Nodes.Count > 0 Then
        TreeView1.Nodes.Clear
    End If
    ' 現在のページ情報をTreeViewに表示
    Set NewNode = TreeView1.Nodes.Add(, , "PP", "Parent Page")
        Set NewNode = TreeView1.Nodes.Add("PP", tvwChild, "PPT", "Tittle")
            TreeColl.Add oIE.Document.Title, Key:="PPT"
        Set NewNode = TreeView1.Nodes.Add("PP", tvwChild, "PPU", "URL")
            TreeColl.Add oIE.Document.URL, Key:="PPU"
        Set NewNode = TreeView1.Nodes.Add("PP", tvwChild, "PPH", "HTML")
            TreeColl.Add oIE.Document.documentElement.outerHTML, Key:="PPH"
        NewNode.EnsureVisible
        Set NewNode = Nothing
    ' フレーム情報をTreeViewに表示
    If oIE.Document.Frames.Length Then
        Set NewNode = TreeView1.Nodes.Add(, , "FP", "Frames")
        Call FindFrames(oIE.Document, "FP", "")
    End If
End Sub

Private Sub FindFrames(oDoc As HTMLDocument, TreeParent As String, NodeNumbr As String)
    Dim Fcnt As Byte, i As Byte, shtml As String
    Fcnt = oDoc.Frames.Length
    Dim NewNode As Node
    ' 現フレーム情報の列挙
    On Error Resume Next
    For i = 0 To Fcnt - 1
        Set NewNode = TreeView1.Nodes.Add(TreeParent, tvwChild, "F" & NodeNumbr & i, "FRAME(" & NodeNumbr & i & ")")
        'タイトル
        Set NewNode = TreeView1.Nodes.Add("F" & NodeNumbr & i, tvwChild, "F" & NodeNumbr & i & "T", "Tittle")
            TreeColl.Add oDoc.Frames(i).Document.Title, Key:="F" & NodeNumbr & i & "T"
        ' URL
        Set NewNode = TreeView1.Nodes.Add("F" & NodeNumbr & i, tvwChild, "F" & NodeNumbr & i & "U", "URL")
            TreeColl.Add oDoc.Frames(i).Document.URL, Key:="F" & NodeNumbr & i & "U"
        ' htmlテキスト
        Set NewNode = TreeView1.Nodes.Add("F" & NodeNumbr & i, tvwChild, "F" & NodeNumbr & i & "H", "HTML")
            shtml = oDoc.Frames(i).Document.documentElement.outerHTML
            TreeColl.Add shtml, Key:="F" & NodeNumbr & i & "H"
        ' サブフレームを確認
        If oDoc.Frames(i).Length > 0 Then
            Call FindFrames(oDoc.Frames(i).Document, "F" & NodeNumbr & i, NodeNumbr & i)
        End If
        ' ノードを展開
        NewNode.EnsureVisible
    Next i
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
    On Error Resume Next
    'Debug.Print TreeColl.Item(Node.Key)
    Text1 = TreeColl.Item(Node.Key)
End Sub


たけひら  2005-01-29 22:36:09  No: 119168

IMAさん

無事、取得・設定ができました!!
有難うございました。

教えていただきましたソースをベースに
私なりに解析ソフトも作成中です。
おかげでVBのコツみたいなものが
おぼろげながらつかめてきました。

本当に有難うございました!


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加