我有一个带有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;
}
}
答案 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}");
}
...您不需要任何网络访问权限。