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]);
}

成功搞定!

 

posted @ 2014-06-23 12:01  脸谱匠  阅读(5270)  评论(4编辑  收藏  举报