首页 > 解决方案 > 使用带有 selenium 的 vba 如何获取表格中的特定单元格然后单击它

问题描述

我正在尝试访问网页上的表格,并在表格中尝试单击该单元格。

我试图到达的单元格有一个 td id="flowTile_6"。在下面突出显示它。

我尝试了各种方法

ch.FindElementByXPath("//table[@id="mainFlow"]/tbody/tr[7]/td[15]").Click

这将出错。

并试图循环遍历每个人以达到它,但我没有成功。

Option Explicit

Private ch As Selenium.ChromeDriver

Sub test()

    Dim FindBy As New Selenium.By
    Dim ResultSections As Selenium.WebElements
    Dim ResultSection As Selenium.WebElement
    Dim TableByTag As Selenium.WebElement
    Dim tr, c, r, td, li, cc, t
    
   
    
    Set ch = New Selenium.ChromeDriver
    
    ch.Start baseUrl:=""
    ch.Get "/"
    

    
    
   ' ch.FindElementById("flowTile_6").Click
   


       'Set TableByTag = ch.FindElementByTag("table")
       'ch.FindElementByXPath("//table[@id="mainFlow"/tbody/tr[7]/td[15]").Click
       
       
       For Each li In ch.FindElementById("mainFlow")
            cc = 1
        For Each t In li.FindElementsByTag("li")
            ch.FindElementById("flowTile_6").Click
            cc = cc + 1
        Next t
        Next li
      
End Sub

html

<div class="background">
<div class="holder">
<table class="flow" id="mainFlow" style="display: table;">
<tbody>
<tr class="collapsible" id="flowHeader1_text" isasection="true" onclick="doExpandCollapse(this)">
►&lt;td colspan="25">...</td>
</tr>
<tr id="flowHeader1_underline">
<td colspan="25">
<div class="flowHeaderUnderline"></div>
</td>
</tr>
<tr id="flowHeader1_placeholder" class="sectionAnimationPlaceHolder">
<td colspan="25"></td>
</tr>
<tr id="row1">...</tr> == $0
<tr id="row2" class="narrowSpacer">...</tr>
►&lt;tr id="row3" class="narrowSpacer">...</tr>
<<tr id="row4">
<td class="a Em"X/td>
<td class="b Em"x/td>
<td class="a Em"></td>
<td class="d Em"x/td>
►&lt;td id="flowTile_4" class="e item enabled hasIcon" role="link" aria-labelledby="tileDescription_4" havebox="true" formid="" tiletext="Supply/Demand Inquiry" appid="" version="" onclick
script:runApp (', '', '')" onmouseover="javascrpt: startHoverTimer(this);" onmouseout="javascript:startTimerToMaybe End HoverMode (this);">...</td>
<td class="a Em"X</td>
<td class="b Em"X/td>
<td class="a Em"X/td>
<td class="d Em"x/td>
►&lt;td id="flowTile_5" class="e item enabled hasIcon" role="link" aria-labelledby="tileDescription_5" havebox="true" formid="" tiletext="Item Availability" appid="" version="" onclick="
ript:runpp('', '', '')" onmouseover="javascrpt:startHoverTimer(this);" onmouseout="javascript:startTimerToMaybe EndHoverMode(this);">.</td>
<td class="a Em"X/td>
<td class="b Em"></td>
<td class="a Em">/td>
<td class="d Em"X/td>

**<<td id="flowTile_6" class="e item enabled hasIcon" role="link" aria-labelledby="tileDescription_6" havebox="true" formid="W41016" tiletext="Item Master Inquiry" appid="" version="" onclick="
ript:runApp('', '','')" onmouseover="javascrpt:startHoverTimer(this);" onmouseout="javascript:startTimerToMaybeEndHoverMode (this);">
<div class="relativeWrapper">
<img id="flowTileIconImg_6" size="medium" src="/ide/share/images/ideicons/supply chain mntn medium.png" autoreplace="true">**

<div>
<div class="wlTileDesciption" id="tileDescription_6">Item Master Inquiry</div> == $0
</div>
</div>
</td>

<td class="a Em"X/td>
<td class="b Em"></td>
<td class="a Em"X/td>
<td class="d Em"x/td>
><td id="flowTile_7" class="e item enabled hasIcon" role="link" aria-labelledby="tileDescription_7" havebox="true" formid="W302016" tiletext="Single Level Where Used" appid="" version="" onclick=
"javascript:runpp ("', '', ')" onmouseover="javascrpt:startHoverTimer(this);" onmouseout="javascript:startTimerToMaybe EndHoverMode(this);">.</td>
<td class="a Em"x/td>
<td class="b Em"></td>
<td class="a Em"x/td>
<td class="d Em"X/td>
<td class="e Em"X/td>
</tr>
><tr id="rows" class="narrowSpacer">...</tr>
><tr id="row6" class="narrowSpacer">.</tr>
</tbody>
</table
</div>
远。

这就是我想在表格中得到的

<<td id="flowTile_6" class="e item enabled hasIcon" role="link" aria-labelledby="tileDescription_6" havebox="true" formid="W41016" tiletext="Item Master Inquiry" appid="" version="" onclick="
ript:runpp('', '','')" onmouseover="javascrpt:startHoverTimer(this);" onmouseout="javascript:startTimerToMaybeEndHoverMode (this);">
<div class="relativeWrapper">
<img id="flowTileIconImg_6" size="medium" src="/ide/share/images/ideicons/supply chain mntn medium.png" autoreplace="true">

标签: htmlexcelvbaselenium

解决方案


它嵌套在两个 iframe 中。

能够通过以下方式解决:

With ch
        .SwitchToFrame .FindElementById("e1menuAppIframe", timeout:=10000)
        .SwitchToFrame .FindElementById("wcFrame0", timeout:=10000)
        
        Set ResultSections = .FindElementsByClass("flow")
        
       For Each ResultSection In ResultSections
        
        .FindElementById("flowTile_6").Click
    Next ResultSection
        
End With

推荐阅读