【问题标题】:Using VBA & IE I need to click a certain text on the page使用 VBA & IE 我需要点击页面上的某个文本
【发布时间】:2020-02-20 19:50:36
【问题描述】:

这是我可以看到的 HTML 以及宏和目标的部分内容:

<a class="Ligne0 OrderNo" style="width: 100%; height: 100%; display: block;">20190180963865</a>

    MsgBox IE.document.Url
    Dim element As IHTMLElement
    Dim elements As IHTMLElementCollection
    Dim HTML As HTMLDocument

    Set HTML = IE.document

    Set elements = HTML.getElementsbyclassname("Ligne0 OrderNo")

    Dim Count As Long
    Dim erow As Long
    Dim BOO

    Count = 0

    For Each element In elements

        If element.classname = "Ligne0 OrderNo" Then

            erow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

            Cells(erow, 1) = HTML.getelementsbytagname("a")(Count).innertext

            BOO = HTML.getelementsbytagname("a")(Count).innertext

            Count = Count + 1

        End If

    Next element

    Range("A2:B11").Select
    Columns("A:A").EntireColumn.AutoFit
    Columns("B:B").ColumnWidth = 36

    MsgBox BOO

End Sub

Ligne0 OrderNO 类在正文中是唯一的。我需要用我创建的数组交叉检查“20190180963865”,找到后能够单击将我带到另一个页面的元素。

我尝试过的: ** MSGBOX.ie.document.url 给了我正确的 URL。我在此处裁剪了宏的顶部以节省空间。

MSGBOX BOO 应该给我“20190180963865”,但什么也没给我。我添加了 .innertext 和 .value 但随后 msgbox 没有出现。

然后使用 BOO,我希望能够在 IE 上单击文本

** 我已经勾选了“references Microsoft internet control”和“Microsoft HTML object library”

【问题讨论】:

  • 如果您通过类名获取元素,并且您的元素的类在页面上是唯一的,那么您的元素集合中应该只有一个元素。为什么你需要按标签获取元素?你可以检查innertext并点击它

标签: html excel vba internet-explorer controls


【解决方案1】:

你说 msgbox Boo 什么也没返回。可能的原因是您正在循环中设置该变量,并且您正在获取循环外的值。因此,当您尝试获取当时的值时,它可能会被替换为空值。

根据您上面的代码,我开发了这个示例,它循环浏览网页上的所有链接并匹配其内部文本和类名,然后单击链接。

VBA 代码:

Sub demo()

    Dim i As Long
    Dim URL As String
    Dim IE As Object

    Set IE = CreateObject("InternetExplorer.Application")

    IE.Visible = True

    URL = "D:\Backup20190913\tests\295.html"

    IE.Navigate URL


    Do While IE.readyState = 4: DoEvents: Loop   'Do While
    Do Until IE.readyState = 4: DoEvents: Loop   'Do Until

    Set Alllinks = IE.document.getElementsByTagName("A")

    For Each Hyperlink In Alllinks
        If Hyperlink.innerText = "20190180963865" And Hyperlink.className = "Ligne0 OrderNo" Then
            Hyperlink.Click


        End If
    Next Hyperlink

    'Unload IE
    'Set IE = Nothing


End Sub

示例 HTML 代码:

<!doctype html>
<html>
<head>
<script>
function abc()
{
alert("clicked...");
}
</script>
</head>
<body>
<a class="Ligne0 OrderNo" style="width: 100%; height: 100%; display: block;" onclick="abc()">20190180963865</a>

</body>
</html>

输出:

此外,您可以根据自己的要求修改示例。你只需要从工作表中获取你的值并在上面的代码中匹配它。

如果您在应用此建议时遇到任何困难,请告诉我们。

【讨论】:

  • 不知道为什么当类是唯一的时候你需要按标签名拉取页面上的所有元素?
  • 这只是一个循环链接并匹配其内部文本和类名的示例。如果 op 没有任何理由,那么 op 肯定可以直接点击带有类名的元素而无需循环。
【解决方案2】:

您不需要循环,并且该类已经用于感兴趣的 a 标记,因此您不想在已经处于正确级别时尝试按 tagName 进行选择。 querySelector 返回单个节点;第一个匹配指定选择器的节点——在这种情况下,它是感兴趣元素的复合类名(复合类由“.”连接,“.”代表一个 css 类选择器)。

Dim BOO As String, element As Object

Set element = HTML.querySelector(".Ligne0.OrderNo")

If Not element Is Nothing Then
    BOO = element.innerText
    'do whatever else when element is found
End If

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 2010-10-31
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多