当前位置: 首页 > 知识库问答 >
问题:

Internet Explorer - 使用VBA用文本掩码填充输入框

司空炯
2023-03-14

下午好!

我试图运行一个宏来打开一个网站,登录,在菜单中选择一个选项,填充一个文本框,然后点击另一个按钮。

到目前为止,我可以打开网站,登录,选择菜单中的选项,但是我无法通过任何方式填充文本框。该输入框有一个文本掩码:

格式:00000-000类型:数字最大字符。: 8分钟字符。: 8

Sub SAVE()


    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Application.StatusBar = "Searching"


Sheets("WEB").Visible = True

    Dim IE As New InternetExplorer
    Dim WshShell As Object
    Dim dtInicio As Date
    Dim objIE As New DataObject



    Sheets("SAVE").Select
    Sheets("SAVE").Cells.Clear


S = 2
V = 2

SALVA = 0
Do While Sheets("Adress").Cells(V, 2) <> ""
    IE.Visible = True

    Sheets("WEB").Select
    ActiveWindow.SelectedSheets.Delete
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Select
    Sheets(Sheets.Count).Name = "WEB"


'OPEN URL
    IE.navigate "URL HERE"

    While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
        Sleep (1000)
        DoEvents
    Wend



    IE.Document.forms(0).pUsrLg.Value = "user"
    IE.Document.forms(0).pUsrSn.Value = "password"
    IE.Document.parentWindow.execScript "login();"

    While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    Sleep (1000)
    DoEvents
    Wend

    IE.Document.parentWindow.execScript "enviaPage('mod_pesquisa/DisponibilidadeNaoClientes.asp', 'GET', 'True', 'dv_pagina', 'pUsrId=0000050007', 'True', 389, 892);"

    While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    Sleep (1000)
    DoEvents
    Wend

我必须填写的输入如下所示:

<input name="pCepNr" id="pCepNr" type="text" class="st_cxt_01" style="height: 20px; width: 85px; background-color: #FFEEDD; color: #913A1A;">

共有1个答案

金毅
2023-03-14

因为方法IE.Document.getelementbyid(“pCepNr”)。值返回错误代码91(对象未设置),我怀疑。getElementById无法找到具有id=“pCepNr”的HTML元素

请在您的代码中尝试这样做来确认这一点:

' snip ...
IE.Document.parentWindow.execScript "enviaPage('mod_pesquisa/DisponibilidadeNaoClientes.asp', 'GET', 'True', 'dv_pagina', 'pUsrId=0000050007', 'True', 389, 892);"

While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
    Sleep (1000)
    DoEvents
Wend

Dim problemTextBox as Object
Set problemTextBox = IE.Document.getelementbyid("pCepNr")

我怀疑它会抛出同样的错误。(编辑 有关睡眠例程,请参阅此问题。

除非您查找的元素id错误,否则当您尝试访问该元素时,该元素根本不存在。

如果您正在运行的这个脚本,

IE.Document.parentWindow.execScript "enviaPage('mod_pesquisa/DisponibilidadeNaoClientes.asp', 'GET', 'True', 'dv_pagina', 'pUsrId=0000050007', 'True', 389, 892);"

是加载元素的原因,而在此之前元素不存在,那么您的等待循环无法等待足够长的时间来加载它。

我注意到对于. asp页面IE. BusyIE.readyState并不总是有效。您可以通过使用调试器逐步减速并在知道输入框已加载后访问输入框来测试它,或者通过强制大量(10秒)睡眠来测试它。

如果只是在加载元素之前退出等待循环,那么您将需要更好的等待例程。这是我用过的一个,部分来自SE上的其他问题。

Public Function ElementExists(document as Object, id As String) As Boolean

    Dim el As Object
    Set el = Nothing

    On Error Resume Next
    Set el = document.getElementById(id)

    On Error GoTo 0
    ElementExists = Not (el Is Nothing)

End Function
Public Function WaitForElement(document as Object, ByVal id As String, Optional ByVal timeout As Integer = 3) As Boolean

    Dim start_time As Single
    start_time = Timer

    Do While Not (ElementExists(document, id)) And start_time + timeout > Timer
        DoEvents
    Loop
    WaitForElement = ElementExists(document, id)

End Function

调用WaitForElement(IE.Document,“pCepNr”)将等待元素加载不超过3秒,并返回元素是否可访问(true|false)。3秒是可选的,您可以根据需要增加或减少,例如(WaitForElement(IE.Document,“pCepNr”,timeout:=10)

 类似资料:
  • 我正在尝试用getelementbyclassname()填充这个文本框。值但是不管用。它只有在我使用innertext时才有效,但这不是我想要的,因为它对文本进行了硬编码。我该如何处理这个元素以便向它传递文本呢? VBA:

  • 驱动程序的fire中有一个bug。使用chrome驱动解决了这个问题。 代码 我试过联系搜索。clear()和click()方法,但输入仍然为空。代码来自https://web.whatsapp.com/登录后会出现一个名为“搜索”或“开始新聊天”的字段。我想在该字段中输入文本。

  • 我正在尝试填充一个NxN矩阵。我想做的是能够将给定行的所有元素作为一个输入输入。例如,如果我有一个4x4矩阵,对于每一行,我想在一个输入中输入4列,然后在每次输入后打印显示新值的矩阵。我尝试运行以下代码,但我得到一个错误:线程“main”中的异常java.util.InputMismatchException。这是我的代码: 当我得到输入4个数字的提示时,我输入以下内容: 然后我得到错误。

  • 问题内容: 我需要一些帮助。在Excel(2013)VBE中使用Selenium Basic ChromeDriver(v 75.0.3770.140)进行Chrome(v75.0.3770.100)。如果存在客户id#,则有一个输入框会生成一个动态列表。我希望填写客户ID#,然后从动态下拉列表中选择。但是第一步,我正在努力将文本输入框。我可以点击带有 但是,当我尝试在框中填写以下内容时: 我收到

  • 我用的是甜警报2(https://sweetalert2.github.io/)-react组件,我需要在第二步使用(千分隔符和前缀=“$”)屏蔽输入。是否可能? 这里有些代码 我不知道如何控制这一切。谢谢你的帮助

  • 因此,我试图在我的JavaFX应用程序中创建一个自定义节点,它从扩展而来,因此可以自己进行渲染。我一开始只是试着画一个文本“Hello world”在画布上,但可惜它没有出现,即使我可以通过鼠标事件处理程序确认应用程序中是否存在自定义节点。 简而言之,如果我将这个的一个新实例添加到一个