標籤: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#有這個東西就不必去調用了。