Заполнение полей веб-формы, но веб-страница не может обнаружить текст - PullRequest
1 голос
/ 17 февраля 2020

Я заполняю веб-форму, используя VBA, и я могу заполнить текст в поле ввода, но веб-страница все еще не может обнаружить текст и показывает ошибку: "Ошибка: Обязательное поле - укажите ответ "

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True

URL = "https://npc.collegeboard.org/app/dartmouth/start"

objIE.Navigate URL

objIE.Document.getElementById("student.firstName").Focus
objIE.Document.getElementById("student.firstName").Value = "Tom"

Похоже, что некоторые AngularJS работают в фоновом режиме и не могут обнаружить текст, подаваемый в моем VBA. Любая помощь будет принята с благодарностью.

enter image description here

1 Ответ

0 голосов
/ 17 февраля 2020

Прежде всего после objIE.Navigate URL следует дождаться полной загрузки сайта и готовности IE. Это делается с помощью следующего:

objIE.Navigate URL 'this needs some time but VBA will continue excecuting the next statement qickly

Const READYSTATE_COMPLETE As Integer = 4
Do While objIE.Busy Or objIE.ReadyState <> READYSTATE_COMPLETE
    DoEvents
Loop

'now IE is ready and the page is loaded.

Но, возможно, некоторые JavaScript еще не готовы, и это не распознается objIE.Busy или objIE.ReadyState. Таким образом, вы можете сделать обходной путь:

Dim Obj As Object
Do While Obj Is Nothing
    On Error Resume Next
    Set Obj = objIE.Document.getElementById("student.firstName")
    On Error GoTo 0
Loop

'now `student.firstName` is accessible, and probably all the other fields are too.

Это попытается получить доступ к полю student.firstName, если его там нет, произойдет ошибка. Мы подавляем сообщение об ошибке, используя On Error Resume Next, и возвращаемся к TryAgain, пока оно не будет найдено.

Обратите внимание, что у этого есть один недостаток: если есть проблема с загрузкой этого сайта, он застрянет в этом l oop. Поэтому я рекомендую получить критерий отмены по времени, например, если это займет больше минуты, отмените его и сгенерируйте сообщение об ошибке.

Должно работать что-то вроде следующего:

Option Explicit

Sub test()
    Dim objIE As Object
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    Dim URL As String
    URL = "https://npc.collegeboard.org/app/dartmouth/start"

    objIE.Navigate URL

    Const READYSTATE_COMPLETE As Integer = 4
    Do While objIE.Busy Or objIE.ReadyState <> READYSTATE_COMPLETE
        DoEvents
    Loop

    Dim Obj As Object
    Do While Obj Is Nothing
        On Error Resume Next
        Set Obj = objIE.Document.getElementById("student.firstName")
        On Error GoTo 0
    Loop


    objIE.Document.getElementById("student.firstName").Focus
    objIE.Document.getElementById("student.firstName").Value = "Tom"
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...