在填充文本框并单击之前等待webBrowser控件加载

问题描述 投票:0回答:1

我在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;
                }
            }
        }
    }
c# webbrowser-control
1个回答
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的进一步通知,因为已经执行了所需的操作,并且不需要对其他页面执行进一步的操作。 因此,只有当您向服务器请求新结果时才会激活该事件(例如,单击您的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;
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.