2012-09-29 93 views
0

我的問題很簡單,但我不明白爲什麼它不在if/loop內部工作。下面是一些例子:document.getelementbyid不工作內部循環/如果

工作之一:

private void button1_Click(object sender, EventArgs e) 
{ 
    webBrowser1.Document.GetElementById("login").SetAttribute("value", "something"); 
    webBrowser1.Document.GetElementById("password").SetAttribute("value", "something"); 
} 

非工作之一:

if (webBrowser1.IsBusy == false) 
{ 
    webBrowser1.Document.GetElementById("login").SetAttribute("value", "something"); 
    webBrowser1.Document.GetElementById("password").SetAttribute("value", "something"); 
} 

不管是什麼 「如果」 語句,它不工作。也試着用「for」,也試圖把它從「for」的循環中取出,我仍然得到這個錯誤:「對象引用沒有設置爲對象的一個​​實例。」

+1

使用調試器並找出哪個對象爲null。它是'webBrowser1'嗎?或'webBrowser1.Document'?或者'webBrowser1.Document.GetElementById(...)'的結果? – millimoose

回答

1

由於信息有限,我在這裏猜測。

我想你正試圖在設置Url屬性後修改頁面。該網頁將不會被加載,所以你得到的控件尚不可用。

嘗試將代碼添加到WebBrowserDocumentCompleted事件中。這個事件將在文檔被完全加載之後立即觸發,並且元素將隨即可用。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    var loginControl = webBrowser1.Document.GetElementById("login"); 
    var passwordControl = webBrowser1.Document.GetElementById("password"); 

    if (loginControl != null) 
    loginControl.SetAttribute("value", "something"); 

    if (passwordControl != null) 
    passwordControl.SetAttribute("value", "something"); 
} 

更多:http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documentcompleted.aspx

更新

你的假設有關IsBusy不完全正確。當沒有任何東西被加載時,它開始輸出false。設置Url屬性不會立即將其設置爲true

對於您請求的替代方案,您可以使用ReadyState屬性,該屬性在加載完成後將具有值WebBrowserReadyState.Complete。你可以使用下面的例子。雖然我個人不喜歡它,因爲當頁面由於某種原因無法加載時存在無限循環的風險。如果可能的話,我會建議使用DocumentCompleted,並修改該示例以正確處理非登錄頁面。

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) 
{ 
    Thread.Sleep(0); 
    Application.DoEvents(); 
} 
+0

其實我一直在想,但不應該「如果(webBrowser1.IsBusy == false)」檢查瀏覽器是否加載。我知道「webBrowser1_DocumentCompleted」,但它不是很適用於我的情況。所以如果你知道任何其他方法來檢查瀏覽器是否正在加載(在一個循環或如果),這將是偉大的:) – ISeeSounds

+0

我添加了一些信息和替代我的答案。希望這會幫助你。 –