为什么代码不通过 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' 之前。它有效,但我仍在为上述问题寻找更好的答案。
<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' 之前。它有效,但我仍在为上述问题寻找更好的答案。