如何循环打开 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;
}
}
使用 .
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}");
}
。您不需要任何网络访问权限。