webbrowser获取无ID无Name控件并模拟点击

来源:互联网 发布:模拟板胡软件 编辑:程序博客网 时间:2024/04/29 23:00

常见的获取控件并点击(自动登录):

复制代码
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]);}

成功搞定!

阅读全文
0 0
原创粉丝点击