如何使用 <td> 和 <tr> 点击网页上的按钮?

Posted

技术标签:

【中文标题】如何使用 <td> 和 <tr> 点击网页上的按钮?【英文标题】:How to click on a button on a webpage using <td> and <tr>? 【发布时间】:2019-11-14 09:40:39 【问题描述】:

我正在尝试单击下面网页突出显示部分中的第一个“已完成”按钮。

这是一段网页的 VBA 代码:

我尝试以多种不同方式点击FIRST完成按钮,例如:

    For Each element In ie3.getElementsByTagName("main_table_data_right_border main_table_data_bottom_border")(5)
  If element.innerText = "Completed" Then
  ' Application.Wait (Now + TimeValue("0:03:00"))
    element.Click
     Application.Wait (Now + TimeValue("0:00:20"))
      Exit For
        Else
    End If
Next
 

或者

doc.querySelector("#divPage > table.advancedSearch_table > tbody"). _ getElementsByTagName("tr")(3).getElementsByTagName("td")(5).Children(0).Click

但它们似乎都不起作用。当我调试代码并浏览这部分和这一行时,实际上什么都没有发生。所以按钮没有被点击。

谁能帮我解决这个问题?

【问题讨论】:

我已经插入了元素。点击@arunv。对不起,我真的不明白你的意思 【参考方案1】:

您可以使用getElementsByTagName 方法查找超链接。请参考以下示例:

VBA代码找到超链接并点击按钮(在这个示例中,我只是在第一行找到特殊的单元格。如果要循环通过超链接,则需要使用For Each语句循环通过数组)。

Sub Test()
    Dim ie As Object
    Dim Rank As Object
    Set ie = CreateObject("InternetExplorer.application")
    ie.Visible = True
    ie.Navigate ("http://localhost:54382/htmlPage47.html")
    Do
        If ie.ReadyState = 4 Then
            Exit Do
        Else
        End If
    Loop
    
    Set doc = ie.document
    
    doc.getElementsByTagName("tr")(1).getElementsByTagName("td")(5).getElementsByTagName("a")(0).Click
    
End Sub

网页中的代码:

<div>
    <table class="main_table" style="text-align:center;">
        <tr class="main_table_header">
            <td></td>
            <td>Export Type</td>
            <td>Criteria</td>
            <td>Rep./List</td>
            <td>Creation Date</td>
            <td>Status</td>
            <td>Reference</td>
        </tr>
        <tr class="main_table_data">
            <td>
                <input id="Checkbox1" type="checkbox" />
            </td>
            <td>Activites</td>
            <td>Process Date from 2019/07/02 to 2019/07/02</td>
            <td>For an advanced search</td>
            <td>2019/07/03</td>
            <td><a onclick="javascript:alert('hello AA')" id="link1" href="#">Conpleted</a> (601 lines)</td>
            <td>662602308</td>
        </tr>
        <tr class="main_table_data">
            <td>
                <input id="Checkbox1" type="checkbox" />
            </td>
            <td>Activites</td>
            <td>Process Date from 2019/07/02 to 2019/07/02</td>
            <td>For an advanced search</td>
            <td>2019/07/03</td>
            <td><a onclick="javascript:alert('hello BB')" href="#">Conpleted</a> (601 lines)</td>
            <td>662602308</td>
        </tr>
        <tr class="main_table_data">
            <td>
                <input id="Checkbox1" type="checkbox" />
            </td>
            <td>Activites</td>
            <td>Process Date from 2019/07/02 to 2019/07/02</td>
            <td>For an advanced search</td>
            <td>2019/07/03</td>
            <td><a onclick="javascript:alert('hello CC')" href="#">Conpleted</a> (601 lines)</td>
            <td>662602308</td>
        </tr>
        <tr class="main_table_data">
            <td>
                <input id="Checkbox1" type="checkbox" />
            </td>
            <td>Activites</td>
            <td>Process Date from 2019/07/02 to 2019/07/02</td>
            <td>For an advanced search</td>
            <td>2019/07/03</td>
            <td><a onclick="javascript:alert('hello DD')" href="#">Conpleted</a> (601 lines)</td>
            <td>662602308</td>
        </tr>
    </table>
</div>

结果是这样的:

【讨论】:

【参考方案2】:

我看到您对如何访问 HTML 元素有点困惑,所以我将借此机会以非常详细的方式演示这样做的逻辑,我也认为这非常直观。还有其他方法可以做到,但我相信以下一种是最全面和最直观的一种,非常适合初学者。

首先,我将继续假设ie3 是一个InternetExplorer 对象。

当您使用此对象导航到某个页面时,您可以使用包含HTML document 对象的ie3.document 访问该页面的html。

要充分利用HTML document 对象,您应该添加对Microsoft HTML Object Library 的引用。该库将允许您使用许多 HTML 元素,让您的生活更轻松。

在您的情况下,您希望能够访问的元素是

    HTML 表格及其行和单元格 HTML 锚元素 ()

所以我的声明如下:

Dim ie3 As New InternetExplorer 'To be used to navigate to the page of interest
Dim doc As HTMLDocument 'this will hold the HTML document corresponding to the page
Dim toBeClicked As HTMLAnchorElement 'To be used to store the <a></a> element
Dim table As HTMLTable 'To be used to store the table element
Dim tableRow As HTMLTableRow 'To be used to store a row of the table element
Dim tableCell As HTMLTableCell 'To be used to store a cellof the table element

假设您已经使用 ie3 导航到感兴趣的网站,您可以将其 HTML 文档存储在 doc 中,如下所示:

Set doc = ie3.document

一旦您可以访问网页的 HTML 文档,您还可以通过多种方式访问​​其元素,其中一些方式比其他方式更有针对性。下面我以表格元素为例,演示最常用的方法。

    如果表具有唯一 ID,则可以使用 .getElementById() 方法访问它。此方法返回单个元素。在您的情况下,您所使用的表没有 ID。

    如果表属于某个类,则可以使用.getElementsByClassName() 方法访问它。这个方法返回一个元素的collection,所有这些元素都属于同一个类。要访问此集合的成员,您可以使用 (item index) 类型的符号。第一个成员的索引为0。在您的情况下,该表属于 "advancedSearch_table" 类,恰好只有一个成员。

    如果没有类或 ID,您可以使用 .getElementsByTagName 方法。此方法返回具有相同标签的所有元素的集合。在您的情况下,您将需要文档中的所有表格。要访问此集合的成员,您可以使用 (item index) 类型的符号。第一个成员的索引为0。 HTML 中的标签看起来像 &lt;tagName attribute="something"&gt;Something&lt;/tagName&gt;

下面我将演示所有三种方法。您可以使用前两种中的任何一种:

Set table = doc.getElementsByClassName("advancedSearch_table")(0)
Set table = doc.getElementsByTagName("table")(0)
Set table = doc.getElementById("ID of the table") 'only for demostration purposes, it doesn't apply to your case, as the table has no ID.

请记住,在您的情况下,文档中只有一个表格,并且只有一个元素属于 "advancedSearch_table" 类。这意味着您需要相应集合的第一个元素。这就是我使用0 作为索引的原因。

通过与上述相同的逻辑,现在表格已存储,您可以访问其行和单元格。更具体地说,您需要第 4 行的第 5 个单元格。这就是您要单击的链接所在的位置:

Set tableRow = table.getElementsByTagName("tr")(3)
Set tableCell = tableRow.getElementsByTagName("td")(4)

最后,既然感兴趣的单元格已存储,您可以访问锚元素并单击它。同样,单元格中只有一个锚元素,因此它将是相应集合中的第一个:

Set toBeClicked = tableCell.getElementsByTagName("a")(0)
toBeClicked.Click

奖金

如果你想一一点击所有的“完成”链接,你需要循环遍历相应的元素。这里有两种方法:

点击每行第5个单元格中的锚点:

For Each tableRow In table.Rows
    Set toBeClicked = tableRow.getElementsByTagName("td")(4).getElementsByTagName("a")(0)
    toBeClicked.Click
Next tableRow

遍历所有行和表格的所有单元格,找到您要查找的内部文本并单击相应的锚点:

For Each tableRow In table.Rows
    For Each tableCell In tableRow.Cells
        If tableCell.innerText = "Something" Then
            Set toBeClicked = tableCell.getElementsByTagName("a")(0)
            toBeClicked.Click
    Next tableCell
Next tableRow

【讨论】:

【参考方案3】:

在这里,一旦你点击完成的超链接,JavaScript 就会被执行并打开一个 Excel 文件,你可以在这里使用ie3.Navigate "javascript:openExcelFile('t83_Kerrfinancialadvisorsinc/455X3/ExportActivity_66260230820190703122002139.xlsx)"

由于是用超链接绑定的,你也可以试试

element.Click
element.FireEvent ("onclick") 

或者你可以使用execScript

Call ie3.document.parentWindow.execScript("your script in webpage", "JavaScript")

【讨论】:

我无法使用 javascript javascript:openExcelFile('t83_Kerrfinancialadvisorsinc/455X3/ExportActivity_66260230820190703122002139.xlsx,因为它不是 statc。每天都会生成一个新文件,因此该页面上会出现一个新的“已完成”按钮,用另一个 ajavascript 语句@arunv 我想我没有正确使用 getElementsByTagName("main_table_data_right_border main_table_data_bottom_border")(5) 你知道如何解决这个问题吗?或者公开另一段代码,该代码会点击此页面中的第一个“已完成”字词? 那么您可以先使用“.Innertext”从网页表中提取脚本名称,然后导航该脚本或尝试使用触发事件方法,如果可能,请分享网页的 url,它很难在没有看到的情况下提出建议那 尝试使用debug.print ie3.getelementbyId("idname").getElementsByTagName("tr")(index count).getElementsByTagName("td")(index).innertext 或使用不同的组合在即时窗口中获取“完成”文本,您可以通过反复试验自行探索 我真的很感谢你的努力,但我对 VBA 很陌生,我对 javasript 一无所知,所以我无法自己解决这个问题......我希望你能理解。你能给我更多关于这样做的细节,或者只是输入必须添加到我的代码中的句子吗?我会很感激的

以上是关于如何使用 <td> 和 <tr> 点击网页上的按钮?的主要内容,如果未能解决你的问题,请参考以下文章

CSS 如何实现一行表格的横向颜色渐变

如何使用 jQuery 修改属性 ROWSPAN?

Yii2:如何在一个TR内添加多个TD行?

如何使用 jquery 在 TR 内的点击事件上自动 SUM TD 值

使用 jquery 和 js 将 <td> 元素动态添加到 <tr> 元素中

vb 读取网页数据