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#有這個東西就不必去調用了。
總結
以上是生活随笔為你收集整理的C#获取网页中某个元素的位置,并模拟点击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法嵌入互操作类型“……”,请改用适用的
- 下一篇: 北京公证处24小时服务热线(北京市正阳公