Вопрос по internet-explorer, vba – Internet Explorer Automation с входными событиями VBA

6

Я пытаюсь использовать автоматизацию из Microsoft Access 2003 для управления Internet Explorer 9 для заполнения формы с использованием данных базы данных.

Входные данные запускают событие в браузере, которое проверяет данные и делает видимой кнопку сохранения. Если я использую sendkeys, событие запускается; однако я обнаружил, что sendkeys очень ненадежны. Если я изменю значение элемента и затем использую .fireevent (& quot; onchange & quot;), ничего не произойдет & # x2013; даже не ошибка.

У меня вопрос, как мне запустить событие. Или, как я могу узнать, что работает 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>

Спасибо!

Ваш Ответ

2   ответа
1

«Next i». это также должно работать, даже если вы не потеряете фокус?

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

13

ответ был на самом деле очень простым, но его почти невозможно найти ни в одной документации по 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

Я нашел это, посмотрев документацию MSDN о доступности для IE9. Это был совет по настройке фокуса для пользователей с ограниченными возможностями. Я просто думал, что попробую, и это сработало. Я надеюсь, что это помогает кому-то еще.

Дейв

Ура, это было полезно для меня

Похожие вопросы