通过Excel VBA使用JS登录网站

时间:2019-07-19 12:05:11

标签: html excel vba internet-explorer web-scraping

我有一个宏,只需按一下按钮,它就可以登录我的网站。但是,事实并非如此。 有人已经在尝试帮助我,但这就像他自己说的那样有点烦人。因此,我在这里再次尝试更多细节!

这是他给我的最后一个密码。

Public Sub GetInfo()
    Dim IE As New InternetExplorer
    With IE
        .Visible = True
        .navigate "https://apiweb.biomerieux.com/login"
        While .Busy Or .readyState < 4: DoEvents: Wend
        With .document.getElementById("signupEmail")
            .Focus
            .Value = "xxxx"
        End With
        Application.Wait Now + TimeSerial(0, 0, 1)
        With .document.getElementById("signupPassword")
            .Focus
            .Value = "yyyy"
        End With
        On Error Resume Next
        With .document.getElementById("signupSubmit")
            .Focus
            .Click
        End With
        '.Quit
    End With
End Sub

最奇怪的是,当您通过宏在文本框中输入凭据并单击按钮时,站点认为即使输入了凭据,也没有输入凭据。

我以前的助手认为网站上的部分javascript可能将其弄乱了。

2 个答案:

答案 0 :(得分:2)

如果您检查html及其相关事件,则会看到与这些登录字段相关联的许多事件侦听器。实际上,您只需添加input事件,然后触发它就可以逃脱。通常,当手动在输入框中键入内容时,事件监听器会捕获到该事件。

看到@SIM的答案:我的之所以起作用,是因为它会生成事件,否则该事件将被现有事件侦听器以其答案中给出的延迟接收。 IMO,如果您使用定时循环,他们的方法会更好。


其中一个事件侦听器的视图:

enter image description here


VBA:

Option Explicit
Public Sub Login()
    With CreateObject("InternetExplorer.Application")
        .Visible = True
        .navigate2 "https://apiweb.biomerieux.com/login"
        While .busy Or .readyState <> 4: DoEvents: Wend

        With .document
            Dim evt As Object
            Set evt = .createEvent("HTMLEvents")
            evt.initEvent "input", True, False

            With .querySelector("#signupEmail")
                .Value = "abc@gmail.com"
                 .dispatchEvent evt
            End With

            With .querySelector("#signupPassword")
                .Value = "defghij"
                .dispatchEvent evt
            End With
            .querySelector("table a").Click
        End With
        Stop '<==delete me later
        .Quit
    End With
End Sub

阅读:

  1. Creating HTML Events
  2. Event Listeners

答案 1 :(得分:2)

我认为这种简单的方法足以完成工作。您需要做的就是让脚本等待第一个输入的html元素可用。

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

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

        With HTML
            Do: Set post = .querySelector("#signupEmail"): DoEvents: Loop While post Is Nothing
            .querySelector("#signupEmail").innerText = "imc@yahoo.com"
            .querySelector("#signupPassword").innerText = "abc12345"
            .querySelector("a > #signupSubmit").Click
        End With
    End With
End Sub