我的问题很简单,但我无法弄清楚为什么它不能在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”的循环中取出,我仍然得到这个错误:“对象引用未设置为对象的实例。”
答案 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