2012-04-17 24 views
6

sto cercando di utilizzare l'automazione in da Microsoft Access 2003 per controllare Internet Explorer 9 per completare un modulo utilizzando i dati del database.Internet Explorer Automazione con eventi di input VBA

L'input genera un evento nel browser che convalida i dati e rende visibile il pulsante di salvataggio. Se uso sendkeys, l'evento viene attivato; tuttavia, ho trovato sendkeys essere molto inaffidabili. Se cambio il valore dell'elemento e poi uso .fireevent ("onchange"), non succede nulla, nemmeno un errore.

La mia domanda è, come si attiva l'evento. Oppure, come posso scoprire cosa sta facendo funzionare javascript. Esiste un tipo di debug di addin per IE che mi dirà quale evento viene attivato? In tal caso, posso semplicemente eseguire lo script da solo?

Il mio codice è di sotto.

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 

Il html dei campi di input sono:

<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> 

Grazie!

risposta

12

Dopo averlo sudato per alcuni giorni, la risposta era in realtà molto semplice ma quasi impossibile da trovare in qualsiasi documentazione su MSDN o in qualsiasi altro punto del web.

Prima di modificare il valore del campo di input, è necessario impostare il focus su quel campo. Dopo aver modificato il valore, è necessario impostare lo stato attivo su un altro campo. Apparentemente, gli eventi sparano sulla perdita di concentrazione. Pertanto, il codice dovrebbe essere simile a questo:

 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 

Il modo in cui ho trovato questo era, cercando in qualche documentazione MSDN di accessibilità per IE9. Stava consigliando di mettere a fuoco gli utenti disabili. Ho solo pensato di fare una prova e ha funzionato. Spero che questo aiuti qualcun'altro.

Dave

+0

acclamazioni che era utile per me – BlueTrin

1

Se si vuole (in IE9) per mettere la seguente riga a destra prima linea "Next i". dovrebbe funzionare anche se non si perde la messa a fuoco?

objRows (n) .Cells (i) .GetElementsByTagName ("input") (0) .cliccate

Problemi correlati