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

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

При помощи сканера окон удалось выявить только его класс - DirectUIHWND .
Подскажите, пожалуйста, есть ли какие-то способы работы с этим окном через VBA ?
...
Рейтинг: 0 / 0
08.07.2014, 18:15
    #38690969
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
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
09.07.2014, 00:54
    #38691274
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Hetzer3 Файл, который я хочу скачать, динамически обновляется на этом ресурсе каждый день, и постоянной прямой ссылки не имеет.ну ie же ее как-то получает? значит нужно повторить его действия в смысле запросы.
...
Рейтинг: 0 / 0
09.07.2014, 09:50
    #38691468
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Дмитрий, Анатолий, спасибо за ответы!

Дмитрий ,
как я понял, Ваш код - это, грубо говоря, лишь запуск браузера с использованием определенной ссылки на ресурс?
У меня это происходит вот так:
Код: 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
09.07.2014, 09:54
    #38691473
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Antonariy, прошу прощения за путаницу с именем.
...
Рейтинг: 0 / 0
09.07.2014, 11:55
    #38691695
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Добавлю так же, что при помощи FindWindowEx удалось найти дескриптор окна.
...
Рейтинг: 0 / 0
09.07.2014, 12:19
    #38691740
The_Prist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Hetzer3,

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

Hetzer3 уточню, что тот сайт, на который я лезу, это система отчетности, с которой я скачиваю ежедневные данные продаж товаров. Очевидной прямой ссылки на скачивание отчета я тут не вижу, к сожалению.Установите fiddler, выполните в браузере все действия, необходимые для скачивания, отследите в фиддлере адрес, с которого начинается скачивание. Наблюдение за отправляемыми браузером запросами даст ключ к пониманию, откуда берется ссылка.
...
Рейтинг: 0 / 0
09.07.2014, 16:15
    #38692136
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Antonariy, спасибо.
Я работаю с корпоративного ПК, и он мне не дает установить fiddler. Попробую дома.
...
Рейтинг: 0 / 0
14.07.2014, 11:28
    #38695738
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
В общем, с фиддлером так ничего и не вышло у меня. Какой-то полезной информации он не выдал, либо я не туда смотрю.
Получилось решить задачу лишь дурацким путем через 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
14.07.2014, 12:00
    #38695782
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Вызов окна "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
14.07.2014, 14:10
    #38695942
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Еще один непонятный момент:
решил использовать вместо 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
14.07.2014, 15:30
    #38696009
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
добро пожаловать в болото.
...
Рейтинг: 0 / 0
15.07.2014, 10:13
    #38696614
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Antonariy, спасибо)
...
Рейтинг: 0 / 0
17.07.2014, 13:28
    #38699005
Hetzer3
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с Internet Explorer (Программное сохранение файла)
Путем проб и ошибок получилось решить задачу:
(скрин окна загрузок 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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа с Internet Explorer (Программное сохранение файла) / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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