c# winform 程序,断点调试可以正常,但是直接执行就不行
我的问题不好讲,听我慢慢讲来首先这是一个方法,其中:
mbf.textBoxMessage.AppendText(kcp + "****************" + kcp + Environment.NewLine);
之类的,是在一个mbf窗口中显示运行的状态信息,不用管,
作用是搜索页面中符合条件的连接<a>然后调用obj[i].Parent.InvokeMember("click");
来模拟点击事件,作用是下载一个文件,跳出下载框
里面的f8,messagebox在timer中,作用是等检测到下载框就关闭他同时关闭这个messagebox
public void ShowObj(WebBrowser webBrowser, int kcp)
{
//////////////String ss = "";
HtmlElementCollection obj = webBrowser.Document.GetElementsByTagName("IMG");
mbf.textBoxMessage.AppendText(kcp + "****************" + kcp + Environment.NewLine);
mbf.textBoxMessage.AppendText(Program.mf.cf.f8 + Environment.NewLine);
mbf.textBoxMessage.AppendText(kcp + "****************" + kcp + Environment.NewLine);
for (int i = 0; i < obj.Count; i++)
{
if (obj[i].GetAttribute("src") == "http://km.sgcc.com.cn:8080/km/images/icons/download.gif")
{
if (obj[i].Parent.TagName == "A")
{
String times = obj[i].Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.Parent.FirstChild.FirstChild.Children[2].FirstChild.FirstChild.FirstChild.Children[1].OuterText.Trim();
String years = times.Substring(0, 4);
int yeari = Int32.Parse(years);
String months = times.Substring(5, 2);
int monthi = Int32.Parse(months);
String days = times.Substring(8, 2);
int dayi = Int32.Parse(days);
DateTime dt = new DateTime(yeari, monthi, dayi);
if (dt > startDT && dt < endDT)
{
// System.Threading.Thread.Sleep(10000);
// MessageBox.Show("danji");
Program.mf.cf.f8 = 0;
mbf.textBoxMessage.AppendText(Program.mf.cf.f8 + Environment.NewLine);
if (kcp > 1)
{
obj[i].Parent.Click += new HtmlElementEventHandler(Parent_Click);
obj[i].Parent.InvokeMember("click");
System.Threading.Thread.Sleep(100);
//MessageBox.Show(obj[i].Parent.OuterHtml+Environment.NewLine+Environment.NewLine+
//"等待文件下载框弹出,并自动关闭", "下载等待");
}
else
{
obj[i].Parent.Click += new HtmlElementEventHandler(Parent_Click);
obj[i].Parent.InvokeMember("click");
//MessageBox.Show(obj[i].Parent.OuterHtml + Environment.NewLine + Environment.NewLine +
//"等待文件下载框弹出,并自动关闭", "下载等待");
}
//MessageBox.Show(times,"时间");
//mbf.textBoxMessage.AppendText(times + Environment.NewLine);
////////ss += "\"" + times + Environment.NewLine + Environment.NewLine;
}
}
}
}
Program.mf.cf.f8 = -1;
}
void Parent_Click(object sender, HtmlElementEventArgs e) { MessageBox.Show("等待文件下载框弹出,并自动关闭", "下载等待"); }
网页开始在第一页,执行上面这个操作后,就模拟点击第二页,然后再执行同样的操作,代码在下面
使用outerhtml检测的html是对的,并且上面方法的左后一句的方法也检测到了单击事件,然后问题就出来了
//////////////////////////////////////////////////////////////////////page 1
ShowObj(webBrowserMain, 1);
//////////////////////////////////////////////////////////////////////page next
HtmlElement nextPage = webBrowserMain.Document.GetElementById("setpage");
while (nextPage.FirstChild.Children[nextPage.FirstChild.Children.Count - 1].TagName == "A" && nextPage.FirstChild.Children[nextPage.FirstChild.Children.Count - 1].InnerText == "下一页")
{
nextPage.FirstChild.Children[nextPage.FirstChild.Children.Count - 1].InvokeMember("click");
pcon++;
cf.f4 = 0;
MessageBox.Show("正在打开第" + pcon + "页,请稍后……", "第" + pcon + "页");
ShowObj(webBrowserMain, pcon);
nextPage = webBrowserMain.Document.GetElementById("setpage");
}
控制代码:
c# webbrowser InvokeMember --------------------编程问答-------------------- 网站属于内网不太好发……只能让你们看看程序了……上面是部分代码,要是你们看不明白,我再发全代码
void timerConfig_Tick(object sender, EventArgs e)
{
if (f8 == 0)
{
Program.mf.mbf.textBoxMessage.AppendText("等待下载框弹出……" + Environment.NewLine);
IntPtr ptr = FindWindow(null, "文件下载");
if (ptr != IntPtr.Zero)
{
System.Threading.Thread.Sleep(100);
PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
//IntPtr ptr1 = FindWindow(null, "下载等待");
//if (ptr1 != IntPtr.Zero)
//{
// PostMessage(ptr1, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
//}
//StartKiller(100, "下载等待");
f8 = 1;
f9 = 0;
Program.mf.mbf.textBoxMessage.AppendText(Program.mf.cf.f8 + Environment.NewLine);
}
}
}
总之现在这问题我快疯了…… --------------------编程问答-------------------- 说明那一行是异步的,直接执行下面的,上面的结果还没有出来。断点的话,已经执行出来了。 --------------------编程问答-------------------- “网页开始在第一页,执行上面这个操作后,就模拟点击第二页,然后再执行同样的操作......”
程序将网页导航到第二页,就应该立刻结束了。然后,等到你的 webBrowser 触发 DocumentCompleted 事件,并且当它的 ReadyState 属性为 WebBrowserReadyState.Complete 时,才能执行 ShowObj(webBrowserMain, pcon) --------------------编程问答-------------------- 帮忙顶下,希望可以帮我看看我的帖子,谢谢了
http://bbs.csdn.net/topics/390651035 --------------------编程问答-------------------- 给你写个捕获事件的例子:
WebBrowserDocumentCompletedEventHandler proc1 = null;
WebBrowserDocumentCompletedEventHandler proc2 = null;
proc1 = new WebBrowserDocumentCompletedEventHandler((sender, e) =>
{
if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
this.webBrowser1.DocumentCompleted -= proc1;
this.webBrowser1.DocumentCompleted += proc2;
this.webBrowser1.Navigate("http://bbs.csdn.net/topics/390650774");
}
});
proc2 = new WebBrowserDocumentCompletedEventHandler((sender, e) =>
{
if (this.webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
this.webBrowser1.DocumentCompleted -= proc2;
this.webBrowser1.Navigate("http://bbs.csdn.net/topics/390651044");
}
});
this.webBrowser1.DocumentCompleted += proc1;
this.webBrowser1.Navigate("http://bbs.csdn.net/");
这里,等google页面真正完全加载完毕,才会导航到第二个页面。同样地,等完全加载完毕,才会去执行proc2。
当页面还有某些内容没有下载完毕(例如某个js文件、某个图片),则不会向下执行。 --------------------编程问答-------------------- 如果会写代码
var a=1;
var b= a+1;
这种顺序执行的代码,可能每一个人都会写。这没有什么门槛。
但是如果现实需要你对程序执行环境知识的理解稍微复杂一点,这就需要学习了。 --------------------编程问答-------------------- 其实代码是一回事,思路更重要。
一看到你写的 while 循环结构中间的那几句,就知道有问题了。触发Click按键操作之后,你的程序就应该结束了。然后等浏览器通知你“下载完毕”之后再去继续处理。 --------------------编程问答-------------------- 如果单步是正确的,但是连续执行会出错,那你可以在中间加个断点,在这个断点停留几秒钟再继续执行,如果正确了,就证明是程序需要时间下载或处理数据。需要把出错的代码段放到完成下载的事件上去 --------------------编程问答-------------------- 除
补充:.NET技术 , C#