2012-05-20 166 views
0

這是我的Program.cs如何從另一個類文件中的函數使用webbrowser?

private void button2_Click(object sender, EventArgs e) 
    { 
     InputSimulator IS = new InputSimulator(); 
     IS.SimulateTextInput("login", "username"); 
     IS.SimulateTextInput("lpass", "password"); 
     IS.SimulateButtonClick("login"); 
    } 

這是我InputSimulator.cs

namespace Functions 
{ 
    class InputSimulator 
    { 
     public void SimulateTextInput(string attName, string attValue) 
     { 
      Form1 mainForm = new Form1(); 
      HtmlElementCollection col = mainForm.webBrowser1.Document.GetElementsByTagName("input"); 

      foreach (HtmlElement element in col) 
      { 
       if (element.GetAttribute("name").Equals(attName)) 
       { 
       element.SetAttribute("value", attValue); 
       } 
      } 
     } 

     public void SimulateButtonClick(string attName) 
     { 
      Form1 mainForm = new Form1(); 
      HtmlElementCollection col = mainForm.webBrowser1.Document.GetElementsByTagName("input"); 

      foreach (HtmlElement element in col) 
      { 
       if (element.GetAttribute("value").Equals(attName)) 
       { 
        element.InvokeMember("click"); 
       } 
      } 
     } 
    } 
} 

出於某種原因,它給了我一個NullReferenceException,我似乎無法找出我在做什麼錯誤,因爲它不會給我任何直接的錯誤。它出錯的地方是當我點擊按鈕,然後在下面的行:

HtmlElementCollection col = mainForm.webBrowser1.Document.GetElementsByTagName("input"); 

有誰知道我在做什麼錯?

+0

如果我把這個功能從InputSimulator直接進入Program.cs的正常工作。 – DaMaGeX

+0

[在.NET中是什麼是NullReferenceException?]的可能重複(http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

回答

1

您正在創建新的表單實例,它隱藏(不可見),webBrowser1未初始化,因此Document爲null。如果您想使用您現有的Form1實例,則可以將其作爲對此函數的引用或將其添加到構造函數中。

例如把它作爲參考:

public void SimulateTextInput(Form1 mainForm, string attName, string attValue) 
{ 
    //Form1 mainForm = new Form1(); 
    if(mainForm == null) 
     throw new ArgumentNullException("mainForm"); 
    HtmlElementCollection col = mainForm.webBrowser1.Document.GetElementsByTagName("input"); 

    foreach (HtmlElement element in col) 
    { 
     if (element.GetAttribute("name").Equals(attName)) 
     { 
     element.SetAttribute("value", attValue); 
     } 
    } 

}

添加到構造函數:

class InputSimulator 
{ 
    Form1 mainForm = null; 

    public InputSimulator(Form1 inputForm) 
    { 
     if (inputForm == null) 
      throw new ArgumentNullException("inputForm"); 

     mainForm = inputForm; 
    } 

    public void SimulateTextInput(string attName, string attValue) 
    { 
     HtmlElementCollection col = mainForm.webBrowser1.Document.GetElementsByTagName("input"); 

     foreach (HtmlElement element in col) 
     { 
      if (element.GetAttribute("name").Equals(attName)) 
      { 
       element.SetAttribute("value", attValue); 
      } 
     } 
    } 

    public void SimulateButtonClick(string attName) 
    { 
     HtmlElementCollection col = mainForm.webBrowser1.Document.GetElementsByTagName("input"); 

     foreach (HtmlElement element in col) 
     { 
      if (element.GetAttribute("value").Equals(attName)) 
      { 
       element.InvokeMember("click"); 
      } 
     } 
    } 
} 
相關問題