zoukankan      html  css  js  c++  java
  • 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]);
    }

    成功搞定!

  • 相关阅读:
    扫面线模板
    (动态规划、栈)leetcode 84. Largest Rectangle in Histogram, 85. Maximal Rectangle
    tmux 常见命令汇总
    leetcode 221
    leetcode 319 29
    (贪心)leetcode 392. Is Subsequence, 771. Jewels and Stones, 463. Island Perimeter
    leetcode 982 668
    Python import 同文件夹下的py文件的函数,pycharm报错
    Windows里Anaconda-Navigator无法打开的解决方案
    Windows下 gpu版 Tensorflow 安装
  • 原文地址:https://www.cnblogs.com/icyJ/p/3803758.html
Copyright © 2011-2022 走看看