常見的獲取控件並點擊(自動登錄):
var txtUserID = wbsTask.Document.All["userName"]; var txtPsd = wbsTask.Document.All["password"]; var txtVrf = wbsTask.Document.All["code"];var btnSubmit = wbsTask.Document.All["btnSubmit"]; var code = ReadLoginVerifyCode(); var userInfo = cboAccount.ComboBox.SelectedValue as UserInfo; if (userInfo == null) { MessageBox.Show("獲取用戶信息失敗!"); return; } txtUserID.SetAttribute("value", userInfo.UserID); txtPsd.SetAttribute("value", userInfo.Password); txtVrf.SetAttribute("value", code);if (string.IsNullOrWhiteSpace(code)) return; btnSubmit.InvokeMember("click");//自動提交
特殊需求:查找webbrowser頁面上的一個無ID無Name的A控件,后台模擬點擊事件。
初始代碼:
var b = wbsTask.Document.Body.InnerText.Contains("XXX"); if (!b) return false; foreach (HtmlElement he in wbsTask.Document.GetElementsByTagName("a")) { if (he.InnerText == "XXX") { he.InvokeMember("click"); } }
最后發現無法引發click事件,而a處的代碼為:
<a href="javascript:;" onclick="dialog(650,450,'zzz','../../dialog/sss.aspx?id=bbb');return false;" class="link_t">XXX</a>
也就是說click事件調用了一個javasript函數。
為毛沒有執行he.InvokeMember("click")這句呢?我百思不得其解。附帶說明,上面的代碼是在documentComplete事件時調用的,所以頁面加載已經完成。
在網上搜尋解決方案,得幾種提示
提示一:html代碼已經加載完畢,但js還沒有加載完畢,解決方案timer一下。
if (he.InnerText == "XXX") { new Action(() => { System.Threading.Thread.Sleep(10000); new Action(() => he.InvokeMember("click")).InvokeRun(this); }).RunThread(); }
這里的InvokeRun(this)是多線程回調,RunThread新開線程執行代碼。測試結果:無效--------.
提示二:click變Click或onclick,無效。
提示三:
if (he.InnerText == "XXX") { wbsTask.Document.Focus(); IHTMLElement nativeElement = he.DomElement as IHTMLElement; nativeElement.click(); }
測試結果:無效*-----
最終解決方案:
if (he.InnerText == "XXX") { var obj = he.DomElement; var mi = obj.GetType().GetMethod("click"); mi.Invoke(obj, new object[0]); }
成功搞定!
