こんにちは、
サイトにログインする、プログラムを作成しておりますが
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/にアクセスした例です。
お気づきの点がございましたら、ご指導いただきたいと思います。
どうぞよろしくお願いします。
この下位のフレームがご希望の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分析できるような
もの(ツリー表示で、各フレームをクリックすることで詳細ソース表示)
を作っています。こうするとわかりやすいですよ。
>また、"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分析できるような
>もの(ツリー表示で、各フレームをクリックすることで詳細ソース表示)
>を作っています。こうするとわかりやすいですよ。
すばらしいですね。今の私には、スキルが追いつかず
作るのはムズカシそうですが、少しづつ作っていきたいと思います。
昨日は十分な検証をせずに誤爆しまして申し訳ありません
さて、単純に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
IMAさん
無事、取得・設定ができました!!
有難うございました。
教えていただきましたソースをベースに
私なりに解析ソフトも作成中です。
おかげでVBのコツみたいなものが
おぼろげながらつかめてきました。
本当に有難うございました!
ツイート | ![]() |