繁体   English   中英

使用多线程C#控制台应用程序登录网站

[英]Login to Website using multi-threaded C# console Application

我需要设计一个多线程应用程序才能登录到网站。 到目前为止,我无需使用线程即可加载到页面。 但是我被困在登录按钮中,单击el.InvokeMember(“ Click”);,它没有越过这一点并加载主页。 在我的示例中,我使用的是Pintrest登录,设计多线程控制台应用程序以登录到网页的任何帮助都会很棒。

下面是我的代码:

 private static bool completed = false;
    static string body = "";
    private static WebBrowser wb;
    [STAThread]
    static void Main(string[] args)
    {
        //http://stackoverflow.com/questions/4269800/webbrowser-control-in-a-new-thread
        //http://www.codeproject.com/Questions/197007/How-Use-WebBrowser-without-winform
        wb = new WebBrowser();
        wb.ScriptErrorsSuppressed = true;
        wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(LoginPageLoadedEvent);
      //  wb.DocumentCompleted += LoginPageLoadedEvent;

        wb.Navigate("https://www.pinterest.com/login");
        while (!completed)
        {
            Application.DoEvents();
            Thread.Sleep(100);
        }

        Console.Write("\n\nDone with it!\n\n");


    }

    static void LoginPageLoadedEvent(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        wb.DocumentCompleted -= LoginPageLoadedEvent;

        HtmlElementCollection theElementCollection = wb.Document.GetElementsByTagName("Input");
        foreach (HtmlElement curElement in theElementCollection)
        {
            string controlName = curElement.GetAttribute("name").ToString();
            if (controlName == "username_or_email")
            {
                curElement.SetAttribute("Value", "test@gmail.com");
            }
            if (controlName == "password")
            {
                curElement.SetAttribute("Value", "test123");
            }
        }


        HtmlElementCollection elc = wb.Document.GetElementsByTagName("button");
        foreach (HtmlElement el in elc)
        {
            if (el.GetAttribute("type").Equals("submit"))
            {
                el.InvokeMember("Click");
                break;
            }
        }

        wb.DocumentCompleted +=
            new WebBrowserDocumentCompletedEventHandler(LoginCompleteMainPageLoadedEvent);
        while (wb.ReadyState != WebBrowserReadyState.Complete)
        {
            Application.DoEvents();
            Thread.Sleep(100);
        }



    }

    static void LoginCompleteMainPageLoadedEvent(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        //Reading html data into text file
        string s = ((WebBrowser)sender).DocumentText;


        Console.WriteLine(wb.Document.Body.InnerHtml);
        System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\temp\\test.txt");
        file.WriteLine(wb.Url.ToString());
        file.WriteLine(s);
        file.Close();

        wb.DocumentCompleted -= LoginCompleteMainPageLoadedEvent;
    }

    static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        if (wb.ReadyState != WebBrowserReadyState.Complete)
            return;

        if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
            return;

        if (body == wb.Document.Body.InnerHtml) 
            return;

        body = wb.Document.Body.InnerHtml;


        Console.WriteLine(wb.Document.Body.InnerHtml);
        System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\temp\\test1.txt");
        file.WriteLine(wb.Url.ToString());
        file.WriteLine(wb.DocumentText);
        file.Close();
        completed = true;
    }
}

尝试这个:

webBrowser1.Document.GetElementsByTagName("Form")[2].InvokeMember("submit");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM