Я бы немного переписал, используя With syntax
.
В идеале добавьте условия ожидания для исчезновения счетчика или, если страница использует ajax, вы можете попытаться выполнить мониторинг для завершения, а не явное ожидание (которое я использовал);традиционного ожидания загрузки страницы будет недостаточно.Ожидания перед попыткой выбора из выпадающих списков могут быть достаточными, но вы также можете прикрепить событие, которое хотите запустить, и затем запустить его.
Заключите свое имя пользователя в "", чтобы оно передавалось как строковый литерал.
Нижние вызовы должны использовать getElementById
, а не getElementsById
. Вы можете использовать селектор атрибута с помощью querySelector, чтобы сделать выпадающий выбор.
Допустим, ваши параметры выпадающего списка были следующими:
<select name="alphabetSoup" form="aForm">
<option value ="1">A</option>
<option value ="2">B</option>
<option value ="3">C</option>
</select>
Селектор атрибутов можно использовать для выбора параметра, равного "A"
, используя его атрибут value
и значение атрибута value
:
ie.document.querySelector("[value='1']")
где 1 - это значение атрибута value
элемента тега option
для "A"
VBA:
Option Explicit
Public Sub FillForm()
Dim ie As Object, tool As Workbook
Set tool = ActiveWorkbook
Set ie = CreateObject("InternetExplorer.application")
With ie
.Visible = True
.Navigate2 "https://student.udise.in/"
While .Busy Or .readyState < 4: DoEvents: Wend
With .document
.getElementById("txtUserName").Value = "username"
.getElementById("txtPassword").Value = "password"
.getElementById("btnSubmit").Click
End With
While .Busy Or .readyState < 4: DoEvents: Wend
.Navigate2 "https://student.udise.in/Userscreens/Profilenew4.aspx"
While .Busy Or .readyState < 4: DoEvents: Wend
Dim evt As Object
Set evt = .document.createEvent("HTMLEvents")
evt.initEvent "change", True, False
With .document.querySelector("[value='536']")
.Selected = True
.dispatchEvent evt
End With
Application.Wait Now + TimeSerial(0, 0, 2)
With .document.querySelector("[value='131518424']") '< insert option A value attribute value here. Same as shown for 536 above.
.Selected = True
.dispatchEvent evt
End With
Application.Wait Now + TimeSerial(0, 0, 2)
With .document
.getElementById("ctl00_ContentPlaceHolder1_ddldiability").Focus
.getElementById("ctl00_ContentPlaceHolder1_ddldiability").selectedIndex = 2
.getElementById("ctl00_ContentPlaceHolder1_ddldiability").FireEvent "onchange"
End With
Application.Wait Now + TimeSerial(0, 0, 1)
Stop
'.Quit
End With
End Sub