我尝试以许多不同的方式点击 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
但是它们似乎都不起作用。当我调试代码并遍历此部分和这一特定行时,实际上什么也没有发生。因此未单击该按钮。
有人可以帮我吗?
非常感谢! :)
答案 0 :(得分: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>
这样的结果。
答案 1 :(得分:0)
在这里,一旦单击完整的超链接Java脚本就会执行并打开一个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")
答案 2 :(得分:0)
我看到您对如何访问HTML元素有点困惑,因此我将借此机会以非常详细的方式演示这样做的逻辑,我也认为这非常直观。还有其他方法,但是我相信以下方法是最全面,最直观的方法,非常适合初学者。
首先,我将继续假设ie3
是InternetExplorer
对象。
使用此对象导航到页面时,可以使用包含ie3.document
对象的HTML document
访问该页面的html。
要充分利用HTML document
对象,您应该添加对Microsoft HTML Object Library
的引用。该库将允许您使用许多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文档,您还可以通过多种方式来访问其元素,其中某些方式比其他方式更具针对性。下面,我以table元素为例,演示最常用的方法。
如果表具有唯一的ID,则可以使用.getElementById()
方法来访问它。此方法返回单个元素。就您而言,您要查找的表没有ID。
如果表属于一个类,则可以使用.getElementsByClassName()
方法来访问它。此方法返回元素的集合,所有元素都属于同一类。要访问此集合的成员,您可以使用(item index)
这种表示法。第一个成员的索引为0
。在您的情况下,该表属于"advancedSearch_table"
类,该类恰好只有一个成员。
.getElementsByTagName
方法。此方法返回所有具有相同标签的元素的集合。在您的情况下,您将需要文档中的所有表。要访问此集合的成员,您可以使用(item index)
这种表示法。第一个成员的索引为0
。 HTML中的标签看起来像<tagName attribute="something">Something</tagName>
。 下面,我演示所有三种方法。您可以使用前两个之一:
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
奖励
如果要一个接一个地单击所有“已完成”链接,则需要循环浏览相应的元素。这是两种方法:
单击每行第五个单元格中的锚点:
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