0

我无法弄清楚如何使用 vba 自动单击位于网页中一组选项卡之一的按钮。

我在firefox中使用inspect元素来找出我想要单击的按钮的元素id(这是“runscreen”但是在查看实际网页的源代码时我找不到这个元素id,而且按钮与另一个共享这个元素id另一个选项卡上的按钮。两个按钮的“运行”与其内部文本相同,“运行屏幕”与其元素 ID 相同,但具有不同的元素隐藏。我无法弄清楚为什么通过检查按钮可以查看元素 ID 但不可见通过选择使用 ie 或 firefox 查看网页的源代码。我的 excel 版本是 2010,我使用的是 ie9。在我看来,网页代码中唯一隐藏的部分是处理选项卡中的元素的部分。我认为这可能与

img src="/images/new/ajax-loader-trans.gif"

我首先尝试了这段代码:

'IE.document.getElementById("runscreen").click

vba 返回了“需要对象”的错误,我猜是因为元素 id 不是直接在网页源代码上,而是以某种方式隐藏

然后我尝试了

Call IE.document.parentWindow.execScript("runscreen()", "JavaScript")

我认为单击按钮时页面以某种方式使用了一个功能,但我不知道是否是这种情况。我一直在寻找单击按钮的解决方案,但一直无法弄清楚。任何帮助将不胜感激。

这是我在使用 firefox 检查要单击的元素时找到的代码(但是当我在 ie/firefox 中选择查看源时,此代码不可见):

<a id="runScreen" class="general-button general-button-green help-enabled" href="javascript: void(jsScreen.runScreen(true));" onfocus="blur();" hid="screen-rules-run">
<span>
     Run 
</span>

而且这里更多的是周边代码(查看网页源代码时只能看到这段代码的第一行)

<div id="screentabcontent" class="tabs-nav-content ui-corner-bottom">
<div id="freeform-cont">
    <div class="vocab-ref"> … </div>
</div>
<div id="screen-criteria-section">
    <div id="commonCont">
        <div id="commonButtons" style="padding-bottom:4px; float:left; "> … </div>
        <div style="text-align:right">
            <span class="parameterTitle"> … </span>
            <span class="parameterValue"> … </span>
            <span style="padding-left: 10px">
                <a id="runScreen" class="general-button general-button-green help-enabled" href="javascript: void(jsScreen.runScreen(true));" onfocus="blur();" hid="screen-rules-run">
                    <span> … </span>
                </a>
            </span>
            <span style="padding-left: 5px"> … </span>
            <span id="universeTotal" class="universe-subtotal"> … </span>
        </div>
        <div id="commonRules" style="clear:both; zoom: 1"> … </div>
    </div>

这是当我在 ie/firefox 中选择查看源时可见的选项卡的代码,我尝试单击的按钮位于"rules"具有元素 id 的选项卡中"scrtab_1"。此代码的最后一部分与上述代码的第一部分部分匹配:

<div id="screentabs" style="zoom: 1;">


            <div class="tabs-nav">
                <table cellpadding="0" cellspacing="0" border="0"><tr>
                    <td class="toggle-width"><a href="javascript:void(jsScreen.toggleWide());" onfocus="blur()"><img id="toggleScrWidth" src="/images/new/width-wide.gif" width="16" height="16" border="0" title="Toggle Display Width" alt=""/></a></td>
                    <td ><a id="scrtab_0" class="scr-tab-link help-enabled" hid="screen-about-user" href="javascript: void(0);" onfocus="blur()">About</a></td>
                    <td ><a id="scrtab_5" class="scr-tab-link help-enabled" hid="screen-notes" href="javascript: void(0);" onfocus="blur()">Notes</a></td>

                        <td ><a id="scrtab_7" class="scr-tab-link help-enabled" hid="screen-notes" href="javascript: void(0);" onfocus="blur()">Main Settings</a></td>

                    <td class="on"><a id="scrtab_1" class="scr-tab-link help-enabled" hid="screen-rules" href="javascript: void(0);" onfocus="blur()">Rules</a></td>

                        <td ><a id="scrtab_6" class="scr-tab-link help-enabled" hid="screen-hedge" href="javascript: void(0);" onfocus="blur()">Hedge Rules</a></td>
                        <td ><a id="scrtab_2" class="scr-tab-link help-enabled" hid="screen-results" href="javascript: void(0);" onfocus="blur()">Results</a></td>
                        <td ><a id="scrtab_3" class="scr-tab-link help-enabled" hid="screen-backtest" href="javascript: void(0);" onfocus="blur()">Backtest</a></td>
                        <td ><a id="scrtab_4" class="scr-tab-link help-enabled" hid="screen-advancedbacktest" href="javascript: void(0);" onfocus="blur()">Advanced Backtest</a></td>

                </tr></table>
            </div>


            <div id="screentabcontent" class="tabs-nav-content ui-corner-bottom"><div align="center"><img src="/images/new/ajax-loader-trans.gif" alt="loading"></div></div>
        </div>
    </div>

</div>


4

1 回答 1

0

您需要遍历具有 id runScreen 的每个元素,然后使用位于锚元素内的类名找到正确的元素,如下所示(未经测试)

Dim elementcollection as htmlelementcollection

Set htmlelementcollection=Ie.Document.GetElementById("runScreen").GetElementsByTagName("a")

Dim element as htmlelement

For Each element In elementcollection
                Dim Str As String = element.GetAttribute("className")
                If element.GetAttribute("className") = "general-button general-button-green help-enabled" Then
                    element.InvokeMember("Click")
    Do Until Ie.readyState = 4
    DoEvents
    Loop
                    Exit For
                End If
 Next
于 2013-09-24T12:31:11.777 回答