webbrowser自动提交以后不能正确显示跳转的页面

niceday17 2010-10-08 08:52:51
本人想做一个winform的自动截图程序.
但是在利用webbrowser做自动登录出现了问题.
问题描述:利用webbrowser自动填写并提交表单,但在webbrowser的窗口上却看不到表单提交以后希望的页面。

比如,创建了一个webbreowser对象MyBrowser,然后Navigate一个需要权限的url1,它会自动跳转到登录页面url2。这个时候调用自动填写提交的方法,就可以开发到我访问的url1。最后,调用截图方法截图。

通过断点调试可以我可以截取到我期望的图片,但是不设置断点的话,调试运行就会不停的重复Application.DoEvents();和MyBrowser_DocumentCompleted方法。请问这是什么问题。


部分代码如下:
private void MyBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
SetLoginParams(this.URL);//自动提交的方法
}

public void GetIt()
{
MyBrowser.ScriptErrorsSuppressed = true;
MyBrowser.Navigate(this.URL);
MyBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(MyBrowser_DocumentCompleted);
while (MyBrowser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
}
...全文
297 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
niceday17 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zp19900704 的回复:]
while (MyBrowser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
} 去掉看看
[/Quote]

这样也不行...
webbrowser通过Application.DoEvents()来初始化.
去掉的话,
MyBrowser.ReadyState = Uninitialized
niceday17 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zp19900704 的回复:]
所以判断触发事件url是不是webbrowser的当前url 也就是你Navigate的url
[/Quote]

现在的情况是:

我navigate的url假设是A.需要权限登录以后才能访问;
执行完自动提交表单之后,webbrowser.url 却是B,是那个登陆页面.
很明显 webbrowser.url的值不是我期望的A
zp19900704 2010-10-08
  • 打赏
  • 举报
回复
while (MyBrowser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
} 去掉看看
niceday17 2010-10-08
  • 打赏
  • 举报
回复
不行呀.
依然是原来的问题.单步调试能够截取到我期望访问得页面.
不然截取出来的还是权限登录表单页面.
zp19900704 2010-10-08
  • 打赏
  • 举报
回复
webbrowser Navigate之后会执行2次DocumentCompleted
进入事件后分别是 ReadyState 会有Intercative和Complete这2种状态

Complete=该控件已完成新文档及其所有内容的加载;Interactive=该控件已经加载足够的文档以允许有限的用户交互,比如单击已显示的超链接。所以DocumentCompleted事件会在Interactive状态和Complete状态各调用一次

而e.url的意思是 如果你Navigate的页面包含了框架ifream 则ifream中也会触发DocumentCompleted事件 所以判断触发事件url是不是webbrowser的当前url 也就是你Navigate的url
niceday17 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zp19900704 的回复:]
private void wb_DocumentCompletedTwo(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (wb.ReadyState != WebBrowserReadyState.Complete)
return;
if (e.Url.ToString() != wb.Url.ToStrin……
[/Quote]
不是很明白,在什么地方执行这段代码呢?
wuyq11 2010-10-08
  • 打赏
  • 举报
回复
MyBrowser.DocumentCompleted 中
while (MyBrowser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
http://topic.csdn.net/u/20090702/11/845f5ac5-48f2-463a-8271-47c5eeb33cab.html
zp19900704 2010-10-08
  • 打赏
  • 举报
回复
private void wb_DocumentCompletedTwo(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (wb.ReadyState != WebBrowserReadyState.Complete)
return;
if (e.Url.ToString() != wb.Url.ToString())
return;
//事件处理代码
wb.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompletedTwo);
}
zp19900704 2010-10-08
  • 打赏
  • 举报
回复
private void wb_DocumentCompletedTwo(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (wb.ReadyState != WebBrowserReadyState.Complete)
return;
if (e.Url.ToString() != wb.Url.ToString())
return;

wb.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompletedTwo);
}
無名小伙 2010-10-08
  • 打赏
  • 举报
回复
顶。。。这个应该不是webbrowser的问题吧
niceday17 2010-10-08
  • 打赏
  • 举报
回复
一个webbrowser对象是不是只支持一套session?
为什么我前台的权限访问页面打开了.但是后台的权限访问页面就打不开.
如果后台的页面访问到了,前台的权限访问页面就打不开.
niceday17 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zp19900704 的回复:]
先navigate登录的页面 然后输入登录信息 触发登录按钮事件后
再navigate你想要到达的页面
是不是这样的顺序呢?
[/Quote]
嗯 对.
zp19900704 2010-10-08
  • 打赏
  • 举报
回复
先navigate登录的页面 然后输入登录信息 触发登录按钮事件后
再navigate你想要到达的页面
是不是这样的顺序呢?

110,571

社区成员

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

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

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