6

我正在创建一个带有自动登录到站点的 Webbrowser 控件的表单。当我调试它时,我可以看到它启动到站点并很好地填写用户名和密码,但是一旦它登录,它就会再次通过相同的代码,因此导致错误,因为它找不到相同的元素。为什么程序会循环执行此代码?我是否将代码输入了错误的事件处理程序?

namespace MyProject
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlDocument doc = webBrowser1.Document;
        HtmlElement username = doc.GetElementById("UserName");
        HtmlElement password = doc.GetElementById("Password");
        HtmlElement submit = doc.GetElementById("submit");
        username.SetAttribute("value", "XXXXXXXX");
        password.SetAttribute("value", "YYYYYYYYYY");
        submit.InvokeMember("click");
    }
}
}
4

2 回答 2

4

每当任何文档完成加载时都会触发该DocumentCompleted事件。 登录后,当您加载下一页时,该事件会再次触发。

您应该检查 URL,并且仅当您在实际登录页面时才执行自动登录。

(如果网络钓鱼者向您的应用发送虚假登录页面以窃取用户密码,请确保不要自动登录)

于 2013-10-15T16:06:25.813 回答
3
namespace MyProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool is_sec_page = false;

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (!is_sec_page)
            { 
                HtmlDocument doc = webBrowser1.Document;
                HtmlElement username = doc.GetElementById("UserName");
                HtmlElement password = doc.GetElementById("Password");
                HtmlElement submit = doc.GetElementById("submit");
                username.SetAttribute("value", "XXXXXXXX");
                password.SetAttribute("value", "YYYYYYYYYY");
                submit.InvokeMember("click");
                is_sec_page = true;
            }
            else
            {
                //intract with sec page elements with theire ids and so on
            }
        }
    }
}
于 2014-10-27T12:51:52.000 回答