Попытка остановить цикл при появлении определенного дочернего окна
Я пытаюсь автоматизировать процесс, который включает в себя запуск извлечений из большой базы данных. По причинам, не зависящим от меня, я не могу просто получить доступ к базе данных и выполнить запросы, чтобы получить информацию. Мне нужно запустить серию отчетов через веб-интерфейс. Это очень трудоемкий ручной процесс, поэтому моя цель-автоматизировать его для ежедневного запуска в 12:01 утра.
Я получил большую часть навигации вниз, но сохранить отчет очень проблематично. После выбора пункта экспорт появляется всплывающее окно html, в котором отображается количество экспортированных записей. Как только это будет сделано, вы должны нажать кнопку Загрузить в том же окне, в котором отображается окно "загрузка файла" из браузера. Я хочу нажать кнопку "Сохранить". Появится диалоговое окно "Сохранить как", и я хочу отредактировать имя файла в единственном текстовом поле в окне, прежде чем нажать кнопку" ОК".
То, что мы сделали до сих пор, - это получить дескриптор главного окна IE и максимизировать его. Всплывающее окно html всегда центрировано в окне IE, поэтому я могу переместить курсор в нужное место. У меня есть свой код, который нажимает кнопку загрузки 1 раз каждые 5 секунд, пока не появится окно "загрузка файла".
Проблема в том, что использование FindWindowEX всегда возвращает значение, даже если окно загрузки файла не открыто. Хуже того, я не знаю, как использовать это значение, чтобы проверить имя окна или что, черт возьми, оно возвращает. Я включил некоторые выходные данные из приложения после моего "кода".
Я знаю, что код, написанный в настоящее время, выйдет в зависимости от времени, чтобы каким-то образом избежать этих бесконечных циклов.
Спасибо, что дочитали до этого места.
Что я уже пробовал:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long OpenRet = FindWindow(vbNullString, "SalesNumReg") If OpenRet.ToInt64 > 0 Then pRight = (Screen.PrimaryScreen.Bounds.Width) / 2 pBottom = (Screen.PrimaryScreen.Bounds.Height) / 2 'Will keep everything in a loop until the File Download child window appears or 2 minutes have passed While myCount < 24 Await System.Threading.Tasks.Task.Delay(5000) 'Wait for the export to complete Cursor.Position = New Point(pRight - 40, pBottom + 25) 'Place cursor on D/L button LeftClick() 'Click download ChildRet = FindWindowEx(OpenRet, IntPtr.Zero, "File Download", vbNullString) myCount += 1 Debug.Print(myCount & vbTab & ChildRet) End While End If
Отладочный Вывод
<br /> 1 2382793880966791168<br /> 2 2382796518076710912<br /> 3 2382797209566445568<br /> 4 2382797763617226752<br /> 5 2382799099352055808<br /> 6 2382799795136757760<br /> 7 2382800349187538944<br /> 8 2382801040677273600<br /> 9 2382801981275111424<br /> 10 32651964881829888<br /> 11 32652007831502848<br /> 12 30399774226120704<br /> 13 30400457125920768