zoukankan      html  css  js  c++  java
  • c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2 .

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

    分类: c#

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

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

    (要引入Microsoft.mshtml.dll 地址是C:Program FilesMicrosoft.NETPrimary 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

     

    另外一个例子

    IHTMLDocument2 doc = webbrowser.Document.DomDocument as IHTMLDocument2;
    IHTMLBodyElement bodyElement = doc.body as IHTMLBodyElement;
    if (bodyElement != null)
    {

            IHTMLTxtRange range = bodyElement.createTextRange();
            HTMLDocumentClass documentClass = wb1.Document.DomDocument as HTMLDocumentClass;
            IHTMLElement caret_pos = documentClass.getElementById("caret_pos");
            if (caret_pos != null)
           {
                   range.moveToElementText(caret_pos);
                   range.select();
            }
    }

     

    2011-3-14添加

    给html元素添加事件

    IHTMLElement ieElement = .......

    ((mshtml.HTMLElementEvents2_Event)ieElement).onclick += new mshtml.HTMLElementEvents2_onclickEventHandler(this.element_onClick);

     

    public bool element_onClick(mshtml.IHTMLEventObj e)
    {。。。。}

    要在程序中出发html中的事件,这个想用什么eventhandler之类的,搞了半天都没有研究出来,资料又搜不到,最后用执行js的方法实现之:

    js触发事件:

    var oEvent = document.createEventObject();

    document.getElementById('addrCity').fireEvent('onchange', oEvent);

  • 相关阅读:
    读书笔记7
    读书笔记5
    读书笔记6
    读书笔记4
    读书笔记2
    读书笔记3
    读书笔记1
    嵌入式linux的调试技术
    硬件抽象层:HAL
    蜂鸣器驱动
  • 原文地址:https://www.cnblogs.com/xishi/p/4374757.html
Copyright © 2011-2022 走看看