我在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;
}
}
}
}
答案 0 :(得分:0)
当您使用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的进一步通知,因为已经执行了所需的操作,并且不需要对其他页面执行进一步操作。
因此,只有当您向服务器请求新结果时才会激活该活动(例如,点击您的用户界面搜索按钮)。
此处,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;
}
}
}
}
}