Запуск событий, связанных с полем ввода

#vba #internet-explorer #automation

#vba #internet-explorer #автоматизация

Вопрос:

У меня возникли проблемы с запуском событий, связанных с полем ввода. Это прослушиватели событий в окне «События» «DOM Explorer», когда я просматриваю соответствующее текстовое поле. Однако они не перечислены в HTML самого поля ввода.

Из нескольких перечисленных прослушивателей событий (например, «ввод», «размытие», «вставка») все они запускают одну и ту же функцию javascript «x». Хотя мой код вставляет текст, поле не проверяется при нажатии кнопки отправки и выделяется красным. Ввод вручную или вырезание и вставка решат эту проблему.

Я попробовал .fireEvent ; .dispatchEvent и даже попытался вызвать javascript напрямую. Это общедоступный веб-сайт, и адрес указан в коде. Я включаю ниже код для заполнения первых 3 полей.

Ниже приведен HTML-код поля:

 <input class="office-form-question-textbox office-form-textfield-input form-control office-form-theme-focus-border border-no-radius" aria-labelledby="QuestionId_r57b9be42eed24e63b4d2af31c178f530 QuestionInfo_r57b9be42eed24e63b4d2af31c178f530" spellcheck="true" maxlength="4000" placeholder="Enter your answer"> 

Скриншот окна DOM explorer:
введите описание изображения здесь

 Private Sub Test()
myAddress = "https://forms.office.com/Pages/ResponsePage.aspx?id=q4GdsF1ZzU2rJGpWVuGNiROj17Ac1mtIt6V80jIX_PFUMEs1VTZaQ0VRV1NNNVI4Vzg3V0RMOE83TS4u"

'create new instance of IE.
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.navigate myAddress

'wait for loading
Do While IE.Busy = True Or IE.readyState <> 4: DoEvents: Loop
  
WasteTime (0.1) 'Custom function to pause for 0.1 sec

Dim myData(1 To 3, 1 To 3) As String

myData(1, 1) = "Member Surname"
myData(2, 1) = "QuestionId_r57b9be42eed24e63b4d2af31c178f530"
myData(3, 1) = "Chowdhary"

myData(1, 2) = "Member Forename"
myData(2, 2) = "QuestionId_rb88bf6d86f284dbaa14e5f3f27ee9f5b"
myData(3, 2) = "Saqib"

myData(1, 3) = "Member DOB"
myData(2, 3) = "QuestionId_r38d6e5656a6b4fbf86f586d10cbd8cb6"
myData(3, 3) = "19/04/1971"

Set objItem = IE.document.getElementsByTagName("input")
x = 0
Do While x < objItem.Length
    Set ele = objItem(x)
    mySearch = ele.outerHTML
    For c = 1 To UBound(myData, 2)
        If InStr(mySearch, myData(2, c)) > 0 Then
            ele.Focus
            ele.Value = myData(3, c)                
            Set event_onChange = IE.document.createEvent("HTMLEvents")
            event_onChange.initEvent "paste", True, False
            ele.dispatchEvent event_onChange 'This does not fire event                
            'ele.FireEvent ("onpaste") '- This did not work either
            'IE.document.parentWindow.execScript code:="x(c)" ' Tried to directly call the javascript function                                    
            Exit For
        End If
    Next c
    x = x   1
Loop

End sub
 

Ответ №1:

Событие в окне поиска может быть запущено с помощью клавиш отправки. Вы можете имитировать пользовательский ввод, используя SendKeys для установки значения полей ввода, затем нажмите Отправить, чтобы отправить форму.

Вы можете обратиться к фрагменту кода ниже. Я протестировал, и это работает:

 Set objItem = IE.document.getElementsByTagName("input")(0)
objItem.Focus
SendKeys ("Chowdhary")
Application.Wait (Now   TimeValue("00:00:02"))
IE.document.getElementsByTagName("button")(4).Click
 

Комментарии:

1. Спасибо, Ю Чжоу, я собирался сделать SendKeys своим последним решением. Однако мне было интересно узнать, как запустить JavaScript непосредственно в этом экземпляре. Метод, который я использовал в более простых примерах, похоже, здесь не работает.

Ответ №2:

Итак, я, наконец, заставил код работать на основе тех же .initEvent .dispatchEvent методов и . Мне просто нужно было ввести короткую паузу в 0,1 секунды (используя пользовательскую функцию «Wastetime»), чтобы элемент мог полностью загрузиться. Для интереса измененный соответствующий фрагмент кода:

 Set objItem = IE.Document.getElementsByTagName("input")
x = 0
Do While x < objItem.Length
    Set ele = objItem(x)
    mySearch = ele.outerHTML ' Could just enumerate the input indexes in order
    For c = 1 To UBound(myInternalArray, 2)
        If InStr(mySearch, myInternalArray(2, c)) > 0 Then
            If myInternalArray(3, c) = "click" Then
                ele.Click
                WasteTime (0.1) 'Time for form to expand
                Exit For
            Else
                ele.Value = myInternalArray(3, c)
                ele.Focus
                Set event_onInput = IE.Document.createEvent("HTMLEvents")
                event_onInput.initEvent "input", True, False
                ele.dispatchEvent event_onInput                
                Exit For
            End If
        End If
    Next c
    x = x   1
Loop