webbrowser获取无ID无Name控件并模拟点击
常见的获取控件并点击(自动登录):
var txtUserID = wbsTask.Document.All["userName"]; var txtPsd = wbsTask.Document.All["password"]; var txtVrf = wbsTask.Document.All["code"];var btnSubmit = wbsTask.Document.All["btnSubmit"]; var code = ReadLoginVerifyCode(); var userInfo = cboAccount.ComboBox.SelectedValue as UserInfo; if (userInfo == null) { MessageBox.Show("获取用户信息失败!"); return; } txtUserID.SetAttribute("value", userInfo.UserID); txtPsd.SetAttribute("value", userInfo.Password); txtVrf.SetAttribute("value", code);if (string.IsNullOrWhiteSpace(code)) return; btnSubmit.InvokeMember("click");//自动提交
特殊需求:查找webbrowser页面上的一个无ID无Name的A控件,后台模拟点击事件。
初始代码:
var b = wbsTask.Document.Body.InnerText.Contains("XXX"); if (!b) return false; foreach (HtmlElement he in wbsTask.Document.GetElementsByTagName("a")) { if (he.InnerText == "XXX") { he.InvokeMember("click"); } }
最后发现无法引发click事件,而a处的代码为:
<a href="javascript:;" onclick="dialog(650,450,'zzz','../../dialog/sss.aspx?id=bbb');return false;" class="link_t">XXX</a>
也就是说click事件调用了一个javasript函数。
为毛没有执行he.InvokeMember("click")这句呢?我百思不得其解。附带说明,上面的代码是在documentComplete事件时调用的,所以页面加载已经完成。
在网上搜寻解决方案,得几种提示
提示一:html代码已经加载完毕,但js还没有加载完毕,解决方案timer一下。
if (he.InnerText == "XXX") { new Action(() => { System.Threading.Thread.Sleep(10000); new Action(() => he.InvokeMember("click")).InvokeRun(this); }).RunThread(); }
这里的InvokeRun(this)是多线程回调,RunThread新开线程执行代码。测试结果:无效--------.
提示二:click变Click或onclick,无效。
提示三:
if (he.InnerText == "XXX") { wbsTask.Document.Focus(); IHTMLElement nativeElement = he.DomElement as IHTMLElement; nativeElement.click(); }
测试结果:无效*-----
最终解决方案:
if (he.InnerText == "XXX") { var obj = he.DomElement; var mi = obj.GetType().GetMethod("click"); mi.Invoke(obj, new object[0]); }
成功搞定!