Как сделать, чтобы C # Webbrowser обрабатывал всплывающее окно входа на веб-страницу для веб-скрапинга - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь программно войти на сайт, подобный espn.com.Настройка сайта происходит, когда я нажимаю на кнопку «Вход», расположенную на главной странице, в середине экрана отображается всплывающее окно «Вход в систему» ​​со слегка окрашенным фоном.Моя цель состоит в том, чтобы программно получить это всплывающее окно, указать имя пользователя и пароль и отправить его в надежде, что мне вернется файл cookie для использования в качестве аутентификации.Однако, поскольку для отображения формы используется Javascript, мне не обязательно иметь легкий доступ к тегам ввода формы через HTML-код главной страницы.

Однако я попытался исследовать различные решения, такие как HttpClient и HttpWebRequest.Похоже, что веб-браузер лучше, так как форма входа отображается с использованием Javascript.Поскольку мне не обязательно иметь легкий доступ к тегам ввода формы, веб-браузер кажется лучшей альтернативой для захвата элементов ввода всплывающего окна.

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

Я ожидаю, что обработчик Web_V1_NewWindow будет вызываться при вызове метода InvokeMember ("click").Однако выполнение кода выполняется только через обработчик webpage_DocumentCompleted без каких-либо вызовов Web_V1_NewWindow.Возможно, мне нужно использовать метод, отличный от InvokeMember («click»), чтобы вызвать обработчик события нажатия кнопки «Войти».Или мне может понадобиться что-то совершенно другое.Я не уверен на 100%, что Web_V1.NewWindow - правильный подход для моих нужд, но я видел, что NewWindow часто используется при работе с всплывающими окнами, поэтому я решил, что мне следует попробовать.

Любая помощь будетЯ буду очень признателен, поскольку потратил на это значительное количество времени.

...