Вы можете циклически проходить через все входные теги и идентифицировать соответствующий, проверяя «наиболее идентифицирующий» атрибут (идентификатор, имя, тип, innerHTML и т. Д.). Вот Sub (), который я использую в листе Excel, который автоматически входит на веб-сайт
Sub FormAction(Doc As MSHTML.HTMLDocument, ByVal Tag As String, ByVal Attrib As String, ByVal Match As String, ByVal Action As String)
Dim ECol As MSHTML.IHTMLElementCollection
Dim IFld As MSHTML.IHTMLElement
Dim Tmp As String
Set ECol = Doc.getElementsByTagName(Tag)
For Each IFld In ECol ' cycle thru all <[tag]> elements
If VarType(IFld.getAttribute(Attrib)) <> vbNull Then ' does it contain the attribute
If Left(IFld.getAttribute(Attrib), Len(Match)) = Match Then
If Action = "/C/" Then
IFld.Click
Else
IFld.setAttribute "value", Action
End If
Exit Sub
End If
End If
Next
End Sub
Функция принимает следующие параметры:
- Док .... объект HTML DOM
- Tag .... тег, над которым вы хотите работать (обычно input, image, a, ...)
- Attrib .... атрибут, значение которого вы хотите сопоставить
- Match .... соответствующее значение для атрибута
- Действие ..... если "/ C /" выполняется действие .Click () над соответствующим тегом, в противном случае значение действия помещается в атрибут значения тега
Если вы хотите подключить любой атрибут, содержащий код JavaScript (например, «onclick»), не забывайте, что код, который вы видите в исходном коде HTML, встроен в анонимную функцию, такую как
function anonymous()
{
onclick="exportData(workOrderSearchForm)";
}
Вы должны учитывать это, используя функцию Instr () или аналогичную, если вы хотите подключить, например, "exportData (workOrder".
Также очень важно: дать достаточно времени для перехода к странице и загрузки объекта DOM. В моей компании я замечаю, что при изменении страниц время загрузки иногда резко возрастает.
У меня хороший успех по этому вопросу:
Sub MyMainSub()
Dim Browser As SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.HTMLDocument
' my other Dim's
' start browser
Set Browser = New SHDocVw.InternetExplorer
Browser.navigate "http://www.whatever.com"
WaitForBrowser Browser, 5 ' wait for browser, but not more than 5 sec
' gain control over DOM object
Set HTMLDoc = Browser.document
WaitForBrowser Browser, 5 ' wait for browser, but not more than 5 sec
' do actions
' FormAction HTMLDoc, w, x, y, z
End Sub
Sub WaitForBrowser(Browser As SHDocVw.InternetExplorer, Optional TimeOut As Single = 10)
Dim MyTime As Single
MyTime = Timer ' seconds since midnight
Do While Browser.Busy Or (Timer <= MyTime + TimeOut)
DoEvents ' go do something else
Loop
If Browser.Busy Then
MsgBox "I waited for " & Timer - MyTime & " seconds, but browser still busy" & vbCrLf & _
"exititing Login sequence now"
End
End If
End Sub
Надеюсь, это вдохновит вас на создание решения.
Удачи MikeD