【发布时间】:2016-02-11 09:53:46
【问题描述】:
我有一个带有 Web 浏览器控件的 C# 表单。我想在循环中打开一个 url,例如:(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;
}
}
【问题讨论】:
-
您是否有必要在 GUI 中显示此内容,或者您也可以在后台执行此操作?
-
Selenium 可以很好地解决这个问题。
-
@Franz:没有必要在 GUI 中显示。可以在后台进行。
标签: c# webbrowser-control