|
vb枚舉IE頁面框架以及獲得跨域框架的控制權/訪問框架頁
|
HTML code <FRAMESET border=0 frameSpacing=0 COLS="50%,*" frameBorder=0> <FRAME name=topFrame src="http://www.baidu.com"> <FRAME name=topFrame src="http://www.google.com"> </FRAMESET> 上面的用WebBrowser1.Document.frames(0)就表示左邊百度的框架頁,百度的那個搜索框有個屬性 name="wd",這樣我們用下面的vb代碼操作給它賦值: VB code Private Sub Command1_Click() ' MsgBox WebBrowser1.Document.frames.length'這行會顯示2,表示有兩個frame框架 ' MsgBox WebBrowser1.Document.frames(0).Document.body.innerhtml'這行代碼提示拒絕訪問 WebBrowser1.Document.frames(0).Document.getElementsByName("wd")(0).Value = "測試"'賦值失敗,提示拒絕訪問 End Sub你參考下這個 VB code ' 為運行本程序,應在“菜單->工程->部件”中添加“Microsoft Internet Controls” ' 并在“菜單->工程->引用”中添加“Microsoft HTML Object Library” Sub EnumFrames(ByVal wb As WebBrowser) Dim pContainer As olelib.IOleContainer Dim pEnumerator As olelib.IEnumUnknown Dim pUnk As olelib.IUnknown 'Dim pBrowser As SHDocVw.IWebBrowser2 Dim pBrowser As SHDocVwCtl.WebBrowser_V1 Set pContainer = wb.Object.Document ' Get an enumerator for the frames If pContainer.EnumObjects(OLECONTF_EMBEDDINGS, pEnumerator) = 0 Then Set pContainer = Nothing ' Enumerate and refresh all the frames Do While pEnumerator.Next(1, pUnk) = 0 On Error Resume Next ' Clear errors Err.Clear ' Get the IWebBrowser2 interface Set pBrowser = pUnk If Err.Number = 0 Then For i = 0 To pBrowser.Document.All.length - 1 If UCase(pBrowser.Document.All(i).tagName) = "A" Then 'List1.AddItem pBrowser.All(i).href Debug.Print Now & pBrowser.Document.All(i).href Debug.Print Now & pBrowser.Document.All(i).innterHTML pBrowser.Document.All(i).Click 'Exit For End If Next Debug.Print "Frame: " & pBrowser.LocationURL End If Loop Set pEnumerator = Nothing End If End Sub 謝謝樓上,搞定了,貼上完整代碼: VB code ' 為運行本程序,應在“菜單->工程->部件”中添加“Microsoft Internet Controls” ' 并在“菜單->工程->引用”中添加“Microsoft HTML Object Library”,添加“Edanmo's OLE interfaces & functions v1.4” Private Sub Command1_Click() Dim pContainer As olelib.IOleContainer Dim pEnumerator As olelib.IEnumUnknown Dim pUnk As olelib.IUnknown Dim pBrowser As SHDocVwCtl.WebBrowser_V1 Set pContainer = WebBrowser1.Object.Document If pContainer.EnumObjects(OLECONTF_EMBEDDINGS, pEnumerator) = 0 Then Set pContainer = Nothing Do While pEnumerator.Next(1, pUnk) = 0 On Error Resume Next Err.Clear Set pBrowser = pUnk If Err.Number = 0 Then If pBrowser.LocationURL = "http://www.baidu.com/" Then pBrowser.Document.getElementsByName("wd")(0).Value = "測試" Exit Sub End If End If Loop Set pEnumerator = Nothing End If End Sub 公示下是為了讓大家都學習下,另外貼個我找到的資料,跟樓主的很像,是從這個改過來的吧?呵呵 vb枚舉IE頁面框架以及獲得跨域框架的控制權 為什么寫這個? 1.操作跨域框架。這個資料很難得,我在網上苦苦找了一個星期。以前研究BHO的時候,也是找了好久的。留此存照。在vb吧提問如何取得跨域框架的控制權,僅有一個人對此關注,并且說很簡單,直接分析源代碼,或者用DOM等...恩,現在的vb吧確實很少有深刻的內容了。 2.了解IE編程知識。本以為通過一次BHO編程,已經了解一些IE編程技巧了,結果這次寫這個程序,又辛苦找了十來天的資料?,F在看來,自己果然無知。懂得越多,越覺得自己無知。 下面是代碼 '需要引用Microsoft Html Object Library,Edanmo's Ole interfaces 1.81 ,Microsoft Internet Controls '其中,Edanmo's Ole interfaces 1.81是Edanmo寫的OLELIB.TLB,請自己在網上搜索下載 '聲明一個全局變量數組IframeIE,用來保存網頁框架的操作對象;至少我是這么操作的,當然有更好的辦法請指教cnoldjohn嬤嬤茶 Private IframeIE() As SHDocVw.WebBrowser '下面代碼的核心是修改自MVP Edanmo的大作 '枚舉框架,參數WB是一個webbrowser控件的名稱,其中承載著我們要分析的頁面 Sub EnumFrames(ByVal WB As WebBrowser) Dim j As Integer Dim pContainer As olelib.IOleContainer Dim pEnumerator As olelib.IEnumUnknown Dim pUnk As olelib.IUnknown '獲得頁面的Document接口,然后我們就可以對其為所欲為了 Set pContainer = WB.Object.Document '很奇怪,有時候上面這段對象賦值出錯,用下面這句就沒有問題了 'Set pContainer = WB.Document If pContainer.EnumObjects(OLECONTF_EMBEDDINGS, pEnumerator) = 0 Then Set pContainer = Nothing Do While pEnumerator.Next(1, pUnk) = 0 On Error Resume Next If Err.Number = 0 Then '將框架頁面依次賦值到IframeIE數組中 ReDim Preserve IframeIE(0 To j) Set IframeIE(j) = pUnk j = j + 1 End If Loop Set pEnumerator = Nothing End If End Sub 以上這段代碼的神奇之處在于可以跨域操作框架。 |