首页 > 解决方案 > Element.Click 打开第一项但不是第二项

问题描述

尝试通过单击 MSHTML.IHTMLElement TagName 来打开表(如果它与 tag.id 匹配)。

tag.id 显示在即时窗口中,作为我正在搜索的那个,它会打开表格。
第二个 tag.id 是相等的,但表没有打开,但程序运行完成。

我发现其他问题说我应该摆脱 For Each 语句并使用 For to 语句(我在下面进行了编辑)但我得到相同的结果,打开第一个而不是第二个。第二次通过循环,elementTagName.ID 被设置为空。

该站点使用 AJAX 将所有数据加载到页面并花费大量时间来加载,包括元素后面的表格。单击因此有关如何使用更清洁的东西处理睡眠呼叫的建议可能会得到第二个表格打开。

我已经进行了广泛的研究来回答这个问题,但没有找到任何可以让我工作的代码。

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

这是我试图打开的 HTML 标记:

  <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>

标签: htmlajaxvbaweb-scrapinggetelementsbytagname

解决方案


终于从 MrExcel 板上一位名叫 Worf 的“知名会员”那里得到了答案。这是一个简单的答案,因为他Set HTMLDoc = ie.document在第一个元素被选中之后在 if 语句中放置了另一个,然后再Set HTMLWlBtns = HTMLDoc.getElementsByTagName("input")之后。不知道为什么它会丢失,但希望他能在论坛板上解释发生了什么。我已经更新了上面的代码以显示正确的答案。如果其他人遇到类似问题,这是链接: https ://www.mrexcel.com/board/threads/automation-macro-using-getelementsbytagname-opens-first-element-but-not-2nd.1156811/ #post-5612948


推荐阅读