在线的高手帮忙调试一个程序 关于webbrowser如何访问框架页
http://u.115.com/file/t1ef4fc33c要的效果在程序里打开的网页中的姓名那栏赋上值
此程序现在运行没反应 IframeIE(j).Document.getElementsByName("bh")(0).Value = "班级"你要在指定的网页才可以执行这句话啊,一共有两个frame,假设第一个上面没有bh这个元素你去操作当然出错了,那个是do循环,你要操作这句话至少加个if语句判断,看样子你根本没看懂那段代码。你去看看这个帖子,可以和楼主探讨探讨。http://topic.csdn.net/u/20101107/18/341a244e-b941-4ddc-a4e8-484fe43486b2.html,我这边本机有限制无法直接调试。另外你那个不需要跨域,直接用WebBrowser1.Document.frames(1).Document.getElementsByName("bh")(0).value = "班级"应该就可以了。 在下面程序中Form_Load事件中我加载的是这个网页啊,然后调用的时候Call EnumFrames(WebBrowser1)
这样一来IframeIE(j).Document.getElementsByName("bh")(0).Value = "班级"你要在指定的网页才可以执行这句话啊,这里有问题?
然后IframeIE(j)当j等于1时难道不是代表网页中的Iframe(1)?如果是应该就没错啊
另外的话一个框架的话问题已经解决可以执行赋值操作,只是我不能得到单个框架中的文字不知道咋回事
这里由于一时找不到框架嵌套的网页只是用这个网页举个例而已
Private Sub Command1_Click()第一个应该是0。。。 遇到问题可以debug设断点查看各个变量的值 就算是0吧不是有句On Error Resume Next吗
Call EnumFrames(WebBrowser1)
End Sub
Private Sub Form_Load()
WebBrowser1.Navigate "http://jwglxt.enxnc.com.cn/jwc_index.html"
End Sub
我把每行代码都设置了断点,发现每行代码都运行了,可是结果就是没显示啊
偶技术差了,实在搞不懂 If Err.Number = 0 Then 这个if语句拿了应该就行了,这个错误号一旦为0下面都是0了,原来程序有个bug,应该在下次循环时用Err.Clear语句清除下。
If Err.Number = 0 Then '检查错误号,0的话表示未发生错误,往下操作
'将框架页面依次赋值到IframeIE数组中
ReDim Preserve IframeIE(0 To j) '重定义数组IframeIE,往后每个数组长度加1
Set IframeIE(j) = pUnk '将当前保存在pUnk中的frame框架放到刚追加的数组IframeIE(j)
j = j + 1 'frame个数加1,如果下面继续存在frame的话用于IframeIE数组重定义用
else
Err.Clear
End If
哎照样是不行啊不知道咋整了 还是不行啊郁闷死了
Private IframeIE() As Object '这里报错是否应为Private IframeIE() As SHDocVwCtl.WebBrowser
'枚举框架,参数WB是一个webbrowser控件的名称,其中承载着我们要分析的页面
Sub EnumFrames(ByVal WB As WebBrowser) 'sub过程声明
Dim j As Integer '用于记录frames的个数,方便下面的redim存到IframeIE中
Dim pContainer As olelib.IOleContainer '库的内部对象,根据下面的来看是用来存放webbrowser的document对象的
Dim pEnumerator As olelib.IEnumUnknown '库的内部对象,用于检测是否存在下一个frame了,有的话就存到变量pUnk中
Dim pUnk As olelib.IUnknown '库的内部对象,基本就是指网页中的frame对象,相当于一个webbrowser
Dim pBrowser As SHDocVwCtl.WebBrowser_V1
'获得页面的Document接口,然后我们就可以对其为所欲为了
Set pContainer = WB.object.Document '将webbrowser的document对象装载到pContainer
'很奇怪,有时候上面这段对象赋值出错,用下面这句就没有问题了
' Set pContainer = WB.Document
If pContainer.EnumObjects(OLECONTF_EMBEDDINGS, pEnumerator) = 0 Then '用库对象的内部方法"EnumObjects"检测是否存在框架页,并将枚举结果存放到pEnumerator中
Set pContainer = Nothing '对象pContainer用不到了,清空
Do While pEnumerator.Next(1, pUnk) = 0 '一个个枚举,如果结果大于0就表示有结果,开始进行do循环体内操作
On Error Resume Next '忽略错误
If Err.Number = 0 Then '检查错误号,0的话表示未发生错误,往下操作
'将框架页面依次赋值到IframeIE数组中
ReDim Preserve IframeIE(0 To j) '重定义数组IframeIE,往后每个数组长度加1
Set pBrowser = pUnk
Debug.Print "Frame: " & pBrowser.LocationURL
Set IframeIE(j) = pBrowser '将当前保存在pUnk中的frame框架放到刚追加的数组IframeIE(j)
IframeIE(j).Document.getElementsByName("bh")(0).Value = "班级"
j = j + 1 'frame个数加1,如果下面继续存在frame的话用于IframeIE数组重定义用
Else
Err.Clear
End If
Loop
Set pEnumerator = Nothing '清空对象
End If
End Sub
Private Sub Command1_Click()
Call EnumFrames(WebBrowser1)
End Sub
Private Sub Form_Load()
WebBrowser1.Navigate "http://jwglxt.enxnc.com.cn/jwc_index.html"
End Sub
好像必须要通过pBrowser来传递下。以上代码测试通过。不知道你怎么调试的。“我把每行代码都设置了断点,发现每行代码都运行”要看各个变量的值,另外注意去掉on error 的语句再调试 [color=#FF0000]Set pBrowser = pUnk[/color]
忘记了代码框里是不能标记颜色的了,自己把颜色标记去掉吧
测试通过缘何百度知道的登录框控用这段代码制不了 另外Dim pBrowser As SHDocVwCtl.WebBrowser_V1 这句声明啥意思
这样修改后是否还能跨域操作 这句话我也不是很清楚,应该是类似document对象。不知道为什么一定要用它做中转,估计只能那个库的作者知道了。
Set pBrowser = pUnk
Set getFrames = pBrowser
加了那几句可以跨域,不加反倒不行了,你在一楼的代码反正没法通过,不知道最初的作者是怎么做的,你可以联系他看看。
百度知道的那个没有frame当然不行了。
相关资料参考下面的帖子,不懂的多在网上搜索搜索,要掌握学习的方法:
http://topic.csdn.net/u/20101107/18/341a244e-b941-4ddc-a4e8-484fe43486b2.html 呵呵我说的是百度网页中的知道网页里面的登录窗口它是浮动在上面的是有frame的
你能给我个示例源码吗做好的运行可以看到效果的这样应该理解的快些
我一时也找不到需要跨域才能操作的网页
这样一来没法真正体会它 你去找找“跨域”是什么意思吧。百度网页中的知道网页里面的登录窗口显然也不是跨域
这个是典型的跨域,给你了又不看
http://topic.csdn.net/u/20101107/18/341a244e-b941-4ddc-a4e8-484fe43486b2.html
以及这个:
http://topic.csdn.net/u/20100826/21/57113d41-6a6f-4b97-b20d-70bf26f55b7e.html 对不住了我刚才才注意呵呵
现在知道什么叫跨域了
这个问题搞定
比如主网页在 http://www.abc.com/ 里面有一个iframe是加载的 http://www.def.com/ 的附页面
并且在附页面http://www.def.com/里有文本框什么的,你要在主网页里操作附页面里的文本框这时就要用到跨域操作了.
不瞒你说先前是不知道跨域访问是什么意思所以一片茫然啊
现在清楚了
累了你了呵呵
补充:VB , 网络编程