2015-07-20 40 views
0

在下面的代碼中,我使用linkcount來控制事件發生的時間。問題是,linkcount == 3在linkcount == 2完成並且發生錯誤之前正在運行。第三部分是在頁面加載之前在網頁上查找元素。如何更好地控制代碼中的事件序列?

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    linkcount++; 

    if (linkcount == 1) 
    { 
     webBrowser1.Document.GetElementById("ctl00_Content_Login1_UserName").SetAttribute("value", "username"); 
     webBrowser1.Document.GetElementById("ctl00_Content_Login1_Password").SetAttribute("value", "password"); 
     webBrowser1.Document.GetElementById("ctl00_Content_Login1_LoginButton").InvokeMember("click"); 
    } 

    if (linkcount == 2) 
    { 
     HtmlElement link = (from HtmlElement elem in webBrowser1.Document.GetElementsByTagName("a") 
     where elem.InnerHtml == "Time Clock Entry" 
     select elem).ElementAt(0);  
     link.InvokeMember("Click"); 
    } 

    if (linkcount == 3) 
    { 
      webBrowser1.Document.Window.Frames["ContentFrame"].Document.GetElementById("btn‌​Punch").InvokeMember("Click"); 
      // string content = webBrowser1.Document.Window.Frames[0].WindowFrameElement.InnerText; 
      // string content = webBrowser1.Document.Window.Frames[0].Document.Body.InnerText; 
      // MessageBox.Show(content); 
      // link.InvokeMember("Click"); 
    } 
} 
+1

檢查'GetElementById'的返回值。如果它是'null',那麼該元素不可用。 –

+0

難道你沒有辦法通過閱讀'webBrowser1.Document'的某個屬性來確定你在哪個步驟?例如,如果文檔包含某些特定的文本,那麼您100%確定您處於三種情況之一。 –

回答

0

我結合@ JohnnyMopp的主張和我,這是生成的代碼。

我無法測試它,因爲我不知道URL,並且解決方案嚴重依賴於這三種情況中每一種的Web內容,但是這應該讓您知道如何實現它:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 

     if (webBrowser1.Document.GetElementById("ctl00_Content_Login1_UserName") != null) 
     { 
      // 1st case: 
      webBrowser1.Document.GetElementById("ctl00_Content_Login1_UserName").SetAttribute("value", "username"); 
      webBrowser1.Document.GetElementById("ctl00_Content_Login1_Password").SetAttribute("value", "password"); 
      webBrowser1.Document.GetElementById("ctl00_Content_Login1_LoginButton").InvokeMember("click"); 
     } 
     else if (webBrowser1.Document.Window.Frames["ContentFrame"].Document.GetElementById("btn‌​Punch") != null) 
     { 
      // 3rd case: 
      webBrowser1.Document.Window.Frames["ContentFrame"].Document.GetElementById("btn‌​Punch").InvokeMember("Click"); 
      //    string content = webBrowser1.Document.Window.Frames[0].WindowFrameElement.InnerText; 
      //    string content = webBrowser1.Document.Window.Frames[0].Document.Body.InnerText; 
      //    MessageBox.Show(content); 
      //    link.InvokeMember("Click"); 
     } 
     else 
     { 
      // 2nd case: 
      HtmlElement link = (from HtmlElement elem in webBrowser1.Document.GetElementsByTagName("a") 
       where elem.InnerHtml == "Time Clock Entry" 
       select elem).ElementAt(0); 
      link.InvokeMember("Click"); 
     } 

    } 
+0

有沒有辦法在所有幀中查找「btnPunch」元素?我顯然看錯了地方... –

+0

我的猜測是直接使用'Document.GetElementById(「btn Punch」)''。 –