Search code examples
htmlajaxvbaweb-scrapinggetelementsbytagname

Element.Click opens first item but not second


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>&nbsp;&nbsp;-
                          <span id="cpMainContent_ChildContent2_Repeater1_lblAPIWellNo_0" style="font-weight:bold;">03-077-00004-00-00</span>
                          &nbsp;&nbsp;<span style="color:Black; font-weight:bold ">Permit Number</span>&nbsp;&nbsp;-
                          <span id="cpMainContent_ChildContent2_Repeater1_lblPermit_0" style="font-weight:bold;">18684</span>
                          &nbsp;&nbsp;<span style="color:Black; font-weight:bold ">Well Name</span>&nbsp;&nbsp;-                                             
                          <span id="cpMainContent_ChildContent2_Repeater1_lblWellName_0" style="font-weight:bold;">Bosnick Oper 1</span>
                      </td>
                      <td align="right">
                          &nbsp;&nbsp; | &nbsp;&nbsp;
                          <span style="color:Maroon; font-weight:bold ">SideTrack Cnt</span>&nbsp;&nbsp;-
                          <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>&nbsp;&nbsp;-
                          <span id="cpMainContent_ChildContent2_Repeater1_lblAPIWellNo_1" style="font-weight:bold;">03-077-10002-00-00</span>
                          &nbsp;&nbsp;<span style="color:Black; font-weight:bold ">Permit Number</span>&nbsp;&nbsp;-
                          <span id="cpMainContent_ChildContent2_Repeater1_lblPermit_1" style="font-weight:bold;">38665</span>
                          &nbsp;&nbsp;<span style="color:Black; font-weight:bold ">Well Name</span>&nbsp;&nbsp;-                                             
                          <span id="cpMainContent_ChildContent2_Repeater1_lblWellName_1" style="font-weight:bold;">Bosnick 1-1</span>
                      </td>
                      <td align="right">
                          &nbsp;&nbsp; | &nbsp;&nbsp;
                          <span style="color:Maroon; font-weight:bold ">SideTrack Cnt</span>&nbsp;&nbsp;-
                          <span id="cpMainContent_ChildContent2_Repeater1_lblRowTotal_1" style="font-size:10pt;font-weight:bold;">1</span>
                      </td>
                  </tr> 
                  
              </tbody></table>
          
      <br><br>
  </div>

Solution

  • 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