首页 > 解决方案 > 使用 vba 登录网站 - 单击提交时 un 和 pw 消失

问题描述

我正在尝试编写一个可以简单地登录到网站的宏。

我之前做过一些网络抓取,并且总是能够在其他网站上成功地做类似的事情,但我无法弄清楚这一点。

我已经尝试了很多东西,最后一次尝试(非常绝望!)是输入用户名和密码,并调用所有可能的脚本并触发所有可能的事件,请参见下面的代码。请忽略我是如何做/命名某些事情的(比如集合的 eventsArray 等)——我一直在尝试新事物并多次更改代码,这都是暂时的。

    Dim eventsArray As New Collection
    eventsArray.Add "abort"
    eventsArray.Add "afterprint"
    eventsArray.Add "animationend"
    eventsArray.Add "animationiteration"
    eventsArray.Add "animationstart"
    eventsArray.Add "beforeprint"
    eventsArray.Add "beforeunload"
    eventsArray.Add "blur"
    eventsArray.Add "canplay"
    eventsArray.Add "canplaythrough"
    eventsArray.Add "change"
    eventsArray.Add "click"
    eventsArray.Add "contextmenu"
    eventsArray.Add "copy"
    eventsArray.Add "cut"
    eventsArray.Add "dblclick"
    eventsArray.Add "drag"
    eventsArray.Add "dragend"
    eventsArray.Add "dragenter"
    eventsArray.Add "dragleave"
    eventsArray.Add "dragover"
    eventsArray.Add "dragstart"
    eventsArray.Add "drop"
    eventsArray.Add "durationchange"
    eventsArray.Add "ended"
    eventsArray.Add "error"
    eventsArray.Add "focus"
    eventsArray.Add "focusin"
    eventsArray.Add "focusout"
    eventsArray.Add "fullscreenchange"
    eventsArray.Add "fullscreenerror"
    eventsArray.Add "hashchange"
    eventsArray.Add "input"
    eventsArray.Add "invalid"
    eventsArray.Add "keydown"
    eventsArray.Add "keypress"
    eventsArray.Add "keyup"
    eventsArray.Add "load"
    eventsArray.Add "loadeddata"
    eventsArray.Add "loadedmetadata"
    eventsArray.Add "loadstart"
    eventsArray.Add "message"
    eventsArray.Add "mousedown"
    eventsArray.Add "mouseenter"
    eventsArray.Add "mouseleave"
    eventsArray.Add "mousemove"
    eventsArray.Add "mouseover"
    eventsArray.Add "mouseout"
    eventsArray.Add "mouseup"
    eventsArray.Add "mousewheel"
    eventsArray.Add "offline"
    eventsArray.Add "online"
    eventsArray.Add "open"
    eventsArray.Add "pagehide"
    eventsArray.Add "pageshow"
    eventsArray.Add "paste"
    eventsArray.Add "pause"
    eventsArray.Add "play"
    eventsArray.Add "playing"
    eventsArray.Add "popstate"
    eventsArray.Add "progress"
    eventsArray.Add "ratechange"
    eventsArray.Add "resize"
    eventsArray.Add "reset"
    eventsArray.Add "scroll"
    eventsArray.Add "search"
    eventsArray.Add "seeked"
    eventsArray.Add "seeking"
    eventsArray.Add "select"
    eventsArray.Add "show"
    eventsArray.Add "stalled"
    eventsArray.Add "storage"
    eventsArray.Add "submit"
    eventsArray.Add "suspend"
    eventsArray.Add "timeupdate"
    eventsArray.Add "toggle"
    eventsArray.Add "touchcancel"
    eventsArray.Add "touchend"
    eventsArray.Add "touchmove"
    eventsArray.Add "touchstart"
    eventsArray.Add "transitionend"
    eventsArray.Add "unload"
    eventsArray.Add "volumechange"
    eventsArray.Add "waiting"
    eventsArray.Add "wheel"

    'set un and pw obj
    Set user = IE.Document.all.user
    Set pass = IE.Document.all.pass

    'enter un and pw
    user.Value = "test@test.com"
    pass.Value = "test123"

    'for each element
    For Each ele In Array(user, pass)
        'fire all poss events
        For Each fEvent In eventsArray
            On Error Resume Next
            ele.FireEvent ("on" & fEvent)
            ele.FireEvent (fEvent)
            On Error GoTo 0
        Next
    Next

    'exec all scripts availible in document
    For Each scr In IE.Document.Scripts
        On Error Resume Next
        Call IE.Document.parentWindow.execScript(scr.src, "JavaScript")
        On Error GoTo 0
    Next

    'sign in
    IE.Document.getElementById("loginLink").Click

点击登录后会发生什么,它返回“您缺少电子邮件地址 blahblah”,并且两个值都消失了。如果我在提交之前手动修改其中一个字段,另一个值就会消失。

我尝试了一些随机的事情,比如添加事件侦听器、单击、聚焦等等,甚至在输入用户名和密码的每个字符后尝试做所有这些事情。我承认我只是盲目地尝试了所有这些事情,希望有些事情会奏效,显然没有成功,我不知道该怎么做。任何帮助将不胜感激!

/edit:我通过使用sendkeys(每个字段中的空格+退格)达到了预期的结果,但是我不想这样做。肯定有更好的方法吗?

标签: excelvbainternet-explorerweb-scraping

解决方案


我会使用selenium basic vba(安装并确保最新的 chromedriver 在 selenium 文件夹中)和 vbe > tools > references > add selenium type library reference。干净多了。

Option Explicit
Public Sub Login()
    Dim d As WebDriver
    Set d = New ChromeDriver

    With d
        .Start "Chrome"
        .get "https://uk.webuy.com/"

        .FindElementByCss("#signIn").Click
        .FindElementByCss("#user").SendKeys "abc@aol.com"
        .FindElementByCss("#pass").SendKeys "password"
        .FindElementByCss("#loginLink").Click

        Stop

        .Quit
    End With
End Sub

推荐阅读