Vba 点击IE中的图像按钮

Vba 点击IE中的图像按钮,vba,internet-explorer,web-scraping,Vba,Internet Explorer,Web Scraping,我正在做一个“自动化IE”项目,但在点击图像按钮时被绊倒了 我正在尝试从网站上假脱机一份excel报告,为此,我需要单击“生成”按钮(type=“submit”)``然后会出现一条消息(报告假脱机成功),然后只有我可以单击“下载”按钮(type=“image”)` 屏幕截图 下面是生成按钮HTML源代码 <td align="right"> <input type="submit" name="ctl00$ContentPlaceHolder1$btnGenerate" va

我正在做一个“自动化IE”项目,但在点击图像按钮时被绊倒了

我正在尝试从网站上假脱机一份excel报告,为此,我需要单击“生成”按钮
(type=“submit”)``然后会出现一条消息
(报告假脱机成功)
,然后只有我可以单击“下载”按钮
(type=“image”)`

屏幕截图

下面是生成按钮HTML源代码

<td align="right">
<input type="submit" name="ctl00$ContentPlaceHolder1$btnGenerate" value=" Generate "
onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$btnGenerate&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" 
id="ctl00_ContentPlaceHolder1_btnGenerate" tabindex="4" title="Click Here" class="dxbButton_Glass">
</td>
<td colspan="2">
<span id="ctl00_ContentPlaceHolder1_lblMsg" style="color:Blue;font-weight:bold;">Report Spooled Successfully</span>
</td>
Sub KBOSS_Brokerage_Process_Status()
    Set Browser = CreateObject("internetexplorer.application")
    Browser.Visible = false
    Browser.navigate ("my url")
    Set mymsg = Browser.document.getElementById("ctl00_ContentPlaceHolder1_lblMsg")
    For Each elem In mymsg.getElementsByTagName("span")
        If elem.innerText = " Report Spooled Successfully " Then Exit For
    Next elem
    Browser.document.getElementById("ctl00_ContentPlaceHolder1_lnkDownload").Click
    Browser.Quit
    Set Browser = Nothing
End Sub
使用我的代码,我可以点击
Generate
按钮,但在消息出现后点击
Download
按钮时遇到困难,我尝试循环直到满足条件,如果
Element.innertext=消息
则尝试循环,但运气不佳

下面是我的VBA代码

<td align="right">
<input type="submit" name="ctl00$ContentPlaceHolder1$btnGenerate" value=" Generate "
onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$btnGenerate&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" 
id="ctl00_ContentPlaceHolder1_btnGenerate" tabindex="4" title="Click Here" class="dxbButton_Glass">
</td>
<td colspan="2">
<span id="ctl00_ContentPlaceHolder1_lblMsg" style="color:Blue;font-weight:bold;">Report Spooled Successfully</span>
</td>
Sub KBOSS_Brokerage_Process_Status()
    Set Browser = CreateObject("internetexplorer.application")
    Browser.Visible = false
    Browser.navigate ("my url")
    Set mymsg = Browser.document.getElementById("ctl00_ContentPlaceHolder1_lblMsg")
    For Each elem In mymsg.getElementsByTagName("span")
        If elem.innerText = " Report Spooled Successfully " Then Exit For
    Next elem
    Browser.document.getElementById("ctl00_ContentPlaceHolder1_lnkDownload").Click
    Browser.Quit
    Set Browser = Nothing
End Sub
谢谢

交叉柱:

因此,这可能无法解决您的问题,但至少它引入了页面加载的适当等待,包括在每次单击事件之后,以及在文本出现之后的定时循环。我还添加了一个注释掉的FireEvent,以防触发
onclick
。您不需要将
浏览器
设置为“无”。子系统完成后,将对其进行处理。当对象变量通过超出范围释放其引用时,运行时调用目标对象的方法以减少对象的引用计数

Option Explicit

Public Sub KbossBrokerageProcessStatus()
    Dim browser As Object, t As Date, ele As Object, testValue As String
    Const MAX_WAIT_SEC As Long = 5

    Set browser = CreateObject("InternetExplorer.Application")
    With browser
        .Visible = True
        .navigate2 "myUrl"

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document

            .getElementById("ctl00_ContentPlaceHolder1_btnGenerate").Click '.FireEvent("onclick")

            While browser.Busy Or browser.readyState < 4: DoEvents: Wend

            Do
                DoEvents
                On Error Resume Next
                Set ele = .getElementById("ctl00_ContentPlaceHolder1_lblMsg")
                testValue = ele.innerText
                On Error GoTo 0
                If Timer - t > MAX_WAIT_SEC Then Exit Do
            Loop While testValue  <> "Report Spooled Successfully"

            If ele Is Nothing Or testValue  <> "Report Spooled Successfully"   Then Exit Sub

            .document.getElementById("ctl00_ContentPlaceHolder1_lnkDownload").Click

            While browser.Busy Or browser.readyState < 4: DoEvents: Wend

        End With

        .Quit
    End With
End Sub
选项显式
公共子KbossBrokerageProcessStatus()
Dim browser作为对象,t作为日期,ele作为对象,testValue作为字符串
常量最大等待时间=5秒
设置browser=CreateObject(“InternetExplorer.Application”)
带浏览器
.Visible=True
.navigate2“myUrl”
当.Busy或.readyState<4:DoEvents:Wend时
随附.文件
.getElementById(“ctl00\u内容占位符1\u btnGenerate”)。单击“.FireEvent(“onclick”)
browser.Busy或browser.readyState<4:DoEvents:Wend时
做
多芬特
出错时继续下一步
Set ele=.getElementById(“ctl00\u contentplaceholder 1\u lblMsg”)
testValue=ele.innerText
错误转到0
如果定时器-t>最大等待时间,则退出Do
在testValue“报告假脱机成功”时循环
如果ele为Nothing或testValue“报告假脱机成功”,则退出Sub
.document.getElementById(“ctl00\u内容占位符1\u lnkDownload”)。单击
browser.Busy或browser.readyState<4:DoEvents:Wend时
以
退出
以
端接头

单击“生成”按钮的代码在哪里?据我所知,在有时间限制的循环中单击“生成”后,您必须等待
ctl00\u contentplaceholder 1\u lnkDownload
出现,然后只单击它。什么是运气不好?你不需要一个循环,因为每个元素都有一个id。嗨,我不确定你怎么会在那一行出现这个错误。如果ele为Nothing,则可以分成两行,然后退出Sub:如果testValue“Report Spooled Successfully”,则退出Sub。。。。。。告诉我错误是否发生在这些行的第一行?嗨,QHarr,我已经按照您在前面的评论中提到的那样进行了编辑,没有出现任何错误,但单击下载按钮不会发生。。Browser.document.getElementById(“ctl00_contentplaceholder 1_lnkDownload”)。ClicktestValue=ele.innerText为空@Devendra,我可以看到您已删除了以前的注释。我用QHarr建议的代码做了一个测试,效果很好。我建议您再次进行测试,并对测试结果进行评论。它可以帮助我们了解您的问题的当前状态。