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

本文关键字:数据 输入 等待 加载 浏览器 Web 何循环 循环 | 更新日期: 2023-09-27 18:33:55

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

我该怎么做?

我编写此代码是为了保存我们在搜索结果加载后获得的 URL,但似乎只有最后一个字符串的搜索结果加载并保存在我的列表中。

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;
    }
}

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

使用 .

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

下载将如下所示:

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

这将使您获得谷歌搜索网站的HTML内容。

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

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}");
}

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