2012-04-17 19 views
6

Próbuję użyć automatyzacji z programu Microsoft Access 2003 do sterowania programem Internet Explorer 9 w celu wypełnienia formularza przy użyciu danych bazy danych.Automatyzacja przeglądarki Internet Explorer z wejściami zdarzeń VBA

Dane wejściowe wywołują zdarzenie w przeglądarce, które sprawdza poprawność danych i powoduje, że przycisk zapisu jest widoczny. Jeśli użyję sendkeys, zdarzenie zostanie wywołane; jednak znalazłem sendkeys za bardzo niewiarygodne. Jeśli zmienię wartość elementu, a następnie użyję .fireevent ("onchange"), nic się nie stanie - nawet błąd.

Moje pytanie brzmi: jak wystrzelić wydarzenie. Lub, w jaki sposób mogę się dowiedzieć, jaki jest javascript. Czy istnieje typ debugowania dla IE, który powie mi, jakie zdarzenie zostało wywołane? Jeśli tak, czy mogę po prostu uruchomić skrypt sam?

Mój kod znajduje się poniżej.

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 pól wejściowych są:

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

Dzięki!

Odpowiedz

12

Po poceniu się przez kilka dni, odpowiedź była bardzo prosta, ale prawie niemożliwa do znalezienia w dowolnej dokumentacji na MSDN lub gdziekolwiek indziej w Internecie.

Przed zmianą wartości pola wprowadzania należy ustawić wartość netto, aby ustawić fokus na tym polu. Po zmianie wartości należy ustawić ostrość na inne pole. Najwyraźniej wydarzenia płoną z powodu utraty ostrości. Dlatego kod powinien wyglądać tak:

 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 

Sposób, znalazłem ten był patrząc na niektóre dokumentacji MSDN o dostępności dla IE9. Doradzał przy ustawianiu fokusu dla niepełnosprawnych użytkowników. Po prostu pomyślałem, że spróbuję i zadziałało. Mam nadzieję, że to pomoże komuś innemu.

Dave

+0

zdrowie który był pomocny mi – BlueTrin

1

Jeśli chcesz (w IE9) umieścić następującą linię tuż przed linią "Next i". powinno to również działać, nawet jeśli nie tracisz ostrości?

objRows (n) .Cells (I) .GetElementsByTagName ("wejście") (0) .Kliknij

Powiązane problemy