我在C#(.Net 4.5)中使用Visual Studio社区。我有一个简单的表单,一个按钮和一个webBrowser控件。我想检查一下“tremblay jean”是否在加拿大以他的名义注册了商标(我知道他有两个)。因此,当我单击我的按钮时,我在webBrowser控件中加载商标搜索页面,我等待它完成,然后我在文本框中插入他的名字并单击他们的按钮。如果我在加载页面后使用MessageBox.Show暂停程序,它可以工作,找到两个文件。但是,如果我不使用MessageBox暂停程序,它就不起作用。它给了我500个结果,与“tremblay jean”无关。因此,等待ReadyState完成的代码行似乎不起作用。有谁知道为什么?
private void button1_Click(object sender, EventArgs e)
{
string website = "http://www.ic.gc.ca/app/opic-cipo/trdmrks/srch/home?lang=eng";
webBrowser1.Navigate(website);
while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();
MessageBox.Show(webBrowser1.ReadyState.ToString()); // to pause the program
webBrowser1.Document.GetElementById("search-crit-1").SetAttribute("value", "tremblay jean");
HtmlElementCollection elc = webBrowser1.Document.GetElementsByTagName("button");
foreach (HtmlElement el in elc)
{
if (el.GetAttribute("type").Equals("submit"))
{
if (el.InnerText == " Search ")
{
el.InvokeMember("Click"); //comment this line to see if textbox is filled
break;
}
}
}
}
当你使用WebBrowser
控件时,首先要做的是用这个html字符串初始化它:
<meta http-equiv='x-ua-compatible' content='IE=edge,chrome=1'>
这允许将控件的底层activex(Internet Explorer)的兼容模式设置为最新的本地可用版本。
使用webBrowser1.ScriptErrorsSuppressed = true;
,脚本错误弹出窗口被禁用。
这是一个以防万一的措施。
然后,订阅DocumentCompleted
事件,该事件将在页面加载时引发。正如评论中已经提到的,由于Scripting和IFrame的交互,这个事件可能会被多次引发。
WebBrowser.ReadyState
用于验证页面确实已完成。
确实,有时候,内部脚本可能会在这里造成一些麻烦,但由于情况并非如此,我会将其作为旁注。
另外您要注意的是,单击WebForm按钮后,DocumentCompleted
事件将被取消订阅。这样做是为了避免来自WebBrowser的进一步通知,因为已经执行了所需的操作,并且不需要对其他页面执行进一步的操作。
因此,只有当您向服务器请求新结果时才会激活该事件(例如,单击您的UI搜索按钮)。
这里,private string SearchName;
是一个占位符,用于定义新搜索条件的过程。
private string SearchName;
private void button1_Click(object sender, EventArgs e)
{
SearchName = "tremblay jean";
webBrowser1.ScriptErrorsSuppressed = true;
webBrowser1.Navigate("");
webBrowser1.Document.Write("<!DOCTYPE html><head><meta http-equiv='x-ua-compatible' content='IE=edge,chrome=1'></head>");
webBrowser1.Navigate("http://www.ic.gc.ca/app/opic-cipo/trdmrks/srch/home?lang=eng");
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(this.WBDocCompleted);
}
protected void WBDocCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser browser = ((WebBrowser)sender);
if (browser.ReadyState == WebBrowserReadyState.Complete)
{
if (browser.Document != null)
{
browser.Document.GetElementById("search-crit-1").SetAttribute("value", this.SearchName);
foreach (HtmlElement button in browser.Document.GetElementsByTagName("button"))
{
if (button.GetAttribute("type") == "submit" && button.Name == "")
{
browser.DocumentCompleted -= this.WBDocCompleted;
button.InvokeMember("click");
break;
}
}
}
}
}