繁体   English   中英

document.getelementbyid在循环/ if中不起作用

[英]document.getelementbyid not working inside loop/if

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

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

我认为您正在尝试在设置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/zh-cn/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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM