如何在循环中打开Web浏览器并输入数据并等待它完全加载

时间:2016-02-08 18:15:54

标签: c# webbrowser-control

我有一个带有Web浏览器控件的C#表单。我想在循环中打开一个网址,例如:(www.google.com),每次循环运行时,我想首先导航到网址填写搜索字符串,然后点击搜索按钮,等待搜索结果完全加载。

我该怎么做?

我写了这段代码来保存搜索结果加载后得到的网址,但只有最后一个字符串的搜索结果似乎加载并保存在我的列表中。

private void button1_Click(object sender, EventArgs e)
{
    var task = DoNavigationAsync();
    task.ContinueWith((t) =>
    {
        MessageBox.Show("Done!");
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElement url = webBrowser1.Document.GetElementById("sb_form_q");

    if (url != null)
    {
        url.SetAttribute("value", search[searchindx-1]);
        webBrowser1.Document.GetElementById("sb_form_go").InvokeMember("click");
    }

    if (webBrowser1.Url.ToString() != "http://www.bing.com/")
    {
        SavedUrl.Add(webBrowser1.Url.ToString());
    }
}

async Task DoNavigationAsync()
{
    TaskCompletionSource<bool> tcsNavigation = null;
    TaskCompletionSource<bool> tcsDocument = null;

    this.webBrowser1.Navigated += (s, e) =>
    {
        if (tcsNavigation.Task.IsCompleted)
            return;
        tcsNavigation.SetResult(true);
    };

    this.webBrowser1.DocumentCompleted += (s, e) =>
    {
        if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            return;
        if (tcsDocument.Task.IsCompleted)
            return;
        tcsDocument.SetResult(true);
    };
    search = new string[3];
    search[0] = "C";
    search[1] = "C++";
    search[2] = "C#";

    searchindx = 0;

    foreach (string sval in search)
    {
        searchindx++;
        tcsNavigation = new TaskCompletionSource<bool>();
        tcsDocument = new TaskCompletionSource<bool>();

        webBrowser1.Navigate("www.bing.com");

        await tcsNavigation.Task;

        await tcsDocument.Task;
    }
}

1 个答案:

答案 0 :(得分:0)

使用.NET Framework 4.5中的异步HttpClient,您可以在不使用WebBrowser等gui元素的情况下加载网页。

下载如下:

using (HttpClient client = new HttpClient()) {
    await client.GetStringAsync("https://google.com");
}

这会为您提供Google搜索网站的HTML内容。

但是如果您只想获得生成的网址,则您甚至不需要执行下载,因为Google(以及大多数其他搜索引擎)都为此提供了API。请注意以下Google网址:https://www.google.com/search?q=google。您可以看到搜索字符串&#34; google&#34;显示为名为&#34; q&#34;的参数。所以如果你像这样构建你的代码......

string[] search = new string[] { "C", "C++", "C#" };

foreach (string sval in search)
{
    // C# <= 5
    SavedUrl.Add(string.Format("https://google.com/search?q={0}", sval));
    // C# 6
    SavedUrl.Add($"https://google.com/search?q={sval}");
}

...您不需要任何网络访问权限。