提问人:Dkellygb 提问时间:4/17/2012 最后编辑:Dkellygb 更新时间:3/24/2016 访问量:51096
带有 VBA 输入事件的 Internet Explorer 自动化
Internet Explorer Automation with VBA input events
问:
我尝试使用 Microsoft Access 2003 中的自动化来控制 Internet Explorer 9 以使用数据库数据完成表单。
输入在浏览器中触发一个事件,该事件验证数据并使保存按钮可见。如果我使用 sendkeys,则会触发该事件;但是,我发现 sendkeys 非常不可靠。如果我更改元素的值,然后使用 .fireevent (“onchange”),则不会发生任何事情——甚至没有错误。
我的问题是,我如何触发事件。或者,我怎样才能知道正在运行什么 javascript。是否有用于 IE 的调试类型的加载项,它会告诉我触发了什么事件?如果是这样,我可以自己运行脚本吗?
我的代码如下。
Set IE = CreateObject("internetexplorer.application")
IE.Visible = True
IE.Navigate "https://extranet.website.com/Planning/Edition/Periodic?language=en"
Do While IE.ReadyState <> 4 Or IE.Busy = True
DoEvents
Loop
'log in
If IE.Document.Title = "website- access" Then
IE.Document.getElementById("login_uid").Value = "username"
IE.Document.getElementById("login_pwd").Value = "password"
IE.Document.all("ButSubmit").Click
Do While IE.ReadyState <> 4 Or IE.Busy = True
DoEvents
Loop
End If
Do While Not RstAvailability.EOF
StartDate = RstAvailability!AvailDate
IE.Document.getElementById("periodStart").Value = Format(StartDate, "dd mmm yy")
IE.Document.getElementById("periodEnd").Value = Format(StartDate, "dd mmm yy")
Set LinkCollection = IE.Document.GetElementsByTagName("A")
For Each link In LinkCollection
If link.innertext = "Add" Then
link.Click
Exit For
End If
Next
Do While IE.ReadyState <> 4 Or IE.Busy = True
DoEvents
Loop
Set objRows = IE.Document.GetElementsByTagName("tr")
If RstAvailability!RoomType = "DTW" Then
n = 0
While n < objRows.Length
If Trim(objRows(n).Cells(0).innertext) = "Single Room" Then
For i = 1 To 7
'objRows(n).FireEvent ("onchange")
'objRows(n).Cells(i).GetElementsByTagName("input")(0).Focus
'SendKeys Format(RstAvailability!roomcount - RstAvailability!RoomsSold, "0") & "{TAB}"
objRows(n).Cells(i).GetElementsByTagName("input")(0).Value = Format(RstAvailability!roomcount - RstAvailability!RoomsSold, "0")
objRows(n).Cells(i).GetElementsByTagName("input")(0).fireevent ("onchange")
Do While IE.ReadyState <> 4 Or IE.Busy = True
DoEvents
Loop
Next i
End If
n = n + 1
Wend
End If
Set objButtons = IE.Document.getelementsbyname("savePlanning")
objButtons(0).Click
Do While IE.ReadyState <> 4 Or IE.Busy = True
DoEvents
Loop
newtime = Now + TimeValue("0:00:10")
Do While True
If Now > newtime Then Exit Do
Loop
RstAvailability.MoveNext
Loop
输入字段的 html 为:
<tr class="first" roomId="30494" articleId="0" type="Availability" readonly="False">
<div>
<span class="roomName">
Single Room
</span>
</div>
<span class="data">
<input id="Availabilities" name="Availabilities" type="text" value="" />
</span>
<span class="data">
<input id="Availabilities" name="Availabilities" type="text" value="" />
</span>
谢谢!
答:
14赞
Dkellygb
4/21/2012
#1
经过几天的思考,答案其实很简单,但几乎不可能在MSDN上的任何文档或网络上的其他任何地方找到。
在更改输入字段的值之前,请设置该字段的焦点。更改值后,需要将焦点设置为另一个字段。显然,这些事件是在失去焦点时引发的。因此,代码应如下所示:
n = 0
While n < objRows.Length
If Trim(objRows(n).Cells(0).innertext) = "Family Room" Then
For i = 1 To 7
objRows(n).Cells(i).GetElementsByTagName("input")(0).Focus
objRows(n).Cells(i).GetElementsByTagName("input")(0).Value = Format(RstAvailability!roomcount - RstAvailability!RoomsSold, "0")
Next i
objRows(n).Cells(1).GetElementsByTagName("input")(0).Focus
End If
n = n + 1
Wend
我发现这一点的方法是查看一些关于 IE9 辅助功能的 MSDN 文档。它建议将重点放在残疾用户身上。我只是想试一试,它奏效了。我希望这对其他人有所帮助。
戴夫
评论
0赞
BlueTrin
10/10/2012
干杯,对我有帮助
1赞
Angel
10/4/2014
#2
如果您希望(在 IE9 中)将以下行放在“Next i”行之前。即使你不失去焦点,它也应该有效吗?
objRows(n) 中。细胞(i)。GetElementsByTagName(“输入”)(0)。点击
评论