为什么代码不通过 firevents ("Onchange") 如果弹出窗口出现

Why code doesn't Go past the firevents ("Onchange") if popup comes after

我正在尝试在文本框中输入值,然后触发事件 "onchange",这是有效的。但是在那之后我得到一个弹出窗口并且代码没有超过 onchnage 代码,所以我不能点击弹出窗口的 'ok' 按钮。

<INPUT onchange=javascript:AcctId_ONCHANGE(); id=debAcctId class=textfieldfont style="WIDTH: 150px" maxLength=16 name=nefrtg.debAcctId fdt="String" enabled>

<INPUT onclick="javascript:return nefrtg_det_ONCLICK14(this,this);" id=Go class=sbutton type=button value=Go name=Go ?>   

有没有办法在同一行代码上单击该按钮,或者有其他方法吗?

ie.Document.frames(0).frames(0).frames(0).Document.getElementById("debAcctId").Value = strDebAcc

ie.Document.frames(0).frames(0).frames(0).Document.getElementById("debAcctId").FireEvent ("onchange")

    While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE
        DoEvents
        If ie.Busy Then
            DoEvents
            hWND = FindWindow(vbNullString, "Message from webpage")
            If hWND <> 0 Then childHWND = FindWindowEx(hWND, ByVal 0&, "Button", "OK")
            If childHWND <> 0 Then SendMessage childHWND, BM_CLICK, 0, 0
        End If
    Wend

我了解到您的 VBA 代码在页面上显示警告消息时卡住了。

我试图找到解决方案或解决方法,但没有找到任何有效的示例。

我在一个旧线程中发现用户需要从另一个工作簿创建 IE 实例并找到消息 window 并将其关闭。我个人认为这不是一个实用的解决方案。除此之外,我没有得到 VBA.

的任何解决方案

进一步搜索,我发现如果您可以使用 Selenium 网络驱动程序来自动化 IE 浏览器,那么这个问题就有解决方案。

要使用 Selenium 单击警报的 'OK' 按钮:

driver.switchTo().alert().accept();

要使用 Selenium 单击警报的 'Cancel' 按钮:

driver.switchTo().alert().dismiss();

参考:

Alert & Popup Window Handling in Selenium WebDriver

因此您可以考虑将此方法作为 VBA 方法的替代方法。

Private Sub ClickOKButton() 
    Dim strScript As String, sFileName As String, wsh As Object
    Set wsh = VBA.CreateObject("WScript.Shell")
    strScript = "WScript.Sleep 5000" & vbCrLf & _
                "Dim wsh" & vbCrLf & _
                "Set wsh = CreateObject(""WScript.Shell"")" & vbCrLf & _
                "wsh.SendKeys ""{ENTER}""" & vbCrLf & _
                "Set wsh = Nothing"
    sFileName = wsh.ExpandEnvironmentStrings("%Temp%") & "\zz_automation.vbs"
    Open sFileName For Output As #1
    Print #1, strScript
    Close #1
    wsh.Run """" & sFileName & """"
    Set wsh = Nothing
End Sub

我 运行 上面的脚本在触发 'onchange' 之前。它有效,但我仍在为上述问题寻找更好的答案。