在填写文本框并单击

时间:2018-04-14 18:33:17

标签: c# webbrowser-control

我在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;
                }
            }
        }
    }

1 个答案:

答案 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;
                }
            }
        }
    }
}