【问题标题】:Prompt when `elementId` not found找不到`elementId`时提示
【发布时间】:2020-11-01 03:57:39
【问题描述】:

我有通过点击elementId 浏览网页的 VBA 代码。

当找到elementId 时,它会提供所需的结果。

我的问题是,没有找到elementId时没有错误提示。代码一直持续到最后。


例如代码:

Ie.visible = True
Ie.navigate "www.abc.com"

Ie.document.getElementbyId("btk").click

在这里,我尝试点击按钮btk

但该按钮在网页上不可用。
我原以为我的代码会崩溃,但它会一直持续到最后。
代码中没有使用错误处理。

【问题讨论】:

  • 你需要遍历所有对象并测试btk的id。如果找到,请点击它,如果没有,请执行其他操作。
  • 如果需要,您能否帮我完善代码,这是我根据您的建议编写的 ``` Dim htmla as mshtml.ihtmlelement Dim htmlas as mshtml.ihtmlelementcollection For each htmla in htmlas If htmla .getattribute(“id”) = “btk” 然后 Htmla.click Exit for Else exit sub Next htmla ``
  • 如果您将该代码放在实际问题中会更好。在 cmets 中阅读代码非常困难。但是,如果 id 与“btk”不匹配,您似乎正在退出 sub。如果 id 不是“btk”,那肯定会在第一个元素上失败。只需完全删除 Else exit sub

标签: vba internet-explorer web-scraping runtime-error


【解决方案1】:

据我了解,您想在调用点击事件之前检查网页中代表按钮btkelementId是否真的存在。

这样做的一种方法是创建一个对象(我将其称为 buttonElement)并尝试将其设置为 ID 为 btk 的按钮(使用 getElementById("btk"),如果网页中不存在该对象,则buttonElement 将是 Nothing,但如果存在,对象将获得对该按钮的引用

Dim buttonElement As HtmlElement
Set buttonElement = Ie.document.getElementById("btk")
'
If Not (buttonElement Is Nothing) Then
    buttonElement.click
Else:
   '
   'Do something else, buttonElement with id btk not found
End If

【讨论】:

  • 我期待 vba 在没有 if 语句的情况下自行返回错误。
  • 例如当我们使用电子表格时。如果我们引用工作簿中不存在的电子表格,vba 会返回一些错误。当我的代码与网页交互时,我期待同样的事情发生
  • @Anand 记住使用vba 来控制IE 就像一个变通方法,如果你点击的元素是nothing 并且vba 没有提示错误那不是你的错。但最好的做法是查看元素是否为nothing(在VBA 中,对象默认值为nothing 而不是null)。使用if 语句,您可以触发MsgBox 或引发自定义错误
  • 另外,错误可能没有被触发,因为您正在使用元素的 click 方法。在尝试将文本设置为输入元素的情况下,您可以获得Automation Error。因此,始终建议在调用其他过程之前检查对元素的引用是否为“无”
  • I was expecting vba to return error on it's own without the if statement - 在这种情况下它不是这样工作的。使用外部库对象并不总是与使用 Excel 的对象模型一样。
【解决方案2】:

我建议尝试使用可能有助于解决此问题的最新更新来更新您的 Windows 操作系统和 MS Office。

我已经在带有 MS Office 2016 的 Windows 10 操作系统上使用简单代码测试了该问题。

如果代码在页面上找不到元素,我可以看到它正在生成错误。

测试代码:

Sub demo()

    Dim i As Long
    Dim URL As String
    Dim IE As Object
    
    Set IE = CreateObject("InternetExplorer.Application")
     
    IE.Visible = True
    
    URL = "http://localhost/86.html"
   
    IE.Navigate URL
  
    Do While IE.ReadyState = 4: DoEvents: Loop
    Do Until IE.ReadyState = 4: DoEvents: Loop
 
    IE.document.getElementById("abc").Click
    
    Set IE = Nothing
    
End Sub

输出:

【讨论】:

    【解决方案3】:

    感谢@Scott Holtzman、@tdmsoares、@Deepak-MSFT 回复我的问题。

    不幸的是,应用程序和操作系统的升级不在我的控制范围内,所以我选择使用 if 语句。

    使用 if 语句,我在未找到按钮时引发自定义错误以获取运行时错误。

    当我知道需要点击的elementid时,使用下面的方法。

    Dim buttonElement As HtmlElement
    Set buttonElement = Ie.document.getElementById("btk")
    
    If Not (buttonElement Is Nothing) Then
        buttonElement.click
    Else:
       Err.raise vbObjectError+515,,”The sign in button was not found"
       
    End If
    

    当需要通过元素搜索找到要点击的按钮时,使用下面的方法

    Dim htmla as mshtml.ihtmlelement
    Dim htmlas as mshtml.ihtmlelementcollection
    
    Signin= 0
    For each htmla in htmlas
    If htmla.getattribute(“classname”) = “hero_button" Anand htmla.innertext =”Sign in" then
    signin= signin+1
    Htmla.click
    Exit for
    Next htmla
    If signin<>1 then
    Err.raise vbObjectError +515,,” The sign in button was not found"
    End if
    ```
    
    
    
    

    【讨论】:

    • 感谢您发布此问题的解决方案。我建议你尝试在 48 小时后标记你自己对这个问题的答案,当它可以标记时。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。
    • 如何将此标记为已解决或已回答。我没有看到标记它的选项
    • 你的答案旁边会有一个对勾图标。单击它以将其标记为答案。见这里:imgur.com/a/7fRzBRd
    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2019-06-15
    • 1970-01-01
    • 2015-12-24
    • 2022-11-26
    相关资源
    最近更新 更多