Активное окно IE 11 для SendKeys

Проблема: я пытаюсь автоматизировать сохранение файла (у меня получается сохранить файл, когда внизу страницы появляется панель IE ниже)

Мой код отправляется в мою интрасеть, щелкая здесь и там, а затем я нажимаю кнопку «Экспорт», которая запускает это из IE: введите здесь описание изображения

Мне не удалось найти способ автоматизировать сохранение файла, потому что единственный способ (я думаю) взаимодействовать с этим «окном» — использовать SendKeys. Для этого мне нужно «активировать» это окно (да, я активировал его для очистки HTML с помощью этого фрагмента кода, но это не активное окно): введите здесь описание изображения

Я пытался использовать AppActivate, но по какой-то причине это не работает.

Есть 2 варианта преодоления этого препятствия:

  • Найдите способ активировать окно IE, содержащее эту панель сохранения, чтобы я мог использовать на нем Application.SendKeys "%{S}"
  • (только второй вариант): отключить эту панель сохранения или открыть ее в новом окне.

До сих пор я просмотрел множество сообщений, посвященных этой теме, но ни один из них не дал оперативного решения этой проблемы в IE 11.

Дайте мне знать, если вы хотите увидеть какой-либо фрагмент кода, у меня есть много разных попыток, собранных из разных сообщений, но это значительно увеличило бы длину этого сообщения.


person Seb    schedule 12.04.2017    source источник
comment
Это может быть проблема XY. Чего вы пытаетесь достичь? Является ли целью вашего кода загрузка чего-либо с внутреннего веб-сайта?   -  person David Rushton    schedule 12.04.2017
comment
Да, я пытаюсь автоматизировать процесс загрузки этого файла .xls, как вы можете видеть на картинке выше. Я обновлю пост, чтобы было понятнее   -  person Seb    schedule 12.04.2017
comment
Всегда ли окно IE, содержащее эту панель сохранения, имеет один и тот же заголовок рядом с логотипом IE? Всегда ли загрузка имеет один и тот же URL-адрес?   -  person David Rushton    schedule 12.04.2017
comment
URL-адрес и заголовок окна IE всегда одинаковы, да, и URL-адрес (скрытая часть) панели загрузки также одинаков. Меняется только номер отчета (он же имя файла)   -  person Seb    schedule 12.04.2017
comment
Просто протестируйте IE11 и отправьте ключи. %{S} работал на меня. Вы сказали, что AppActivate не работает. Это вызвало ошибку?   -  person David Rushton    schedule 12.04.2017
comment
Когда я отправляю этот ключ, ничего не происходит, поэтому он просто пропускается. Затем с AppActivate TitleOfMyPage я получаю ошибку времени выполнения 5, хотя я принял меры предосторожности, чтобы убедиться, что это правильный заголовок, поместив его в условие If   -  person Seb    schedule 12.04.2017
comment
Был также кто-то, кто предложил отправить SendKeys "{F6}", True SendKeys "{TAB}", True SendKeys "{ENTER}", True, хотя я не помню пост. Но опять же работает только когда вручную активирую окно   -  person Seb    schedule 12.04.2017


Ответы (1)


Фронтенд-автоматизация — сложный бизнес. Может быть действительно сложно найти решение, которое всегда работает (эти надоедливые пользователи могут свободно перемещать мышь и нажимать кнопки по своему желанию, нарушая работу вашего кода). Поскольку вы берете данные с сайта интрасети, можно предположить, что нужные вам данные уже существуют в вашей организации. Если это вообще возможно (и я знаю, что это не всегда), берите данные с серверов/исходных систем, а не через пользовательский интерфейс.

AppActivate и SendKeys могут быть очень суетливыми. Поскольку URL-адрес всегда один и тот же, лучшим подходом будет его прямая загрузка. Вот пример, основанный на другом ответе< /а>.

Прежде чем вы сможете запустить код, вам нужно будет добавить две ссылки:

  1. Microsoft XML, версия 6.0
  2. Библиотека объектов данных Microsoft ActiveX 2.8

В VBA IDE нажмите Инструменты >> Ссылки... и выберите из списка (исходный ответ не использует ссылки, вместо этого используется позднее связывание).

' 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 
person David Rushton    schedule 12.04.2017
comment
Извините за все вопросы, но такая автоматизация намного сложнее, чем вы ожидаете! - person David Rushton; 12.04.2017
comment
Да я до сих пор в замешательстве, если честно. Я снова попытался отправить F6 + Tab + Enter, но на этот раз с Application.Wait Now + TimeSerial(0, 0, 1) до и после, и это тоже работает ... кажется, что это случайно - person Seb; 12.04.2017
comment
Это довольно часто. Коду очень легко опередить пользовательский интерфейс. Проблема в том, что время ожидания разное. Иногда Windows требуется полсекунды, чтобы обновить экран. Иногда 3. Этого нельзя предугадать. Если вы установите слишком низкое значение ожидания, иногда оно будет срабатывать слишком рано. Если вы установите слишком высокое значение, пользователь успеет начать кликать. Боюсь, SendKeys никогда не сможет быть пуленепробиваемым. - person David Rushton; 12.04.2017