2017-08-05 107 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