向大牛求解webBrower跨域获取HtmlElement

callwww 2010-06-14 10:30:43
问题描述
用webBrower载入页面,包含名为w_top、w_main的两个frame
然后在w_main下又包含w_code、w_lms_content的两个frame

w_code用于显示目录,w_lms_content用于显示内容,问题出来了
显示内容的w_lms_content中有计时的HtmlElement "sce_timer_0",需要截获这个时间作为判断条件
但是w_lms_content的域和webBrower的域不同


代码如下,其中wb为webBrower控件名

HtmlDocument w_main = wb.Document.Window.Frames["w_main"].Document;
HtmlDocument w_code = w_main.Window.Frames["w_code"].Document;
HtmlDocument w_lms_content = w_main.Window.Frames["w_lms_content"].Document;


w_lms_content得不到该载入页面的真正源码

看了些资料,翻遍百度和谷歌,没找到有效解决办法

看到下面代码,不理解,也不知道如果可以的话后面代码怎么写

//获取frame的HTMLDocument接口

HTMLDocument doc = (HTMLDocument)webBrowser1.Document.DomDocument;
object j;
for (int i = 0; i < doc.parentWindow.frames.length; i++)
{
j = i;
HTMLWindow2Class frame = doc.parentWindow.frames.item(ref j) as HTMLWindow2Class;
if (frame.name == "main")
{
MessageBox.Show(frame.document.title);
}
}


难道这个代码可以获取到载入页面的真正源码??如果能,后面代码改怎么写???
不能的话,求大牛给出详细方法,最好是代码
...全文
226 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
明留 2010-10-31
  • 打赏
  • 举报
回复
w_lms_content.GetElementById("sec_timer_0").InnerText


这一句不能跨越!你 的问题还有些没有说清楚
qianglc 2010-10-31
  • 打赏
  • 举报
回复
不知道楼主的问题解决了没有?好想知道如何获取frame里面链接的htmlElement呢
callwww 2010-06-15
  • 打赏
  • 举报
回复
蒋老大能不能说明白点噢,不懂
蒋晟 2010-06-15
  • 打赏
  • 举报
回复
需要扩展WebBrowserSiteBase,实现IServiceProvider和IInternetZoneManager
callwww 2010-06-14
  • 打赏
  • 举报
回复
回11楼
我这样说吧,w_lms_content载入的页面的domain有可能是www.uestcedu.com,也可能是hz.uestcedu.com,因此前一种情况能得到这个计时的时间,而后一种情况,得到的_lms_content.GetElementById("sec_timer_0")为null
很明显是域不同引起的
捷哥1999 2010-06-14
  • 打赏
  • 举报
回复
先确认得到了对象没有,如果得到了,就是InnerText属性不对!
w_lms_content.GetElementById("sec_timer_0")得到的是null还是,真的能获取,如果能获取,就说明不存在你说的跨域安全问题。
callwww 2010-06-14
  • 打赏
  • 举报
回复
回复5楼的帅哥,其实我并不是要源码,我也知道很多东西是服务器输出的,我要的不不是个是个时间而已

4楼的如梦帅哥,你的意思是不是让我去判断载入完全完成,然后自己计时,是这个意思不?思路不错,想了下确实可行,但我也还是想知道跨域怎么获取那破玩意,该死的框架安全
dahaidao 2010-06-14
  • 打赏
  • 举报
回复
解析框架中的url再获取对应的html进行处理。
捷哥1999 2010-06-14
  • 打赏
  • 举报
回复
先确认得到了对象没有,如果得到了,就是InnerText属性不对!
捷哥1999 2010-06-14
  • 打赏
  • 举报
回复
w_lms_content.GetElementById("sec_timer_0")得到的是否null?
callwww 2010-06-14
  • 打赏
  • 举报
回复
3楼的帅哥,我自然知道webBrower是要拿来网页代码,然后解析出来的,如果GetElementByID可以的话
自然下面一句就可以了

w_lms_content.GetElementById("sec_timer_0").InnerText

问题是这一句没用,因为跨域了

捷哥1999 2010-06-14
  • 打赏
  • 举报
回复
难道这个代码可以获取到载入页面的真正源码??如果能,后面代码改怎么写???

页面有很多东西时服务器程序输出的,你要得到源代码估计不行吧?你只能得到最后输出的结果,除非页面上的
javascript代码。

而且如果使用了框架页面,你那样去获取,好像,确实拿不到框架页面内那个网页的内容。这个经常右键点击查看源代码,就能发现的。
兔子-顾问 2010-06-14
  • 打赏
  • 举报
回复
webbrower在访问某个页面后,访问的过程自然是要拿来网页的代码,然后解析显示,所以你可以通过webbrower1.Document.Html来访问到源码。也可以通过GetElementByID获得网页上的控件。
直接用代码方式获取源码是很容易。

System.Net.WebClient wc = new System.Net.WebClient();
Byte[] pageData = wc.DownloadData("网页地址");
string s= System.Text.Encoding.Default.GetString(pageData);

后面你要干嘛?
马老虎 2010-06-14
  • 打赏
  • 举报
回复
貌似真的不能跨域.......
捷哥1999 2010-06-14
  • 打赏
  • 举报
回复
顶起!

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧