如何让C#Webbrowser处理网页登录弹出窗口以进行网络抓取

时间:2019-05-12 18:58:46

标签: c# web-scraping login popup webbrowser-control

我正在尝试以编程方式登录到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(“ click”)的方法来调用“登录”按钮的click事件处理程序。或者,我可能需要尝试完全不同的东西。我不是100%肯定Web_V1.NewWindow是满足我需求的正确方法,但是我已经看到NewWindow在处理弹出窗口时经常使用,所以我想应该尝试一下。

由于我在此上花费了很多时间,因此任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我知道答案很晚。但这会帮助别人。 您可以按照以下步骤从FRAME元素中提取值:

// 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");
} 

有关更多详细信息,请检查 this article