2017-08-05 8 views
0

私は自分のwebBrowser要素にgoogle.dkを読み込み、 "Frederik"を入力してSearchを押すために私のWindowsフォームを取得しようとしています。Googleによる検索の自動化

私は、1つのボタンに塗りつぶし+検索アクションを繋ぎました。ここでは何が起こるのですか:最初のクリックでは、検索フィールドに「Frederik」と入力しますが、もう一度押す必要があります実際に検索する私は二度同じボタンを押していない、それはワンボタンによるワンアクションになりたい(そしてそれは私が懸念され、いずれか2回のクリックが必要で、なぜ私は理解していない

ここに私のコードです:。

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 PARAMTERを使用して、検索文字列に設定 をあなたはすでにそれを知っていた場合、あなたがユーザーの入力を模倣したいと検索ボタンにあなたを押すことができます。 foを試すことができますゆっくり:

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

ボタン内のループをクリックして削除し、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

同じことが残念ながら起こります。最初にボタンをクリックすると "Frederik"が表示されますが、もう一度クリックすると検索が行われます。 – Fross

+0

私もそれを試みました。現在、ボタンを1回クリックするだけで動作する唯一の方法は、タイマーを使用して5秒後にサブミット関数を呼び出すことです。 – Fross

関連する問題