C#擷取網頁中某個元素的位置,並類比點擊

來源:互聯網
上載者:User

標籤:c   style   code   java   a   http   

我們在開發中,往往要得到網頁中某個元素的位置,並且點擊它。要類比一次滑鼠點擊並不難,只要調用一個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#有這個東西就不必去調用了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.