6

MicrosoftAccess2003の自動化を使用してInternetExplorer9を制御し、データベースデータを使用してフォームに入力しようとしています。

入力により、ブラウザでイベントが発生し、データが検証され、保存ボタンが表示されます。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>

ありがとう!

4

2 に答える 2

14

これについて数日間汗を流した後、答えは実際には非常に単純でしたが、MSDNまたはWeb上の他の場所のドキュメントで見つけることはほぼ不可能でした。

入力フィールドの値を変更する前に、ネットでそのフィールドにフォーカスを設定します。値を変更した後、フォーカスを別のフィールドに設定する必要があります。どうやら、イベントは焦点の喪失に火をつけます。したがって、コードは次のようになります。

        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ドキュメントを調べることでした。障害のあるユーザーに焦点を合わせるようアドバイスしていました。これを試してみようと思ったところ、うまくいきました。これが他の誰かに役立つことを願っています。

デイブ

于 2012-04-21T11:11:37.553 に答える
1

(IE9で)「次のi」の行の直​​前に次の行を配置する場合。フォーカスを緩めなくても機能するはずですか?

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

于 2014-10-03T23:39:16.437 に答える