C#獲取網頁中某個元素的位置,並模擬點擊


我們在開發中,往往要得到網頁中某個元素的位置,並且點擊它。要模擬一次鼠標點擊並不難,只要調用一個API就行了,關鍵就是怎么樣得到這個元素的位置,還有判斷是否要滾動滾動條,要滾動多少行能讓元素顯示出來。當然我們可以動態改變它的CSS,讓它在特定的位置顯示出來,但這個方法只對比較簡單的網頁有效。

那我們怎么才能得到網頁的位置呢,首先我們來看一張圖片
 

從這里我們可以看到五個offset的屬性,這里我們主要利用offsetparent, offsetleft 和offsettop,我們用offsetparent得到元素offset的父元素,再循環,直到BODY為止。

首先我們引用windows\system32\mshtml.ltb這個文件,這樣我們才可以得到一些特殊的功能,這個庫的功能特別強大,如果自己要做HTML編輯器,可以利用這個庫和webBrowser結合,做出來的編輯器功能很強大,就是代碼有點不全WEB標准。然后我們要using mshtml;這樣以下的代碼才能正常運行。

代碼:

            HTMLDocument doc = webBrowser1.Document.DomDocument as HTMLDocument;
            //getElementsByName,getElementById 這里也可以用這兩個方法
            IHTMLElementCollection els = doc.getElementsByTagName("a");
            Point p = new Point();
            foreach (IHTMLElement em in els)
            {
                if ((em.getAttribute("href").ToString() == "javascript:fGoto()") && (em.innerText == "添加附件"))
                {                    
                    IHTMLElement pem = em;
                    //元素中間
                    p.X = em.offsetWidth / 2;
                    p.Y = em.offsetHeight / 2;
                    do
                    {
                        pem = pem.offsetParent;
                        p.X += pem.offsetLeft;
                        p.Y += pem.offsetTop;
                    } while (pem.tagName.ToLower() != "body");
                      em.scrollIntoView();//顯示元素
                    break;
                }
            }

這樣我們已經得到了無素的位置,並已經顯示在瀏覽器的可見區域了,似乎我們用API就可以模擬點擊了,然而你測試的時候,發現情況並不是這樣的。為什么,接着往下看

這個坐標是屏幕坐標,從屏幕的左上角開始,有時你的瀏覽器並不是最大化的,即使是最大化也不一定窗體中只有webBrowser這個控件,就算只有這個控件,窗體的邊框等一系列的,也可能是你的鼠標不移動正確位置上。而且,如果頁面有滾動,我們也要得到滾動去的那一部分。

如果要點擊則必須要以下代碼:

            //被卷去的部分
            int sl, st;
            sl = int.Parse(doc.documentElement.getAttribute("ScrollLeft").ToString());
            st = int.Parse(doc.documentElement.getAttribute("ScrollTop").ToString());  
            //加上窗體的位置及控件的位置及窗體邊框,30和8是窗體邊框           
            p.X += em.offsetLeft + this.Left + webBrowser1.Left - sl + 8;              
            p.Y += em.offsetTop + this.Top + webBrowser1.Top + 30 - st;
            //定位鼠標
            Cursor.Position = p;            
            //單擊
            mouse_event(6, 0, 0, 0, this.Handle);

這樣我們就可以點擊到我們需要點擊的元素了。關於mouse_event這個API請去看MSDN我網上的教程。Cursor.Position這個鼠標定位也可以用API函數SetCursorPos,但C#有這個東西就不必去調用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM