由于工作需要,我要实现web表单的自动提交功能。最近网站改版在线编辑器采用了KindEditor,用原来的软件不能继续工作了,经过一周努力,终于实了再次自动提交上报的功能,现在总结记录如下。
一、原来网站提交的方式:
View Code
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete) { //定义临时列表数组 ArrayList Als = new ArrayList(); //判断List1中是否还有数据 if (listBox1.SelectedItems.Count > 0) { //对象转换 SendEntity se = listBox1.SelectedItems[0] as SendEntity; //对象加入到临时数组 Als.Add(listBox1.SelectedItems[0]); //页面数据加载并上报 HtmlElement WebTitle = webBrowser1.Document.All["InforReport1_txtTitle"]; HtmlElement WebZaiyao = webBrowser1.Document.All["InforReport1_txtSummary"]; HtmlElement WebContent = webBrowser1.Document.All["InforReport1_dnBox"]; HtmlElement WebLaiyuan = webBrowser1.Document.All["InforReport1_txtInfoFrom"]; HtmlElement WebSumbit = webBrowser1.Document.All["InforReport1_btn"]; WebTitle.SetAttribute("value", se.Title); WebLaiyuan.SetAttribute("value", se.Sour); WebContent.SetAttribute("value", se.Cont); WebSumbit.InvokeMember("click"); foreach (object obj in Als) { listBox1.Items.Remove(obj); } //清除临时数组 Als.Clear(); loading = false; }
由于改版后的系统用了KinEditor在线编辑器,该编辑器是通过JavaScript在客户端生成的,并且需要执行JavaScript的editor.html('新内容')方法,才能赋值,采用原来的方式不能赋值。
二、以前做过的步骤
1、使用闪游浏览器后,发现提交地址变化了,以为后台提交地址改变。使用webBrowser1.Url,发现地址并没变化,并且通过矿工min浏览器验证,后台提交地址确实未变化。解决过个问题的思路错误。
2、以为“C#”提交的数据有过多的Html标签,影响的了赋值。(1)采用正则表过式过滤去掉多余标签;(2)采用webBrowser过滤标签方法。
View Code
string s = ""; using (WebBrowser web =new WebBrowser()) { web.Visible=false; web.DocumentText = se.Cont; web.Document.Write(se.Cont); s = web.Document.Body.OuterText; }
3、经过多次失败分析,需要webBrowser安装执行新的JavaScript脚本。通过搜索找到IEBrowse可以实现该功能。
View Code
#region 用IEBrowser方法执法javascript IEBrowser ie = new IEBrowser(this.webBrowser1); ie.InstallTrace(); #region 变量设置测试成功 //需要先用javascript访问c#变量 string jsString = "var tit,sou,con;"+ "function setAll(title,soure,cont){" + "tit=title;"+ "sou=soure;"+ "con=cont;"+ "alert(tit+'-'+sou+'-'+con);"+"}"; ie.InstallScript(jsString); webBrowser1.Document.InvokeScript("setAll", new string[] { se.Title,se.Sour,se.Cont}); #endregion //得再 //执行javascrrpt语句,设置值 string js = "function myfn(){" + "document.getElementById('InforReport1_txtTitle').value=tit;" + "document.getElementById('InforReport1_txtInfoFrom').value=sou;" + "editor.html(con);" + "" + "}"; ie.InstallScript(js); ie.ExecuteScript("myfn()"); //webBrowser1.Document.InvokeScript("myfn"); #endregion
改进后的代码:
View Code
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete) { //定义临时列表数组 ArrayList Als = new ArrayList(); //判断List1中是否还有数据 if (this.listbSend.Items.Count > 0) { //对象转换 SendEntity se = this.listbSend.Items[0] as SendEntity; //对象加入到临时数组 Als.Add(this.listbSend.Items[0]); //页面数据加载并上报 #region 用IEBrowser方法执法javascript IEBrowser ie = new IEBrowser(this.webBrowser1); ie.InstallTrace(); //执行javascrrpt语句,设置值 string js = "function myfn(tit,sou,con){" + "document.getElementById('InforReport1_txtTitle').value=tit;" + "document.getElementById('InforReport1_txtInfoFrom').value=sou;" + "editor.html(con);" + "" + "}"; ie.InstallScript(js); webBrowser1.Document.InvokeScript("myfn", new string[] { se.Title, se.Sour, se.Cont }); HtmlElement WebSumbit = webBrowser1.Document.All["InforReport1_btn"]; WebSumbit.InvokeMember("Click"); #endregion //处理数据标记 se.IsSend = "已上报"; new SendDAO().Updata(se); //清除数据列表项 foreach (object obj in Als) { this.listbSend.Items.Remove(obj); } //清除临时数组 Als.Clear(); //List中选中下一项. this.listbSend.SelectedIndex = 0; }
总结,通过软件版本的改进,学习了新的知识点,并实现了新功能如网站的自动登录。