2015-08-23 3 views
2

Я пытаюсь автоматизировать свои ежедневные задачи скриптом VBA, автоматически входить в мой банковский счет и возвращать некоторые данные с веб-сайта. Однако я не могу написать такой макрос, который мог бы войти на этот сайт - https://online.mbank.pl/pl/Login.Войти на защищенный сайт https с помощью VBA

Я написал следующий макрос, который хорошо работает с «нормальными» таких сайтов Google (основанный на поле ввода идентификаторов), но не работает с банковских сайтов, возвращаясь, следующее сообщение об ошибке:

Run-time error 424: Object required

enter image description here

Ниже код для google.com:

Sub LoginHttps() 

    Dim IE As Object 
    Set IE = CreateObject("InternetExplorer.Application") 

    With IE 
     .Top = 0 
     .Left = 0 
     .Height = 1000 
     .Width = 1250 
     .Visible = True 
     .Navigate "https://www.google.com/?gfe_rd=cr&ei=N-TZVaPMAdCv8wf19aH4Bw&gws_rd=cr&fg=1" 

     Do While .Busy Or Not .ReadyState = 4: DoEvents: Loop 

     .Document.getElementById("lst-ib").Value = "input" 
    End With 
End Sub 

и код для банковского сайта, который генерирует 424 ошибку:

Sub LoginHttps() 

    Dim IE As Object 
    Set IE = CreateObject("InternetExplorer.Application") 

    With IE 
     .Top = 0 
     .Left = 0 
     .Height = 1000 
     .Width = 1250 
     .Visible = True 
     .Navigate "https://online.mbank.pl/pl/Login" 

     Do While .Busy Or Not .ReadyState = 4: DoEvents: Loop 

     .Document.getElementById("userID").Value = "input" 
    End With 
End Sub 

Мне интересно, есть ли какой-либо метод доступа к этим полям ввода VBA или он защищен банковскими программистами.

ответ

0

Кажется, что IE возвращает «готовое» состояние до загрузки всей страницы. Сайт может использовать AJAX для загрузки дополнительного контента или выполнения какой-либо переадресации. Попробуйте добавить небольшую задержку перед проверкой, готова ли страница. Например:

.Navigate "https://online.mbank.pl/pl/Login" 

' Small delay... 
Application.Wait Now + TimeValue("00:00:02") 

Do While .Busy Or Not .ReadyState = 4: DoEvents: Loop 

.Document.getElementById("userID").Value = "input" 

Это сработало для меня.

+0

Большое спасибо. Я попробую это с другими сайтами банков, которые также не работали раньше. – azera

+0

Задержка IMO в подобных случаях была бы ненадежной (для небольшой задержки) или чрезмерно долго (для длительной задержки). – omegastripes

+0

@omegastripes - Это хороший момент. Мне нравится ваше решение. – Bond

1

Вот три последовательные проверки: первый Do ... Loop обычно проверка IE состояния, второй - документ, проверка полноты и третья - цель проверки элемент, который возвращает Null для меня в то время как целевой узел не готов (а HTMLInputElement, когда он делает) ,

Sub LoginHttps() 
    Dim IE As Object 
    Set IE = CreateObject("InternetExplorer.Application") 
    With IE 
     .Top = 0 
     .Left = 0 
     .Height = 1000 
     .Width = 1250 
     .Visible = True 
     .Navigate "https://online.mbank.pl/pl/Login" 
     Do While .Busy Or Not .readyState = 4: DoEvents: Loop 
     Do Until .document.readyState = "complete": DoEvents: Loop 
     Do While TypeName(.document.getElementById("userID")) = "Null": DoEvents: Loop 
     .document.getElementById("userID").Value = "input" 
    End With 
End Sub 
+0

@Bond, я описал возвращение 'TypeName()' в своем ответе. Обычно '.getElementById()' не генерирует ошибку, если искомый узел не существует, он просто возвращает не объект (ошибка обычно вызвана ключевым словом 'Set'). Кстати, я проверил, что особенно в этом проверке кода «.document.readyState» не действует, и проверка 'TypeName()' приостанавливает выполнение, чтобы не получить ошибку. – omegastripes

+0

Я заметил, что тоже после тестирования. Вы можете сделать его еще более общим с помощью 'Do While TypeName (.document.getelementbyid (« userID »)) =« Null ». – Bond

+0

@ Бонд, согласен, я отредактировал ответ. – omegastripes

Смежные вопросы