2012-05-20 1 views
0

Это мой Program.csКак использовать веб-браузер из функции в другом файле класса?

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

Возможный дубликат [Что такое исключение NullReferenceException в .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net) –

ответ

1

Вы создаете новый экземпляр формы, который скрыт (не видимый), а webBrowser1 не инициализирован, поэтому Документ имеет значение 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"); 
      } 
     } 
    } 
} 
Смежные вопросы