powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с Internet Explorer (Программное сохранение файла)
15 сообщений из 15, страница 1 из 1
Работа с Internet Explorer (Программное сохранение файла)
    #38689469
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, добрый день!
Прошу помочь мне с такой проблемой:

Делаю программку на VBA, которая лезет по ссылке на определенный сайт, "бегает" там по кнопочкам и в итоге нажимает на кнопку "сохранить файл". После этого внизу окна Интернет Эксплорера высвечивается дополнительное окно с кнопками Open, Save, Cancel (скрин прилагаю). И вот уже обратиться к этому окну у меня не получается. На диалоговое окно это не очень похоже.
Файл, который я хочу скачать, динамически обновляется на этом ресурсе каждый день, и постоянной прямой ссылки не имеет.

При помощи сканера окон удалось выявить только его класс - DirectUIHWND .
Подскажите, пожалуйста, есть ли какие-то способы работы с этим окном через VBA ?
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38690969
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hetzer3,

Я знаю только один способ, кот. точно работает (кажется с некоторыми издержками в виде возможно незавершенного процесса iexplorer.exe при каких-то ситуациях или нестандартных действиях со стороны юзера):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
      Dim TheBrowser
      On Error GoTo NoDown
      IfInternetPossible 'форсируем online-режим и продолжаем по-любому
      Set TheBrowser = CreateObject("InternetExplorer.Application")
      TheBrowser.Navigate m_urlToNavigate
NoDown:
      Set TheBrowser = Nothing
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38691274
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hetzer3 Файл, который я хочу скачать, динамически обновляется на этом ресурсе каждый день, и постоянной прямой ссылки не имеет.ну ie же ее как-то получает? значит нужно повторить его действия в смысле запросы.
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38691468
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий, Анатолий, спасибо за ответы!

Дмитрий ,
как я понял, Ваш код - это, грубо говоря, лишь запуск браузера с использованием определенной ссылки на ресурс?
У меня это происходит вот так:
Код: sql
1.
2.
3.
4.
5.
Dim Link As String

Set objIE = New InternetExplorer
Link = "https://сайт.com/ла-ла-ла.aspx"
objIE.Navigate Link



После того, как я попадаю на сайт под своим логином и паролем, я начинаю лазить по различным опциям (ставить/убирать галочки, фильтры и пр.) посредством objIE.Document.all(№) . Для того, чтобы понять, какой № имеет определенный элемент окна, на который нужно нажать, я использую окно Watches в редакторе своего кода. Но вот найти в Watches № кнопки Save, о которой я писал в первом сообщении, у меня не получается. Видимо, тут нужен другой подход.

Анатолий , уточню, что тот сайт, на который я лезу, это система отчетности, с которой я скачиваю ежедневные данные продаж товаров. Очевидной прямой ссылки на скачивание отчета я тут не вижу, к сожалению.

Т.е., по сути, программа у меня уже написана, всё работает как надо, во только теперь на кнопочку Save не могу понять как нажать =)
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38691473
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, прошу прощения за путаницу с именем.
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38691695
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлю так же, что при помощи FindWindowEx удалось найти дескриптор окна.
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38691740
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hetzer3,

Может имеет смысл посмотреть исходный текст HTML сгенерированной страницы и поискать там сгенерированную ссылку для скачивания?
К сожалению это лишь догадки, т.к. адреса сайта не знаю и проверить не могу. Но в свое время делал так.
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38691745
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hetzer3Добавлю так же, что при помощи FindWindowEx удалось найти дескриптор окна.Это путь в болото.

Hetzer3 уточню, что тот сайт, на который я лезу, это система отчетности, с которой я скачиваю ежедневные данные продаж товаров. Очевидной прямой ссылки на скачивание отчета я тут не вижу, к сожалению.Установите fiddler, выполните в браузере все действия, необходимые для скачивания, отследите в фиддлере адрес, с которого начинается скачивание. Наблюдение за отправляемыми браузером запросами даст ключ к пониманию, откуда берется ссылка.
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38692136
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, спасибо.
Я работаю с корпоративного ПК, и он мне не дает установить fiddler. Попробую дома.
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38695738
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, с фиддлером так ничего и не вышло у меня. Какой-то полезной информации он не выдал, либо я не туда смотрю.
Получилось решить задачу лишь дурацким путем через keybd_event , при помощи которой мы вызываем окно "View Downloads - Windows Internet Explorer" (см.скрин) нажатием клавиш Ctrl+J, и далее, при помощи всё той же keybd_event "нажимаем" на стрелочки клавиатуры и "добираемся" до кнопки "Save".
Очевидные минусы - окно "View Downloads - ..." должно быть активно, иначе keybd_event не сработает.

Я же пытаюсь решить задачу, не выводя IE из фонового режима.
Возможно ли как-то обойти окно подтверждения скачивания файла в момент нажатия на иконку xlsx - "скачать отчет в формате xlsx"?


Может кусочек html кода может что-то подсказать?
Код: html
1.
 <input type="image" name="ctl00$ContentPlaceHolder1$ucReport$btnXLSX" id="ctl00_ContentPlaceHolder1_ucReport_btnXLSX" title="Выгрузить в формате xlsx" class="actionL" src="../Client/Img/excel.png" alt="Выгрузить в формате xlsx" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$ContentPlaceHolder1$ucReport$btnXLSX&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" style="height:16px;width:16px;border-width:0px;" />



Или может быть с "View Downloads - ..." можно работать как с object?
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38695782
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вызов окна "View Downloads - Windows Internet Explorer":

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Const VK_J = &H4A  'J
Const VK_CONTROL = &H11 'Ctrl

Private Sub ... ()
...
Call keybd_event(VK_CONTROL, 0, 0, 0)     'Нажимаем Ctrl
Call keybd_event(VK_J, 0, 0, 0)       'Нажимаем J
Call keybd_event(VK_J, 0, WM_KEYUP, 0)   'Отпускаем J
Call keybd_event(VK_CONTROL, 0, WM_KEYUP, 0)  'Отпускаем Ctrl
...
End Sub
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38695942
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще один непонятный момент:
решил использовать вместо keybd_event другую функцию:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const VK_J = &H4A  'J
Const VK_CONTROL = &H11 'Ctrl
Const WM_KEYDOWN As Long = &H100

Private Sub ... ()
...
Call PostMessage(WinWnd, WM_KEYDOWN, VK_CONTROL, 0)
Call PostMessage(WinWnd, WM_KEYDOWN, VK_J, 0)
...
End Sub


Здесь WinWnd - идентификатор окна IE

Так вот при запуске программы, нажатие клавиш не срабатывает.
Перехожу в режим debug, жму Ctrl+F8 ( начиная со строки Call PostMessage(WinWnd, WM_KEYDOWN, VK_CONTROL, 0) ), и код срабатывает !
Но при нажатии F5 - код не срабатывает!
Почему так происходит?
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38696009
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добро пожаловать в болото.
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38696614
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, спасибо)
...
Рейтинг: 0 / 0
Работа с Internet Explorer (Программное сохранение файла)
    #38699005
Hetzer3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Путем проб и ошибок получилось решить задачу:
(скрин окна загрузок IE см. в предыдущих сообщ.)

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
Option Explicit
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hwndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlag As Long) As Long

Const VK_RETURN = &HD 'Enter
Const VK_CONTROL = &H11 'Ctrl (любая)
Const VK_RIGHT = &H27 'Стрелка вправо
Const VK_DOWN = &H28 'Стрелка вниз
Const VK_J = &H4A 'кнопка J
Const WM_KEYDOWN As Long = &H100
Const WM_SETFOCUS = &H7

Public WithEvents objIE As SHDocVw.InternetExplorer
Public objNewIE As Object


Private Sub CommandButton1_Click()
Dim Link As String
Dim WinWnd, WinWnd1, WinWnd2
Dim retValue As Long

...
Set objIE = New InternetExplorer
Link = "https://ссылка на страницу сайта с полями логин и пароль.aspx"
objIE.Navigate Link
objIE.Visible = False 'делаем IE невидимым
While objIE.Busy Or objIE.ReadyState <> 4
    DoEvents
Wend
WinWnd = FindWindow(vbNullString, "заголовок окна") 'определение хэндла окна
...
ввод логина, пароля и вход на сайт
...
нажатие на иконку "выгрузить отчет в формате xlsx"
...
While objIE.Busy
    DoEvents
Wend
    
'открытие окна загрузок IE путем нажатия клавиш Ctrl+J
Call PostMessage(WinWnd, WM_KEYDOWN, VK_CONTROL, 0)
Call PostMessage(WinWnd, WM_KEYDOWN, VK_J, 0)

'определение хэндла окна загрузок и хэндла его дочернего окна
WinWnd1 = FindWindow(vbNullString, "View Downloads - Windows Internet Explorer")
retValue = SetWindowPos(WinWnd1, -1, 0, 0, 0, 0, 2)
WinWnd2 = FindWindowEx(WinWnd1, 0, "DirectUIHWND", vbNullString)
retValue = SetWindowPos(WinWnd2, -1, 0, 0, 0, 0, 2)

'посылаем нажатие клавиш окну загрузок
Call PostMessage(WinWnd1, WM_SETFOCUS, 0, 0)
Call PostMessage(WinWnd2, WM_SETFOCUS, 0, 0)
Call PostMessage(WinWnd1, WM_KEYDOWN, VK_RIGHT, 0) 'направо (после этой строки окно активируется. скорее всего тут можно послать любой WM_KEYDOWN)
Call PostMessage(WinWnd2, WM_KEYDOWN, VK_RIGHT, 0) 'направо (переход с кнопки Open на кнопку Save)
Call PostMessage(WinWnd2, WM_KEYDOWN, VK_RIGHT, 0) 'направо (переход с Save на раскрывающийся список)
Call PostMessage(WinWnd2, WM_KEYDOWN, VK_DOWN, 0) 'вниз (открываем раскрывающийся список)
Call PostMessage(WinWnd2, WM_KEYDOWN, VK_DOWN, 0) 'вниз (переходим в раскрывающемся списке на кнопку SaveAs)
Application.Wait DateAdd("s", 1.5, Now) 'таймер на 1.5 сек. Без него почему-то корректно не срабатывает нажатие на Enter в следующей строке
Call PostMessage(WinWnd2, WM_KEYDOWN, VK_RETURN, 0)    'нажатие на Enter (активация кнопки Save As).
                                                       'После этого открывается диалоговое окно с выбором каталога сохранения файла.
        
...
    
End Sub
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с Internet Explorer (Программное сохранение файла)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]