元素“ webBrowser”。如何等待页面加载?

时间:2018-12-23 18:54:40

标签: c# winforms

文档结构
“ Form0”-表单
--“ panel2”-面板
---“ Frm5UC”-自定义项
----“ webBrowser1”-浏览器

应用逻辑:
-转到“ webBrowser1”中的页面;
-输入登录名;
-输入密码;
-点击“登录”按钮。

如果我通过代码(这是“ Method_0()”方法)执行逻辑,则表单没有时间在“ Authorization()”方法中加载。 我得到“ webBrowser1.Document = null”, 错误“对象链接未指示对象实例。”

如果我通过界面执行所有操作,则一切正常。

如何使逻辑以编程方式运行?

private void Frm5UC_Load(object sender, EventArgs e)
        {
            webBrowser1.Visible = true;

            // *** TESTS ***
            Method_0();
        }



        #region *** TESTS ***
        public void Method_0()
        {
            Method_1();
            // Method_2();
        }

        public void  Method_1()
        {
            textBox2.Text = "_domain_com";
            textBox1.Text = @"domain_com/login/";

            button1.PerformClick();
        }

        public void Method_2() // Авторизация
        {
            Authorization();
        }
        #endregion *** TESTS ***


        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate(textBox1.Text);            
        }       

        private void button2_Click(object sender, EventArgs e)
        {
            Authorization();
        }       

        public void Authorization() // Авторизация
        {            
                foreach (HtmlElement he in webBrowser1.Document.GetElementsByTagName("input"))
                {
                    if (he.GetAttribute("name") == "login[login]")
                    {
                        he.SetAttribute("value", "login798");
                    }
                }

            // Code "enter password"
            // Code "Press the button"
        }

更新。
我尝试使用事件“ DocumentCompleted”。
添加了变量“ bool statusAuthorization;”。

结果: -将打开一个带有用于输入登录名/密码的字段的页面; 什么也没有发生。 该代码未输入登录名/密码。

我尝试进行调试。
逐步遍历整个代码。
没有错误。一切正常,但是浏览器中的表单无法打开。

如果我通过界面登录,则一切正常。

bool statusAuthorization;

    private void Frm5UC_Load(object sender, EventArgs e)
    {
            webBrowser1.Visible = true;

            statusAuthorization = true; // !!! CHANGES

            // *** ТЕСТ ***
            Method_0();
    }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;

        if (statusAuthorization == true)
        {
            Authorization();
        }
    }

        #region *** TESTS ***
        public void Method_0()
        {
            Method_1();
            // Method_2();
        }

        public void  Method_1()
        {
            textBox2.Text = "_domain_com";
            textBox1.Text = @"domain_com/login/";

            button1.PerformClick();
        }

        public void Method_2() // Авторизация
        {
            Authorization();
        }
        #endregion *** TESTS ***


        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Navigate(textBox1.Text);            
        }       

        private void button2_Click(object sender, EventArgs e)
        {
            Authorization();
        }       

        public void Authorization() // Авторизация
        {            
                foreach (HtmlElement he in webBrowser1.Document.GetElementsByTagName("input"))
                {
                    if (he.GetAttribute("name") == "login[login]")
                    {
                        he.SetAttribute("value", "login798");
                    }
                }

            // Code "enter password"
            // Code "Press the button"

            statusAuthorization = false; // !!! CHANGES
        }

更新
结果:表单一次又一次地加载。

private void Frm5UC_Load(object sender, EventArgs e)
        {
            string s = "stop";
            webBrowser1.Visible = true;    

            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompletedHandler);

            // *** ТЕСТ ***
              Method_1();
        }

     private void DocumentCompletedHandler(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                //Done!
                Authorization();
            }

1 个答案:

答案 0 :(得分:0)

尝试一下:

bool statusAuthorization;

private void Frm5UC_Load(object sender, EventArgs e)
{
        webBrowser1.Visible = true;

        statusAuthorization = true; // !!! CHANGES

        // *** ТЕСТ ***

}

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;

    if (statusAuthorization == true && webBrowser1.Document != null)
    { Method_1();
        Authorization();
    }
}

    #region *** TESTS ***


    public void  Method_1()
    {
        textBox2.Text = "_domain_com";
        textBox1.Text = @"domain_com/login/";


    }






    private void button1_Click(object sender, EventArgs e)
    {Method_1();
        Authorization();
    }       

    public void Authorization() // Авторизация
    {            
            foreach (HtmlElement he in webBrowser1.Document.GetElementsByTagName("input"))
            {
                if (he.GetAttribute("name") == "login[login]")
                {
                    he.SetAttribute("value", "login798");
                }
            }

        // Code "enter password"
        // Code "Press the button"

        statusAuthorization = false; // !!! CHANGES
    }