【问题标题】:VBA Click HoverMenu Link in IE, Without ID TagIE中的VBA单击HoverMenu链接,没有ID标签
【发布时间】:2017-03-06 06:52:39
【问题描述】:

我只是无法让 VBA 成功单击下拉悬停菜单中的一个链接(没有 ID 标签)。具体来说,我正在使用 VBA 登录网站并导航到从数据库返回信息的特定页面。

这是带有链接的 HTML 菜单:

</head>

<body>
  <script type="text/javascript" src="/APBKIS/js/struts-menu/coolmenu4-config.js"></script>
  <div>
    <ul id="primary-nav" class="menuList">
      <li class="menubar">
        <a href="javascript:void(0)" title="Service" target="_self">Service</a>
        <ul>
          <li class="menubar">
            <a href="javascript:void(0)" title="Reports" target="_self">Reports</a>
            <ul>
              <li>
                <a href="declRetrieval?asType=AIR" title="Formal Entries" target="_self">FormalEntries</a>
              </li>
              <li class="last">
                <a href="declRetrieval?asType=BRIEF" title="InformalEntries" target="_self">InformalEntries</a>
              </li>
            </ul>
        </ul>
        </li>
        <li class="menubar">
          <a href="javascript:void(0)" title="UserData">UserData</a>
          <ul>
            <li>
              <a href="CustProf!Approve" title="ChangeUserData">Change User Data</a>
            </li>
            <li class="last">
              <a href="CustProf!ChgPwd" title="ChangePassword">Change Password</a>
            </li>
          </ul>
        </li>
    </ul>
  </div>
</body>

</html>

我正在尝试单击下拉菜单上的 InformalEntries 项。

这是我当前 VBA 代码的一部分:

Sub ReportCall()

Dim IE As InternetExplorer
Dim html As HTMLDocument
Dim link As Object
Dim ElementCol As Object

Application.ScreenUpdating = False

Set IE = New InternetExplorer
IE.Visible = True

IE.navigate "https://somesite.com"

Do Until Not IE.Busy And IE.readyState = 4
    DoEvents
Loop

Set html = IE.document
html.getElementById("usrId").Value = "usernameabc"
html.getElementById("usrPwd").Value = "passwordabc"

'Click the "submit" button
html.getElementById("Image15").Click

Do Until Not IE.Busy And IE.readyState = 4
    DoEvents
Loop

'html.getElementById("myThis").Click
Set ElementCol = html.getElementsByTagName("a")
For Each link In ElementCol
    If link.innerHTML = "InformalEntries" Then
        link.Click
    End If
Next link

我一直试图通过下拉菜单 (InformalEntries),没有任何反应,excel 中也没有返回错误。

注意手动单击该链接时不会导航到新网页。我认为它正在调用一个javascript函数,然后使用php将数据/信息返回到当前页面。查看 html 代码,我认为这是单击时调用的函数:

function viewPerm(actionUrl) {
  jQuery.ajax({
    type: "POST",
    url: actionUrl,
    data: null,
    dataType: "html",
    success: function(divDetail) {
      ScreenConvert();
      ShowDialog(divDetail, 700, 500);
    },
    error: function(req, status, error) {}
  });
}
/*]]>*/
<
/script>

如果您有任何建议和帮助,我将不胜感激。

谢谢。

【问题讨论】:

  • 网站是否公开?可以发个网址吗?您的 doevents 循环并不能保证 html 已准备就绪。要对此进行测试,请尝试手动加载页面,然后仅从此时开始运行您的应对 - html.getElementsByTagName("a")
  • 您好,很遗憾,我无法发布该 URL,因为它不是公开的。它需要用户名和密码。我尝试在触发点击操作之前添加一个 10 秒的等待计时器,但没有任何反应。我还尝试了您等待页面手动加载的建议,但再次没有任何反应。只是为了澄清一下,上一个链接点击(可以正常工作)实际上加载并导航到新页面。但是,我卡住的这个链接(link.innerHTML = "InformalEntries")在单击时不会加载新页面 - 它调用一个函数并将报告/数据获取到当前页面。
  • 等待计时器无法工作,因为它在同一个线程上
  • 要明确,除了获取现有的 NOT NEW IE 之外,您的代码以 Set ElementCol ... 开头。
  • 正确 - 在 Set ElementCol 之前运行良好。

标签: javascript html excel vba click


【解决方案1】:

当你这样做时:

 Set html = IE.document

它仅在您触发导航到另一个页面之前有效:一旦页面重新加载,您对上一个文档的引用就不好了,您需要通过再次运行该行来重置它。

【讨论】:

  • 嗨蒂姆,感谢您的评论。我尝试添加参考,但仍然没有任何反应,它只是不会点击。最后我只是删除了引用。
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多