分享

vb枚举IE页面框架以及获得跨域框架的控制权/访问框架页(转)

 franklinfj 2013-11-23
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编程技巧了,结果这次写这个程序,又辛苦找了十来天的资料。现在看来,自己果然无知。懂得越多,越觉得自己无知。

下面是代码



'需要引用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

以上这段代码的神奇之处在于可以跨域操作框架。

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编程技巧了,结果这次写这个程序,又辛苦找了十来天的资料。现在看来,自己果然无知。懂得越多,越觉得自己无知。

下面是代码



'需要引用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

以上这段代码的神奇之处在于可以跨域操作框架。

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编程技巧了,结果这次写这个程序,又辛苦找了十来天的资料。现在看来,自己果然无知。懂得越多,越觉得自己无知。

下面是代码



'需要引用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

以上这段代码的神奇之处在于可以跨域操作框架。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多