• c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2


    可以实现例如通过应用程序操作google搜索,用户输入要搜索的内容,然后在google中搜索;可以自动点击网页上的按钮等功能

        1. 加入对Microsoft Internet Controls的引用;
        2. 加入对Microsoft HTML Object Library的引用;

    (要引入Microsoft.mshtml.dll 地址是C:/Program Files/Microsoft.NET/Primary Interop Assemblies)
        3. 通过mshtml.IHTMLDocument2、SHDocVw.InternetExplorer、SHDocVw.ShellWindowsClass获取当前打开的google搜索页面的IE窗口句柄;
        4. 根据3返回的句柄,获得当前打开的google页面的mshtml.IHTMLDocument2对象;
        5. 根据4返回的IHTMLDocument2对象,获得搜索输入框和提交按钮(可查看google页面源文件,确认输入框和提交按钮的类型和名字);
        6. 在搜索输入框中输入要搜索的内容,并执行提交按钮的click动作即可进行搜索;

    简单来说:

    打开ie:

    SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
    object objFlags = 1;
    object objTargetFrameName = "";
    object objPostData = "";
    object objHeaders = "";
    SHDocVw.InternetExplorer webBrowser1= (SHDocVw.InternetExplorer)shellWindows.Item(shellWindows.Count-1);
    webBrowser1.Navigate(“http://www.google.cn”, ref objFlags, ref objTargetFrameName, ref objPostData, ref objHeaders);

    (可以简略点写:object c=null; myWeb.Navigate("http://zhidao.baidu.com/",ref c,ref c,ref c,ref c); )
    mshtml.IHTMLDocument2 htmlDoc = webBrowser1.Document as mshtml.IHTMLDocument2;

    //...获取WebBroswer中的body代码
    mshtml.HTMLDocumentClass doc=(mshtml.HTMLDocumentClass)myWeb.Document;
    mshtml.HTMLBody body=(mshtml.HTMLBody)docCC.body;
    string html=body.innerHTML.ToString();

    //...如果里面有Form,要给里面的text填充信息
    mshtml.IHTMLDocument2 doc2=(mshtml.IHTMLDocument2)myWeb.Document;
    mshtml.IHTMLElementCollection inputs;
    inputs=(mshtml.IHTMLElementCollection)doc2.all.tags("INPUT");
    mshtml.IHTMLElement element=(mshtml.IHTMLElement)inputs.item("userName",0);
    mshtml.IHTMLInputElement inputElement=(mshtml.IHTMLInputElement)element;
    inputElement.value="填充信息";

    //...要点击里面的某个按钮
    mshtml.IHTMLDocument2 doc2=(mshtml.IHTMLDocument2)myWeb.Document;
    mshtml.IHTMLElementCollection inputs;
    inputs=(mshtml.IHTMLElementCollection)doc2.all.tags("INPUT");
    mshtml.IHTMLElement element=(mshtml.IHTMLElement)inputs.item("SubmitBut",0);
    element.click();

    1、根据元素ID获取元素的值。

    比如要获取<img class="" id="regimg" src="/register/checkregcode.html?1287068791" width="80" height="22">这个标签里的src属性的值:

    mshtml.IHTMLDocument2 doc2 = (mshtml.IHTMLDocument2)webBrowser1.Document;
    mshtml.IHTMLElement img = (mshtml.IHTMLElement)doc2.all.item("regimg", 0);

    string imgUrl = (string)img.getAttribute("src");

    2、填写表单,并确定

    mshtml.IHTMLElement loginname = (mshtml.IHTMLElement)doc2.all.item("loginname", 0);
        mshtml.IHTMLElement loginPW = (mshtml.IHTMLElement)doc2.all.item("password", 0);
        mshtml.IHTMLElement loginBT = (mshtml.IHTMLElement)doc2.all.item("formsubmit", 0);
        mshtml.IHTMLElement loginYZ = (mshtml.IHTMLElement)doc2.all.item("regcode", 0);
        loginname.setAttribute("value", tbLoginName.Text);
        loginPW.setAttribute("value", tbLoginPassWord.Password);
        loginYZ.setAttribute("value", tbYZ.Text);
        loginBT.click();

    3、获取源码

    textBox1.Text = doc2.body.innerHTML;

    4、执行JS

    mshtml.IHTMLWindow2 win = (mshtml.IHTMLWindow2)doc2.parentWindow;
    win.execScript("changeRegImg()", "javascript");//使用JS

    5、禁止JS,WPF下目前发现唯一适用的一种方法:

    public void HideScriptErrors(WebBrowser wb, bool Hide)
       {

        FieldInfo fiComWebBrowser = typeof(WebBrowser).GetField("_axIWebBrowser2", BindingFlags.Instance | BindingFlags.NonPublic);

        if (fiComWebBrowser == null) return;

        object objComWebBrowser = fiComWebBrowser.GetValue(wb);

        if (objComWebBrowser == null) return;

        objComWebBrowser.GetType().InvokeMember(

        "Silent", BindingFlags.SetProperty, null, objComWebBrowser, new object[] { Hide });

       }

       void webBrowser1_Navigated(object sender, NavigationEventArgs e)
       {

        HideScriptErrors(webBrowser1,

        true);

       }

    下面是另外一遍博客里写的比较好的

    #region Search    
            public static void Search(string searchText)   
            {   
                SHDocVw.InternetExplorer ieWnd = GetIEWndOfGoogle();   
                mshtml.IHTMLDocument2 ieDoc = GetIEDocOfGoogle(ref ieWnd);   
      
                System.Diagnostics.Trace.Assert(ieDoc != null);   
                SearchTextInGoogle(ieDoc, searchText);   
      
                //activate ie window    
                SetForegroundWindow(ieWnd.HWND);               
            }   
            #endregion   
     
            #region get ie window of google page    
            public static SHDocVw.InternetExplorer GetIEWndOfGoogle()   
            {   
                mshtml.IHTMLDocument2 ieDoc;   
                SHDocVw.InternetExplorer ieWnd = null;   
                SHDocVw.ShellWindowsClass shellWindows = new SHDocVw.ShellWindowsClass();   
      
                foreach (SHDocVw.InternetExplorer ie in shellWindows)   
                {   
                    //if it is ie window    
                    if (ie.FullName.ToUpper().IndexOf("IEXPLORE.EXE") > 0)   
                    {   
                        //get the document displayed    
                        ieDoc = (mshtml.IHTMLDocument2)ie.Document;   
                        if (ieDoc.title.ToUpper().IndexOf("GOOGLE") >= 0)   
                        {   
                            ieWnd = ie;   
                            break;   
                        }   
                    }   
                }   
                   
                shellWindows = null;   
      
                return ieWnd;   
            }   
            #endregion   
     
            #region get ie document of google page    
            public static mshtml.IHTMLDocument2 GetIEDocOfGoogle(ref SHDocVw.InternetExplorer ieWnd)   
            {   
                object missing = null;   
                mshtml.IHTMLDocument2 ieDoc;   
      
                if (ieWnd == null)   
                {   
                    ieWnd = new SHDocVw.InternetExplorer();   
                    ieWnd.Visible = true;   
                    ieWnd.Navigate("http://www.google.com", ref missing, ref missing, ref missing, ref missing);   
      
                    //wait for loading completed, or using DocumentComplete Event    
                    while (ieWnd.StatusText.IndexOf("完成") == -1)   
                        Application.DoEvents();   
                }   
      
                ieDoc = (mshtml.IHTMLDocument2)ieWnd.Document;   
                return ieDoc;   
            }   
            #endregion

    #region Search the given text in google    
            ///// <summary>    
            /// search the given text in google home page    
            /// we can see the source file of google home page to confirm the elements we need    
            /// the html file of google home page is as follows    
            ///     
            /// <table cellpadding=0 cellspacing=0>    
            ///     <tr valign=top>    
            ///         <td width=25%> </td>    
            ///         <td align=center nowrap>    
            ///             <input name=hl type=hidden value=zh-CN>    
            ///             <input autocomplete="off" maxlength=2048 name=q size=55 title="Google 搜索" value="">    
            ///             <br>    
            ///             <input name=btnG type=submit value="Google 搜索">    
            ///             <input name=btnI type=submit value=" 手气不错 ">    
            ///         </td>    
            ///         ...    
            ///// </summary>            
            public static void SearchTextInGoogle(mshtml.IHTMLDocument2 ieDoc, string searchText)   
            {   
                mshtml.HTMLInputElementClass input;   
      
                //set the text to be searched    
                foreach (mshtml.IHTMLElement ieElement in ieDoc.all)   
                {   
                    //if its tag is input and name is q(question)    
                    if (ieElement.tagName.ToUpper().Equals("INPUT"))   
                    {   
                        input = ((mshtml.HTMLInputElementClass)ieElement);   
                        if (input.name == "q")   
                        {   
                            input.value = searchText;   
                            break;   
                        }   
                    }   
                }   
      
                //click the submit button to search    
                foreach (mshtml.IHTMLElement ieElement in ieDoc.all)   
                {   
                    //if its tag is input    
                    if (ieElement.tagName.ToUpper().Equals("INPUT"))   
                    {   
                        input = (mshtml.HTMLInputElementClass)ieElement;   
                        if (input.name == "btnG")   
                        {   
                            input.click();   
                            break;   
                        }   
                    }   
                }   
            }   
            #endregion  

    参考文章:

    http://blog.csdn.net/livelylittlefish/archive/2008/08/25/2829873.aspx

    http://hi.baidu.com/andyleesoft/blog/item/802e02289fcc1f94023bf66a.html

    http://zhidao.baidu.com/question/48084010.html

  • 相关阅读:
    es reason=Fielddata is disabled on text fields by default.
    macOS安装使用youget
    多账户拉取
    golang 基础笔记二
    PLI是什么
    Delphi 11.1 在FMX Image上画图遇到坑
    kbmMW 5.19 Debug状态编译的Android应用闪退的原因
    Delphi 11.1 用原生TBase64Encoding将图片文件转换成Base64串
    Unknown picture file extension (.jpg)
    Java中 DecimalFormat 用法详解
  • 原文地址:https://www.cnblogs.com/ArRan/p/2990148.html
Copyright © 2020-2023  润新知