document.getelementbyid在loop / if中没有工作

时间:2012-09-29 21:50:33

标签: c# browser

我的问题很简单,但我无法弄清楚为什么它不能在if / loop中运行。以下是一些例子:

工作一:

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

无论“if”语句是什么,它都不起作用。也试过“for”,也尝试将它从“for”的循环中取出,我仍然得到这个错误:“对象引用未设置为对象的实例。”

1 个答案:

答案 0 :(得分:1)

由于信息有限,我在这里猜测。

我认为您在设置Url属性后正在尝试修改页面。该网页尚未加载,因此您获得的控件尚不可用。

尝试将代码添加到DocumentCompleted的{​​{1}}事件中。在文档完全加载后,将立即触发此事件,然后元素将可用。

WebBrowser

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

<强>更新

您对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"); } 的假设并不完全正确。当没有加载时,它开始IsBusy。设置false属性不会立即将其设置为Url

对于您要求的替代方案,您可以在加载完成时使用值true的{​​{1}}属性。您可以使用以下示例。虽然我个人不喜欢它,因为当页面由于某种原因无法加载时存在无限循环的风险。我建议尽可能使用ReadyState并修改该示例以正确处理非登录页面。

WebBrowserReadyState.Complete