2017-08-05 128 views
0

我試圖讓我的窗體窗體將google.dk加載到我的webBrowser元素中,然後填寫「Frederik」,然後按搜索。通過Google自動搜索

我已經將填充+搜索動作綁定到單個按鈕,這裏發生了什麼:在第一次單擊時,它在搜索字段中鍵入「Frederik」,但之後我必須再次按下它去實際搜索。我希望它是通過一個按鈕,一個動作,不按相同的按鈕兩次(我不明白爲什麼它需要兩次點擊要麼,這令我擔憂

這裏是我的代碼:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     webBrowser1.Navigate("www.google.dk"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Search(); 

     while (webBrowser1.IsBusy) 
     { 
     } 

     Submit(); 
    } 

    private void Search() 
    { 
     webBrowser1.Document.GetElementById("lst-ib").InnerText = "Frederik"; 
    } 

    private void Submit() 
    { 
     webBrowser1.Document.GetElementById("btnK").InvokeMember("click"); 
    } 
} 
+0

更新:它似乎有一些問題,我的搜索功能沒有完成,我的提交功能,在使用之前 - 如果我使用的時候穿上,計時器搜索,然後讓定時器在5秒時使用提交,它一鍵完美工作。有什麼辦法來檢查我的搜索功能是否完成,因爲使用計時器感覺馬虎? – Fross

回答

0

而不是你的操作,你可以這樣做:

webBrowser1.Navigate("https://www.google.dk/search?q=Frederik"); 
+0

感謝您的建議,但我忘了提及這只是填寫另一個網站的完整形式的做法,所以不會削減它,我害怕。 – Fross

0

您可以使用q放慢參數並將其設置爲搜索字符串 如果你已經知道你要模擬天生的用戶輸入,並按下搜索按鈕你。可以嘗試一下如下:

webBrowser1.Document.InvokeScript("eval", new[] { "document.getElementsByName(\"btnK\")[0].click()"}); 

刪除按鈕內部的while循環單擊並處理BrowserDocumentCompleted
您不需要設置計時器,也不需要拆分搜索和提交功能。 用於操作文檔的Web瀏覽器功能不是異步的,並且會連續執行。

你的代碼應該是這個樣子:

public partial class Form1 : Form 
{ 
    private static bool _isDocumentLoaded; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     _isDocumentLoaded = false; 
     webBrowser1.DocumentCompleted += WebBrowserDocumentCompleted; 
     webBrowser1.Navigate("www.google.com"); 
    } 

    private void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) 
      return; 

     _isDocumentLoaded = true; 
     MessageBox.Show("Webpage loaded successfully"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (_isDocumentLoaded) 
     { 
      FillDocumentForms(); 
      Submit(); 
     } 
     else 
     { 
      MessageBox.Show("Webpage is currently loading"); 
     } 
    } 

    private void FillDocumentForms() 
    { 
     webBrowser1.Document?.InvokeScript("eval", 
      new object[] {"document.getElementById(\"lst-ib\").innerText = \"Frederik\""}); 
    } 

    private void Submit() 
    { 
     webBrowser1.Document?.InvokeScript("eval", new object[] { "document.getElementsByName(\"btnK\")[0].click()" }); 
    } 
} 
+0

不幸的是,同樣的事情發生 - 第一次點擊按鈕,「弗雷德裏克」出現,但我不得不再次點擊搜索發生。 – Fross

+0

我也嘗試過。目前唯一的一個按鈕點擊工作,是使用一個計時器,然後在5秒後調用我的提交功能。 – Fross