如何让C#WebBrowser处理网页登录弹出窗口弹出窗口



我正在尝试编程登录到ESPN.com之类的网站。设置网站的设置方式是我单击主页上的登录按钮,在屏幕中间显示弹出窗口中的登录,背景略微着色。我的目标是以编程方式获取该弹出框,提供用户名和密码,然后提交 - 希望将cookie返回给我作为身份验证。但是,由于JavaScript用于显示表单,因此我不一定可以轻松地通过主页的HTML访问表单的输入标签。

我尝试研究了诸如HTTPCLIENT和HTTPWEBREQUEST等各种解决方案,但是由于使用JavaScript显示登录表单,因此WebBrowser似乎是最好的。由于我不一定容易访问该表单的输入标签,因此WebBrowser似乎是捕获弹出窗口的输入元素的最佳选择。

class ESPNLoginViewModel
{
    private string Url;
    private WebBrowser webBrowser1 = new WebBrowser();
    private SHDocVw.WebBrowser_V1 Web_V1;
    public ESPNLoginViewModel()
    {
        Initialize();
    }
    private void Initialize()
    {
        Url = "http://www.espn.com/";
        Login();
    }

    private void Login()
    {
        webBrowser1.Navigate(Url);
        webBrowser1.DocumentCompleted +=
        new WebBrowserDocumentCompletedEventHandler(webpage_DocumentCompleted);
        Web_V1 = (SHDocVw.WebBrowser_V1)this.webBrowser1.ActiveXInstance;
        Web_V1.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(Web_V1_NewWindow);
    }
    //This never gets executed
    private void Web_V1_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
    {
        //I'll start determing how to code this once I'm able to get this invoked
    }
    private void webpage_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlElement loginButton = webBrowser1.Document.GetElementsByTagName("button")[5];
        loginButton.InvokeMember("click");
        //I've also tried the below InvokeScript method to see if executing the javascript that
        //is called when the Log In button is clicked, however Web_V1_NewWindow still wasn't called.
        //webBrowser1.Document.InvokeScript("buildOverlay");
    }
}

我希望在调用InvokeMember(" click"(方法时调用Web_v1_newwindow处理程序。但是,代码执行仅通过WebPage_documentCompleted处理程序运行,而无需拨打Web_v1_newwindow的任何呼叫。可能是我需要使用与InvokeMember("单击"(不同的方法来调用登录按钮的点击事件处理程序。或者我可能需要完全尝试完全不同的东西。我不是100%确定web_v1.newwindow是适合我需求的正确方法,但是我看到Newwindow在处理弹出窗口时经常使用,所以我认为我应该尝试一下。

>

我花了大量时间在此方面都将不胜感激。

我知道这是晚答案。但这将帮助别人。您可以通过遵循

从帧元素提取值
// Get frame using frame ID
HtmlWindow frameWindow = (from HtmlWindow win 
                         in WbBrowser.Document.Window.Frames select win)
                .Where(x => string.Compare(x.WindowFrameElement.Id, "frm1") == 0)
                .FirstOrDefault();
// Get first frame textbox with ID
HtmlElement txtElement = (from HtmlElement element 
                         in frameWindow.Document.GetElementsByTagName("input")
                         select element)
                .Where(x => string.Compare(x.Id, "txt") == 0).FirstOrDefault();
// Check txtElement is nul or not
if(txtElement != null)
{
   Label1.Text = txtElement.GetAttribute("value");
} 

有关更多详细信息检查本文

最新更新