【问题标题】:Excel VBA: How do I trigger an input field validation on a HTML webpageExcel VBA:如何在 HTML 网页上触发输入字段验证
【发布时间】:2019-02-13 22:03:35
【问题描述】:

我正在尝试使用 VBA 自动输入网页 https://www.cpf.gov.sg/eSvc/Web/Schemes/LifePayoutEstimator/LifePayoutEstimator。我编写了以下填充各种输入字段的 VBA 代码,作为我想要实现的示例。

Sub SubmitEstimatorForm()

    Dim ie As InternetExplorer
    Dim html As HTMLDocument
    Set ie = New InternetExplorer
    ie.Visible = True
    ie.navigate "https://www.cpf.gov.sg/eSvc/Web/Schemes/LifePayoutEstimator/LifePayoutEstimator"
    Do While ie.READYSTATE <> 4
        DoEvents
    Loop

    Set htmldoc = ie.document
    Set htmldisclaimercheck = htmldoc.getElementbyid("is-disclaimer-checked")
    Set htmlmaleradio = htmldoc.getElementbyid("radioMale")
    Set htmlfemaleradio = htmldoc.getElementbyid("radioFemale")
    Set htmldobfield = htmldoc.getElementbyid("DateOfBirth")
    Set htmlrabalfield = htmldoc.getElementbyid("RetirementAccountBalance_display")
    Set htmlnextbutton = htmldoc.getElementbyid("btnCalculate")

    htmldisclaimercheck.Click
    htmlmaleradio.Click
    htmldobfield.Value = "01/01/1960"
    htmlrabalfield.Value = "50000.00"
    htmlnextbutton.Click

End Sub

不幸的是,如果我在网页中手动键入相同的“50000.00”,“当前退休帐户余额”字段似乎会触发额外的验证,但当通过 VBA 以编程方式填充该字段时不会这样做。在尝试提交表单(即单击下一步按钮)时,缺少此验证会导致错误。

我尝试了各种通过 FireEvents 触发验证的方法,使用 onclick、onchange、onfocus 等,但到目前为止都没有成功。

在做了一些研究之后,我认为解决这个问题的方法可能应该是通过执行底层的 javascript/jquery,并且在 How to scrape a form that requires field validation by user? 找到了类似的问题,但是尽管多次尝试使用 .execScript() 我仍然无法达到我所需要的。由于不熟悉 javascript/jquery 和 DOM 资源管理器,我正在努力寻找合适的脚本或 jquery 来执行。

不胜感激有关如何继续的建议或提示,无论是通过上述方法还是通过其他替代方法。谢谢!

【问题讨论】:

  • 如果目标是学习 VBA,那就继续努力吧!但是,如果目标是像网站那样简单地自动化您的 CPF 计算,那么这是一种可怕的方法。该网站所做的只是一个简单的计算,并且您需要通过努力从网站上抓取数字,您最好自己在 Excel 中进行计算。 (因为它的目的是!)有几个页面包含有关计算的详细信息,其中一些具有现成的可下载 Excel 工作簿。 Here's the first one I found.
  • 谢谢 - 感谢您的建议,同意使用 Excel 更有效。不过,我仍然想寻求原始编程问题的解决方案 - 你可以认为我正在尝试学习 VBA,是的:)

标签: jquery html excel vba web-scraping


【解决方案1】:

您可以使用以下内容。你需要在click之前focus

Option Explicit
Public Sub SubmitEstimatorForm()

    Dim ie As InternetExplorer
    Dim html As HTMLDocument
    Set ie = New InternetExplorer
    ie.Visible = True
    ie.navigate "https://www.cpf.gov.sg/eSvc/Web/Schemes/LifePayoutEstimator/LifePayoutEstimator"

    While ie.Busy Or ie.readyState < 4: DoEvents: Wend

    Dim htmldoc As HTMLDocument, htmldisclaimercheck As Object, htmlmaleradio As Object
    Dim htmlfemaleradio As Object, htmldobfield As Object, htmlrabalfield As Object
    Dim htmlnextbutton As Object

    Set htmldoc = ie.document
    Set htmldisclaimercheck = htmldoc.getElementById("is-disclaimer-checked")
    Set htmlmaleradio = htmldoc.getElementById("radioMale")
    Set htmlfemaleradio = htmldoc.getElementById("radioFemale")
    Set htmldobfield = htmldoc.getElementById("DateOfBirth")
    Set htmlrabalfield = htmldoc.getElementById("RetirementAccountBalance_display")
    Set htmlnextbutton = htmldoc.getElementById("btnCalculate")

    htmldisclaimercheck.Click
    htmlmaleradio.Click

    htmldobfield.Value = "01/01/1960"

    With htmlrabalfield
        .Focus
        .Value = "50000.00"
    End With

    With htmlnextbutton
        .Focus
        .Click
    End With

    While ie.Busy Or ie.readyState < 4: DoEvents: Wend
    'other code

End Sub

【讨论】:

    猜你喜欢
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2019-12-24
    • 2022-11-26
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多