ron
ron

Reputation: 1378

Log-in to Website

I'm trying to create an Excel macro that will log me into this website. I've written macros to log me into to other websites, but this one is somehow different.

When I use the following code to programmatically insert the username and password and then programmatically click the "log-in" button, the webpage comes back with the message

Error: please provide a username and Error: Please provide a password

Sub LogIn()
' Open IE and navigate to the log-in page    
    Set ie = CreateObject("InternetExplorer.Application")

    With ie
        .Visible = True
        .navigate "https://www.prudential.com/login"

' Loop until the page is fully loaded
        Do Until Not ie.Busy And ie.ReadyState = 4
            DoEvents
        Loop
        Application.Wait (Now + TimeValue("0:00:10"))

' Enter the necessary information on the Login web page and click the submit button
        ie.document.getElementById("username").Value = "abcdef"
        ie.document.getElementById("password").Value = "12345678"
        ie.document.getElementsByClassName("btn btn-primary btn-login btn-sm-block analytics-login")(0).Click

' Loop until the page is fully loaded
        Do Until Not ie.Busy And ie.ReadyState = 4
             DoEvents
        Loop
    End With

' Do stuff

' Quit IE
    ie.Quit
End Sub

I can see that my code has inserted the username and password into the webpage boxes, but for some reason after successfully clicking the submit button, the username and password are not being detected.

What code will successfully insert the username and password so that it can be processed by the web page? You'll know that your code works when you get the following error message:

We are unable to verify your username and password. Please try again.

Thanks for your help!

Upvotes: 2

Views: 377

Answers (4)

SIM
SIM

Reputation: 22440

Another approach might be something like the following.

Sub Get_Logged_In()
    Dim IE As New InternetExplorer, HTML As HTMLDocument
    Dim post As Object, elem As Object

    With IE
        .Visible = True
        .navigate "https://www.prudential.com/login"
        While .Busy = True Or .readyState < 4: DoEvents: Wend
        Set HTML = .document
    End With

    With HTML
        Set post = .querySelector("#username")
        post.Focus
        post.innerText = "abcdef"

        Set elem = .querySelector("#password")
        elem.Focus
        elem.innerText = "12345678"

        .querySelector("button[data-qa='Login Button']").Click
    End With
    IE.Quit
End Sub

Reference to add to the library:

1. Microsoft Internet Controls
2. Microsoft HTML Object Library

Upvotes: 1

ron
ron

Reputation: 1378

In case anyone else has a similar problem I was finally able to get Sendkeys to work. Still, if anyone can come up with a non-Sendkeys solution it would be much preferred.

Two important points in getting Sendkeys to work are 1) use of

    Set WSS = CreateObject("WScript.Shell")

and 2) to be sure to run the macro from Excel (e.g. tools-macro-macros) and not from the VB Editor (running from the editor will simply insert the text somewhere within the code and not on the target webpage).

' Open IE and navigate to the log-in page
    Application.StatusBar = "Opening IE and logging in to the website"

    Set WSS = CreateObject("WScript.Shell")
    my_username = "abcdef"
    my_pw = "12345678"

    Set ie = CreateObject("InternetExplorer.Application")

    With ie
        .Visible = True
        .navigate "https://www.prudential.com/login"
        .Top = 0
        .Left = 0
        .Height = 1025
        .Width = 1925

' Loop until the page is fully loaded
        Do Until Not ie.Busy And ie.ReadyState = 4
            DoEvents
        Loop
        Application.Wait (Now + TimeValue("0:00:10"))        
        WSS.SendKeys "{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}"
        Application.Wait (Now + TimeValue("0:00:01"))

        WSS.SendKeys my_username
        Application.Wait (Now + TimeValue("0:00:01"))
        WSS.SendKeys "{TAB}"
        Application.Wait (Now + TimeValue("0:00:01"))
        WSS.SendKeys my_pw
        Application.Wait (Now + TimeValue("0:00:01")

        ie.document.getElementsByClassName("btn btn-primary btn-login btn-sm-block analytics-login")(0).Click

' Loop until the page is fully loaded
        Do Until Not ie.Busy And ie.ReadyState = 4
             DoEvents
        Loop
    End With

' You're now logged in, do your stuff..

Upvotes: 0

Shai Rado
Shai Rado

Reputation: 33682

Try the code below:

Option Explicit

Const READYSTATE_COMPLETE       As Long = 4
Const URL_String                As String = "https://www.prudential.com/login"

Sub Login()

    Dim IE As Object
    Dim ObjElement As Object

    ' using Late Binding
    Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .navigate URL_String
        .Visible = True
    End With

    Do While (IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE)
        DoEvents
    Loop

    IE.document.getElementByid("username").Value = "abcdef"
    IE.document.getElementByid("password").Value = "12345678"

    ' Optional: I didn't need the wait time
    Application.Wait (Now + TimeValue("0:00:01"))

    Set ObjElement = IE.document.getElementsByClassName("btn btn-primary btn-login btn-sm-block analytics-login")
    ObjElement(0).Click

    Set IE = Nothing

End Sub

Upvotes: 1

Tehscript
Tehscript

Reputation: 2556

It actually wants you to send a key, so you can bypass this request like this:

ie.document.getElementById("username").Focus
ie.document.getElementById("username").Value = "abcde"
Application.SendKeys "f", True

ie.document.getElementById("password").Focus
ie.document.getElementById("password").Value = "1234567"
Application.SendKeys "8", True

ie.document.getElementsByClassName("btn btn-primary btn-login btn-sm-block analytics-login")(0).Click

Edit:

Sub GetData()
    Dim ie As InternetExplorer
    Dim desc As IHTMLElement
    Set ie = New InternetExplorer
    With ie
        .navigate "https://www.prudential.com/login"
        .Visible = True
    End With

    Do While (ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE)
        DoEvents
    Loop

    ie.document.getElementById("username").Focus
    Application.SendKeys "abcdef"
    Application.Wait (Now + TimeValue("0:00:01"))

    ie.document.getElementById("password").Focus
    Application.SendKeys "12345678"
    Application.Wait (Now + TimeValue("0:00:01"))

    ie.document.getElementsByClassName("btn btn-primary btn-login btn-sm-block analytics-login")(0).Click

    Set ie = Nothing
End Sub

Upvotes: 5

Related Questions