【问题标题】:Active IE 11 window for SendKeysSendKeys 的活动 IE 11 窗口
【发布时间】:2017-04-12 11:48:41
【问题描述】:

问题:我正在尝试自动保存文件(当页面底部出现下面的 IE 栏时管理保存文件)

我的代码在我的 Intranet 上运行,单击此处和此处,然后单击“导出”按钮,该按钮将从 IE 触发此操作:

我没有设法找到自动保存文件的方法,因为(我认为)与此“窗口”交互的唯一方法是使用 SendKeys。 为此,我必须“激活”这个窗口(是的,我用这段代码为 HTML 抓取激活了它,但它不是活动窗口):

我尝试使用AppActivate,但由于某种原因它不起作用。

有两种方法可以通过这个障碍:

  • 找到一种方法来激活包含该保存栏的 IE 窗口,以便我可以在其上使用 Application.SendKeys "%{S}"
  • (仅第二个选项):禁用此保存栏或设法在新窗口中打开它

到目前为止,我已经浏览了很多关于该主题的帖子,但没有一个针对 IE 11 上的该问题提供可操作的解决方案。

如果您想查看任何代码,请告诉我,我从不同的帖子中收集了很多不同的尝试,但这会大大增加这篇帖子的长度。

【问题讨论】:

  • 这可能是XY problem。你想达到什么目的?您的代码的目的是从内部网站下载内容吗?
  • 是的,我正在尝试自动执行此 .xls 文件的下载过程,如上图所示。我会更新帖子以使其更清晰
  • 包含该保存栏的 IE 窗口是否总是在 IE 徽标旁边具有相同的标题?下载是否始终具有相同的 URL?
  • IE 窗口的 URL 和 Title 总是一样的 yes,下载栏的 URL(隐藏部分)也是一样的。只有报告编号不同(又名文件名)
  • 只测试IE11并发送密钥。 %{S} 为我工作。你说 AppActivate 没有用。是否引发错误?

标签: windows vba excel internet-explorer sendkeys


【解决方案1】:

前端自动化是一项棘手的业务。很难找到始终有效的解决方案(那些讨厌的用户可以随意移动鼠标和单击按钮,从而破坏您的代码)。因为您从 Intranet 站点获取数据,这表明您需要的数据已经存在于您的组织中。如果可能(我知道并非总是如此)从服务器/源系统获取数据,而不是通过 UI。

AppActivate 和 SendKeys 可能非常繁琐。因为 url 总是相同的,所以更好的方法是直接下载它。这是一个示例,基于另一个 answer

在您可以运行代码之前,您需要添加两个引用:

  1. 微软 XML,v6.0
  2. Microsoft ActiveX 数据对象 2.8 库

在 VBA IDE 中单击 Tools >> References... 并从列表中选择(原始答案不使用引用,而是使用后期绑定)。

' Downloads a file from a given URL.
'   URL     String      URL to get file.  Ex: http:\\MySite\MyFile.
'   Path    String      Location to save file.  Ex: C:\Myfile.csv.
' Requires: Microsoft XML, v6.0
' Requires: Microsoft ActiveX Data Objects 2.8 Library.
Sub DownloadURL(ByVal URL As String, ByVal Path As String)
    Dim httpXML As XMLHTTP60            ' Used to download data.
    Dim st As ADODB.Stream              ' Used to write downloaded data to file system.
    Set httpXML = New XMLHTTP60

    ' Request file.
    httpXML.Open "GET", URL, False
    httpXML.send

    ' Download response.
    If httpXML.Status = 200 And httpXML.readyState = 4 Then

        Set st = New ADODB.Stream
        st.Open
        st.Type = adTypeBinary
        st.Write httpXML.responseBody
        st.SaveToFile Path, adSaveCreateOverWrite
        st.Close
    Else

        MsgBox "Something went wrong :(", vbCritical, "An error occured"
    End If
End Sub 

【讨论】:

  • 抱歉所有问题,但这种自动化比你想象的要困难得多!
  • 是的,老实说我还是很困惑。我再次尝试发送 F6 + Tab + Enter 但这一次之前和之后使用 Application.Wait Now + TimeSerial(0, 0, 1) 并且它也可以工作......似乎它是随机的
  • 这很常见。代码很容易超越 UI。问题是等待时间不同。有时 Windows 需要半秒钟来更新屏幕。有时 3. 你无法预测这一点。如果您将等待设置得太低,有时它会过早触发。如果设置得太高,用户就有时间开始点击。恐怕 SendKeys 永远无法防弹。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
相关资源
最近更新 更多