2013-12-13 66 views
0

這是場景使用WebBrowser導航URLs文檔完成

1-Navigate to admin page。

2 - 輸入用戶名和密碼

3導航到新的頁面

4填寫文本域等,並交一些文字。

5重複步驟3和4,直到循環結束

下面的代碼成功地確實步驟1和2,但是到達步驟3之前新頁面被加載,併產生未設置爲一個實例的錯誤「對象引用(「title」)。SetAttribute(「value」,「check1」);對象的名稱「doc.GetElementById(」title「)。

我試圖從最近3天實現這一點,但直到現在還無法達到第3步。任何幫助將不勝感激

bool AdminPagework =false; 
bool postnavigationdone =false; 
public Form1() 
    { 
     InitializeComponent(); 
     webBrowser1.DocumentCompleted += 
    new WebBrowserDocumentCompletedEventHandler(AdminPageCredentials); 
     webBrowser1.Navigate("www.website.com/admin"); 

    } 
    private void AdminPageCredentials(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 

     if (AdminPagework == false && (webBrowser1.ReadyState ==  WebBrowserReadyState.Complete)) 
     { 
      HtmlDocument doc = webBrowser1.Document; 
      doc.GetElementById("login").SetAttribute("value", "ADMIN"); 
      doc.GetElementById("pass").SetAttribute("value", "123"); 
      doc.GetElementById("submit").InvokeMember("click"); 

      AdminPagework = true; 

      webBrowser1.DocumentCompleted += 
     new WebBrowserDocumentCompletedEventHandler(RedirectToPostPage); 

      webBrowser1.Navigate("http://www.website.com/admin/post.php"); 
     } 

    } 
    public void RedirectToPostPage(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     if ((postnavigationdone == false) && (webBrowser1.ReadyState == WebBrowserReadyState.Complete)) 

     { 
      HtmlDocument doc = webBrowser1.Document; 
      doc.GetElementById("title").SetAttribute("value", "check1"); 
      doc.GetElementById("content").SetAttribute("value", textBox2.Text); 
      doc.GetElementById("post-format-video").InvokeMember("click"); 
      doc.GetElementById("in-category-64").InvokeMember("click"); 
      webBrowser1.Document.GetElementById("mm").SetAttribute("value", "01"); 
      webBrowser1.Document.GetElementById("jj").SetAttribute("value", "01"); 
      webBrowser1.Document.GetElementById("aa").SetAttribute("value", "2013"); 
      webBrowser1.Document.GetElementById("hh").SetAttribute("value", "01"); 
      webBrowser1.Document.GetElementById("mm").SetAttribute("value", "01"); 

      doc.GetElementById("publish").InvokeMember("click"); 


      postnavigationdone = true; 
     } 
    } 

回答

1
var titleElement = doc.GetElementById("title"); 
titleElement.SetAttribute("value","check1"); 

試一下,看看標題元素被發現畢竟,因爲它失敗的最可能的原因是:有一個名爲「標題」沒有元素。

我喜歡使用ScrapySharp框架(您可以在NuGet上找到它)進行網頁自動化。

var titleNodes = doc.DocumentNode.CssSelect("div#title").ToList(); 
foreach(var titleNode in titleNodes) 
{ 
    titleNode.SetAttribute("value","check1"); 
} 

btw。爲什麼你會這樣做,改變這個屬性?只是好奇...

+0

親愛的它發現了元素,如果我改變邏輯。真正的問題是我的邏輯不會等待第二頁加載。 –

+0

好吧......你使用什麼樣的「webBrowser」並不是很明顯。我建議在標準的Web控制瀏覽器上使用Watin或硒(最好)。你在那裏得到了.WaitForComplete()函數。無論如何,你總是可以做一個Thread.Sleep()一段合適的時間,以確保你的瀏覽器加載內容。請注意,標準的Web客戶端等不會執行JavaScript,因此如果您在普通瀏覽器中打開該頁面,最終可能會得到不同的DOM。 – skhro87