webbrowser獲取無ID無Name控件並模擬點擊


常見的獲取控件並點擊(自動登錄):

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]);
}

成功搞定!

 


免責聲明!

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



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