通过Google自动搜索

时间:2017-08-05 12:39:27

标签: c# winforms webbrowser-control

我正在尝试让我的Windows窗体将google.dk加载到我的webBrowser元素中,然后填写“Frederik”,然后按搜索。

我已将填充+搜索操作绑定到一个按钮,以下是发生的情况:在第一次单击时,它在搜索字段中键入“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");
    }
}

2 个答案:

答案 0 :(得分:0)

而不是你的操作,你可以这样做:

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

答案 1 :(得分: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()" });
    }
}