2012-11-07 64 views
-3

程序自帶的網頁,使按下按鈕對程序邏輯需要諮詢

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 


namespace Bot 
{ 
    public partial class FormWindow : Form 
    { 
     Random rnd; 
     Settings settingsForm; 
     Timer tm; 
     CallTimers callTimers; 

     public FormWindow() 
     { 
      rnd = new Random(); 
      settingsForm = new Settings(); 
      tm = new Timer(); 
      tm.Tick += new EventHandler(tm_Tick); 
      wb = new WebBrowser(); 
      InitializeComponent(); 
     } 

     private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      if (wb.Document.GetElementById("login-email") != null) 
      { 
       wb.Document.GetElementById("login-email").InnerText = settingsForm.tEmail.Text; 
       wb.Document.GetElementById("login-password").InnerText = settingsForm.tPassword.Text; 
       Method_1("button luxury")[0].InvokeMember("click"); 
      } 

       CallMethodAfterDelay(KrysomahHunting, 5000, tm); 

       if (wb.Url.AbsoluteUri == "http://www.moswar.ru/metro/" && wb.ReadyState == WebBrowserReadyState.Complete) 
       { 
        wb.Stop(); 
        method_2("c", "Выследить Крысомаху")[0].InvokeMember("click"); 
        Method_1(new string[] { "button" })[0].InvokeMember("click"); 
       } 
     } 

     //go to page 
     public void GoPage(string string_9, string string_10) 
     { 
      this.wb.Stop(); 
      string additionalHeaders = "Content-Type: application/x-www-form-urlencoded" + Environment.NewLine; 
      this.wb.Navigate(string_9, "", Encoding.UTF8.GetBytes(string_10), additionalHeaders); 
     } 


     public List<HtmlElement> Method_1(params string[] ClassNames) 
     { 
      List<HtmlElement> list = new List<HtmlElement>(); 
      foreach (HtmlElement htmlElement in wb.Document.All) 
      { 
       for (int i = 0; i < ClassNames.Length; i++) 
       { 
        string b = ClassNames[i]; 
        if (htmlElement.GetAttribute("className") == b) 
        { 
         list.Add(htmlElement); 
         break; 
        } 
       } 
      } 
      return list; 
     } 


     private void ButtonStart_Click(object sender, EventArgs e) 
     { 
      if (this.settingsForm.tEmail.Text == "" || this.settingsForm.tPassword.Text == "") 
      { 
       MessageBox.Show("Отсутствует логин и\\или пароль для входа на сервер МосВара.\nВвести их можно, нажав на кнопку \"Настройки\".", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Hand); 
       return; 
      } 
      wb.Navigate("http://www.moswar.ru"); 
     } 

     private void tm_Tick(object sender, EventArgs e) 
     { 
      ((MethodInvoker)tm.Tag).Invoke(); 
      tm.Stop(); 
     } 

     //go to page through time 
     public void CallMethodAfterDelay(MethodInvoker MethodToCall, int Delay,Timer tm) 
     { 
      tm.Interval = Delay; 
      tm.Tag = MethodToCall; 
      tm.Start(); 
     } 
     public void KrysomahHunting() 
     { 
      GoPage("http://www.moswar.ru/metro/", ""); 
     } 

     private List<HtmlElement> method_2(string string_9, string string_10) 
     { 
      List<HtmlElement> list = new List<HtmlElement>(); 
      foreach (HtmlElement htmlElement in this.wb.Document.All) 
      { 
       if (htmlElement.GetAttribute("className") == string_9 && htmlElement.InnerText != null && htmlElement.InnerText.IndexOf(string_10) != -1) 
       { 
        list.Add(htmlElement); 
       } 
      } 
      return list; 
     } 

    } 
} 

幫助如何表達邏輯

在這段代碼

private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      if (wb.Document.GetElementById("login-email") != null) 
      { 
       wb.Document.GetElementById("login-email").InnerText = settingsForm.tEmail.Text; 
       wb.Document.GetElementById("login-password").InnerText = settingsForm.tPassword.Text; 
       Method_1("button luxury")[0].InvokeMember("click"); 
      } 

       CallMethodAfterDelay(KrysomahHunting, 5000, tm); 

       if (wb.Url.AbsoluteUri == "http://www.moswar.ru/metro/" && wb.ReadyState == WebBrowserReadyState.Complete) 
       { 
        wb.Stop(); 
        method_2("c", "Выследить Крысомаху")[0].InvokeMember("click"); 
        Method_1(new string[] { "button" })[0].InvokeMember("click"); 
       } 

     } 

當程序來到方法

method_2("c", "Выследить Крысомаху")[0].InvokeMember("click"); 

拋出異常ArgumentOutRangeException

我supposethat這個couldbe造成

private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 

Heconstantly checks.Ifapagethatexecute方法。而且,因爲該方法已經一次完成了它的任務,不再有值

所以我們得到一個異常ArgumentOutRangeException。幫助如何使這種情況下的邏輯!

+0

這裏有什麼問題?它看起來像一個巨大的代碼牆。 – Woot4Moo

+0

你的method2是否返回一個數組? –

+0

爲了幫助一個問題看代碼! – Ilia

回答

1

如果您在該方法調用中添加了檢查,該怎麼辦?

var method2 = method_2("c", "..."); 
if (method2.Count > 0) 
    method2[0].InvokeMember("click"); 
+0

如何使wb_DocumentCompleted中的事件方法工作1次 下載完頁面之後有一個不斷的調用方法? – Ilia

+0

我不聽你的評論?你能澄清嗎?我不確定你在哪裏連接wb_DocumentCompleted方法,但這可能會有所幫助。 – Prescott

+0

如何使該事件wb_DocumentCompleted。調用方法只有一次。但並不總是當頁面加載? – Ilia