Trying to open tables by clicking on a MSHTML.IHTMLElement TagName, if it matches a tag.id.
The tag.id is shown in the immediate window as the one I'm searching for and it opens the table.
The 2nd tag.id's are equal but the table doesn't open, yet the program runs to completion.
I've found other questions that say I should get rid of the For Each statement and use a For to statement (I've edited below) but I get the same result, opens the 1st not the 2nd. The 2nd time through the loop the elementTagName.ID gets set to nothing.
The site uses AJAX to load all of the data to the page and takes an inordinate amount of time to load, including the tables behind the element.click so a suggestion on how to handle the sleep call with something cleaner would possibly get the second table open.
I have done extensive research to answer this question and have not found any code that I can make work.
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
Option Explicit
Public Sub AOGCQueryHTMLDocument2()'''
Dim ie As New SHDocVw.InternetExplorer
Dim HTMLDoc As MSHTML.IHTMLDocument
Dim HTMLLoc As MSHTML.IHTMLElement, HTMLstr1 As MSHTML.IHTMLElement, HTMLWlBtn As MSHTML.IHTMLElement
Dim HTMLHide As MSHTML.IHTMLElement, HTMLstrWait As MSHTML.IHTMLElement
Dim HTMLHSearch As MSHTML.IHTMLElement
Dim HTMLWlBtns As MSHTML.IHTMLElementCollection
Dim btnShow As Long, IntWlCtr As Integer
Dim WlBtnCompare As String, i As Integer
ie.Visible = True
ie.navigate "http://www.aogc.state.ar.us/data/querybuild.aspx"
Do While ie.readyState <> READYSTATE_COMPLETE
Loop
Set HTMLDoc = ie.document
'Sets and Clicks to open the location from which wells will be searched
Set HTMLLoc = HTMLDoc.getElementById("cpMainContent_ChildContent2_btnViewLocation")
HTMLLoc.Click
Sleep 7500
'Clicks on the Location
Set HTMLstr1 = HTMLDoc.getElementById("cpMainContent_ChildContent2_GridLocation_ckLocation_1")
With HTMLstr1
.Click
End With
'Hides the Location dropdown so can be searched
Set HTMLHide = HTMLDoc.getElementById("cpMainContent_ChildContent2_btnHideLocation")
HTMLHide.Click
Sleep 7500
'Searches for the Wells in the above Location
Set HTMLHSearch = HTMLDoc.getElementById("cpMainContent_ChildContent2_btnSearch")
HTMLHSearch.Click
Sleep 7500
Set HTMLDoc = ie.document
'Gets all "input" TagNames
Set HTMLWlBtns = HTMLDoc.getElementsByTagName("input")
IntWlCtr = 0
'Comparison of "input" tags to determine button to click
For i = 4 To HTMLWlBtns.Length - 1
With HTMLWlBtns
On Error Resume Next
Debug.Print HTMLWlBtns.Length, HTMLWlBtns.Item(4).ID, HTMLWlBtns.Item(5).ID
'Debug.Print shows length and nodes correctly
'HTMLWlBtns.Length = 20
'HTMLWlBtns.Item(4).ID = cpMainContent_ChildContent2_Repeater1_btnShow_0
'HTMLWlBtns.Item(5).ID = cpMainContent_ChildContent2_Repeater1_btnShow_1
End With
'Comparison of "input" tags to determine button to click
With HTMLWlBtn
Set HTMLWlBtn = HTMLWlBtns.Item(i)
End With
WlBtnCompare = "cpMainContent_ChildContent2_Repeater1_btnShow_" & IntWlCtr
'This Debug.Print the 1st time through the loop opens "btnShow_0"
'The 2nd time through the HTMLWlBtn.ID is nothing
'Need explanation as to why HTMLWlBtns.Item(5).ID gets emptied
If HTMLWlBtn.ID = WlBtnCompare Then
HTMLWlBtn.Click
Sleep 6500
IntWlCtr = IntWlCtr + 1
Set HTMLDoc = ie.document ' define it again
Set HTMLWlBtns = HTMLDoc.getElementsByTagName("input") 'I added
'this prior to Worf adding the previous Set trying to make sure HTMLWlBtns
'didn't get set to "nothing". Didn't work until Worf added ' define it again.
End If
Next i
MsgBox "Well opening is complete", vbSystemModal
End Sub
Here is the HTML tag that I'm trying to open:
<div style="margin-left:15px; margin-right:5px; margin-bottom:5px;">
<table cellpadding="0" cellspacing="0">
<tbody><tr>
<td>
<input type="image" name="ctl00$ctl00$cpMainContent$ChildContent2$Repeater1$ctl00$btnShow" id="cpMainContent_ChildContent2_Repeater1_btnShow_0" src="../Images/plus.gif">
<span style="color:Black; font-weight:bold ">API</span> -
<span id="cpMainContent_ChildContent2_Repeater1_lblAPIWellNo_0" style="font-weight:bold;">03-077-00004-00-00</span>
<span style="color:Black; font-weight:bold ">Permit Number</span> -
<span id="cpMainContent_ChildContent2_Repeater1_lblPermit_0" style="font-weight:bold;">18684</span>
<span style="color:Black; font-weight:bold ">Well Name</span> -
<span id="cpMainContent_ChildContent2_Repeater1_lblWellName_0" style="font-weight:bold;">Bosnick Oper 1</span>
</td>
<td align="right">
|
<span style="color:Maroon; font-weight:bold ">SideTrack Cnt</span> -
<span id="cpMainContent_ChildContent2_Repeater1_lblRowTotal_0" style="font-size:10pt;font-weight:bold;">1</span>
</td>
</tr>
</tbody></table>
<table cellpadding="0" cellspacing="0">
<tbody><tr>
<td>
<input type="image" name="ctl00$ctl00$cpMainContent$ChildContent2$Repeater1$ctl01$btnShow" id="cpMainContent_ChildContent2_Repeater1_btnShow_1" src="../Images/plus.gif">
<span style="color:Black; font-weight:bold ">API</span> -
<span id="cpMainContent_ChildContent2_Repeater1_lblAPIWellNo_1" style="font-weight:bold;">03-077-10002-00-00</span>
<span style="color:Black; font-weight:bold ">Permit Number</span> -
<span id="cpMainContent_ChildContent2_Repeater1_lblPermit_1" style="font-weight:bold;">38665</span>
<span style="color:Black; font-weight:bold ">Well Name</span> -
<span id="cpMainContent_ChildContent2_Repeater1_lblWellName_1" style="font-weight:bold;">Bosnick 1-1</span>
</td>
<td align="right">
|
<span style="color:Maroon; font-weight:bold ">SideTrack Cnt</span> -
<span id="cpMainContent_ChildContent2_Repeater1_lblRowTotal_1" style="font-size:10pt;font-weight:bold;">1</span>
</td>
</tr>
</tbody></table>
<br><br>
</div>
Finally got an answer from a "Well Known Member" named Worf on MrExcel board.
It was a simple answer in that he placed another Set HTMLDoc = ie.document
inside the if statement after the 1st element was selected and then Set HTMLWlBtns = HTMLDoc.getElementsByTagName("input")
after that.
Not sure why it was getting lost but hopefully he will explain on the forum board what was happening.
I've updated the above code to show the correct answer.
Here's the link if anyone else is having trouble with a similar issue:
https://www.mrexcel.com/board/threads/automation-macro-using-getelementsbytagname-opens-first-element-but-not-2nd.1156811/#post-5612948