2012-04-17 100 views
6

正尝试从Microsoft Access 2003中使用自动化来控制Internet Explorer 9以使用数据库数据完成表单。使用VBA输入事件的Internet Explorer自动化

输入在浏览器中触发一个事件来验证数据并使保存按钮可见。如果我使用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> 

谢谢!

回答

12

在这几天出汗之后,答案其实非常简单,但几乎不可能在任何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 2012-10-10 13:26:40

1

如果你想(在IE9)把下面的行线“下一个我”之前。即使你没有放松焦点,它也应该起作用。

objRows(n)的.Cells(ⅰ).GetElementsByTagName( “输入”)(0)。单击