0

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

4

1 回答 1

1

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

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

尝试将代码添加DocumentCompletedWebBrowser. 此事件将在文档完全加载后立即触发,然后元素将可用。

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它在没有加载任何内容时开始。settingsUrl属性不会立即将其设置为true.

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

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
{
  Thread.Sleep(0);
  Application.DoEvents();
}
于 2012-09-29T23:02:31.903 回答