Консультация № 177352
19.03.2010, 17:38
35.77 руб.
0 31 0
Уважаемые эксперты по данному коду открываю страницу, которая на сервере в закрытой локальной сети, в интернете её нет!!!

Dim Интернет_Эксплойер As Object
Set Интернет_Эксплойер = CreateObject("InternetExplorer.Application")
Интернет_Эксплойер.Visible = True
Интернет_Эксплойер.navigate ("http://10.196.192.7/CarSearch/Login.aspx?ReturnUrl=%2fCarSearch%2fCarSearchGrid.aspx&AspxAutoDetectCookieSupport=1")

Do While Интернет_Эксплойер.ReadyState <> 4
Loop
DoEvents

'имя формы в коде имеет название: form name="
Интернет_Эксплойер.Document.forms("formLogin").all("tbUsername").Value = "1"
Интернет_Эксплойер.Document.forms("formLogin").all("tbPassword").Value = "2"
Интернет_Эксплойер.Document.forms("formLogin").all("loginButton").Click 'нажать кнопку Войти, кнопка имеет название input name

Do While Интернет_Эксплойер.ReadyState <> 4 'нужно писать <> 4, потому что это код, который показывает, что ВЭБ страница полностью загружена. Так написано в документации по ReadyState
Loop
DoEvents

Здесь ошибка № 91, переменная объекта или переменная блока With не задана почему ??? Интернет_Эксплойер.Document.forms("formCarSearch").all("gotoCarSearchGridButton").Click 'нажать кнопку
Do While Интернет_Эксплойер.ReadyState <> 4 'нужно писать <> 4, потому что это код, который показывает, что ВЭБ страница полностью загружена. Так написано в документации по ReadyState
Loop
DoEvents

Обсуждение

Неизвестный
19.03.2010, 22:01
общий
Vasiliy83:
А почему именно на строчку
Интернет_Эксплойер.Document.forms("formLogin").all("tbUsername").Value = "1"
А не на строчку
Интернет_Эксплойер.Document.forms("formLogin").all("tbPassword").Value = "2"
Неизвестный
20.03.2010, 08:47
общий
Ципихович Эндрю:
скорее всего и на нее тоже будет ругаться, но до нее выполнение кода не доходит, т.к. первая строка стоит раньше
Вы не могли бы сохранить страницу авторизации и выложить ее, чтобы не гадать, какие там формы и прочие элементы?

попробуйте заменить строки на:
Интернет_Эксплойер.Document.forms(0).all("tbUsername").Value = "1"
Интернет_Эксплойер.Document.forms(0).all("tbPassword").Value = "2"
Неизвестный
20.03.2010, 09:14
общий
Vasiliy83:
Выложу в понедельник
Неизвестный
22.03.2010, 17:02
общий
Vasiliy83:
Файл Oshibka_941.rar успешно загружен.
Ссылка для скачивания
https://rfpro.ru/upload/1931
Также пользуясь случаем хотел спросить в странице https://rfpro.ru/upload/1932 Police при помощи ВБА
как ввести имя пользователя?
как ввести пароль?
как нажать кнопку Войти?
При помощи программы Nvu я не смог просмотреть html теги страницы, html код страницы просмотреть можно, но я в этом ничего не понимаю
Также при помощи Nvu открывая данную страницу появляется сообщение эта страница не может быть изменена по неизвестным причинам, что с ней??

Неизвестный
23.03.2010, 08:42
общий
Ципихович Эндрю:
по поводу первой части нашего обсуждения - на присланной Вами страницы нет вообще полей, в которые можно ввести логин и пароль.
страница содержит 2 кнопки: "Поставить..." и "Просмотреть..."\
скорее всего Вам надо открыть страницу http://10.196.192.7/CarSearch/Login.aspx и сохранить ее.

по поводу второго вопроса:
из html-кода страницы police.htm видно, что сама форма находится на странице \Police.files\login.htm
и там уже строками
Код:
<TD><INPUT class=fld-input maxLength=10 name=login></TD>
.........
<TD><INPUT class=fld-input type=password maxLength=8 name=passwd></TD>
.........
<INPUT class=doc-button type=submit value=" Ok " name=Action>

задаются поля для ввода логина и пароля, а также кнопка "ОК".

соответственно на VBA код для их автоматического заполнения будет выглядеть так:
Код:
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate ("ТУТ_АДРЕС_СТРАНИЦЫ_POLICE.HTM/Police.files/login.htm")
'т.е. если адрес страницы был, например, http://127.0.0.1/Police.htm, то адрес в код должен быть http://127.0.0.1/Police.files/login.htm

Do While ie.ReadyState <> 4
Loop
DoEvents

'ie: form name="
ie.Document.forms(0).all("login").Value = "ВАШ_ЛОГИН"
ie.Document.forms(0).all("passwd").Value = "ВАШ_ПАРОЛЬ"
ie.Document.forms(0).all("Action").Click
Неизвестный
23.03.2010, 16:25
общий
Vasiliy83:
По поводу самого вопроса, то есть первой части обсуждения
Я спрашиваю:
Здесь ошибка № 91, почему ? Интернет_Эксплойер.Document.forms("formCarSearch").all("gotoCarSearchGridButton").Click 'нажать кнопку
Do While Интернет_Эксплойер.ReadyState <> 4
Loop
DoEvents

Так в этот момент и находится страница присланная мною, а код который выше этой строки успешно пройден и до этого была страница другая, на всякий случай высылаю и её
К 941
поясняю на всякий случай, что в вопросе указано Value = "1" и Value = "2" это изменено специально, введён логин и пароль верно, иначе бы страница не загрузилась.

По поводу дополнительного вопроса я пишу по Вашему совету
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.navigate ("http://10.196.192.26:9204/") 'реально открыта нужная страница

Do While ie.ReadyState <> 4
Loop
DoEvents

ie.Document.forms(0).all("login").Value = "Нужный логин" 'Здесь ошибка 91, почему ?????
ie.Document.forms(0).all("passwd").Value = "Нужный пароль"
ie.Document.forms(0).all("Action").Click
Интересно откуда Вы вяли эти данные ("login"), ("passwd"), ("Action")??????
Неизвестный
23.03.2010, 17:30
общий
Vasiliy83:
Забыл сказать файл К 941, ссылка https://rfpro.ru/upload/1936
Неизвестный
23.03.2010, 19:49
общий
Ципихович Эндрю:
теперь все ясно - оба Ваши вопроса имеют в себе одно и то же решение - определение правильной ссылки для кода!
начну с дополнительного вопроса:
реально открыта нужная страница

то, что Вы видите - это вообще-то две разные страницы:
http://10.196.192.26/Police.files/title.htm и http://10.196.192.26/Police.files/login.htm
Интересно откуда Вы вяли эти данные ("login"), ("passwd"), ("Action")??????

если просмотреть HTML-код страницы Police.htm, то мы увидим, что она состоит из двух фреймов - заголовка (который находится выше полосы) и формы (она ниже полосы):
Код:
<FRAMESET border=0 frameSpacing=0 rows=65,* frameBorder=0>
<FRAME name=frm_title marginWidth=0 marginHeight=0 src="Police.files/title.htm" noResize scrolling=no>
<FRAME name=frm_body marginWidth=0 marginHeight=0 src="Police.files/login.htm"></FRAMESET>

в качестве содержимого фреймов указаны страницы, о которых я написал выше
а в коде страницы login.htm уже можно найти название элементов (см. пост выше - выдержка из HTML-кода)

причина ошибки 91 в том, что сама страница http://10.196.192.26/Police.htm не содержит формы, а значит и заполнять нечего
попробуйте вставить в код ссылку http://10.196.192.26/Police.files/login.htm или http://10.196.192.26:9204/Police.files/login.htm, если порт реально так важен
у меня данная форма отлично заполняется, но только при условии использования ссылки на страницу login.htm


по поводу основного вопроса - попробуйте использовать ссылку http://10.196.192.7/CarSearch/Login.aspx
но тут не факт, что получится методом прямого управления страницей, т.к. данные передаются через ссылку
возможно придется использовать вариант с SendKeys, т.е. действие на странице будет аналогично действиям пользователя:
1) открываем страницу (код уже есть)
2) переходим при помощи передачи окну браузера нужного количества раз нажатия клавиши Tab
3) вводим аналогично логин
4) переходим Tab'ом на пароль и вводим
5) переходим Tab'ом на кнопку и передаем нажатие клавиши Enter
Неизвестный
24.03.2010, 16:34
общий
Vasiliy83:
По Вашему совету вводил и получил
'ie.navigate ("http://10.196.192.26/Police.files/login.htm") 'Невозможно отобразить страницу, сообщение Сервер не найден
'ie.navigate ("http://10.196.192.26:9204/Police.files/login.htm") 'Невозможно найти страницу, сообщение HTTP 404 Не найдено

ie.navigate ("http://10.196.192.7/CarSearch/Login.aspx") 'тут всё хорошо, открывается нужная страница, насколько я вижу ВБА вводит в её поля логин пароль, вижу что правильно, логин видно, пароль ввиде точек, но затем на строке
ie.Document.forms("formCarSearch").all("addCarMenuButton").Click получаю всё ту же 91 ошибку, но самое интересное, когда это делаю вручную прогоняя код всё хорошо, а если это делается после того как я нажму кнопку или код помещу в макрос и поставлю его на выполнение, получаю эту ошибку, не проверял возможно и ранее так было
От чего всё так???
Неизвестный
24.03.2010, 18:46
общий
Ципихович Эндрю:
опять же, не видя, что реально открывается в браузере при открытии страницы http://10.196.192.26:9204, нельзя точно сказать, какую ссылку необходимо использовать...
откройте эту страницу в браузере, потом зайдите в меню "Страница" - "Просмотр HTML-кода" и пришлите этот код в текстовом файле

попробуйте вместо ie.Document.forms("formCarSearch").all("addCarMenuButton").Click ввести также ie.Document.forms(0).all("addCarMenuButton").Click
у меня такой вариант сработал успешно и без ошибок
Неизвестный
25.03.2010, 09:32
общий
Vasiliy83:
HTML код http://10.196.192.26:9204
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Police portal :: Chelyabinsk '2007</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<META NAME="copyright" CONTENT="Copyright 2007 Oleg Shulgin">
<LINK REL="stylesheet" HREF="/css/s2i.css">
</HEAD>
<FRAMESET border=0 frameSpacing=0 rows="65,*" frameBorder=0>
<FRAME name=frm_title marginWidth=0 marginHeight=0 src="title.shtml" noResize scrolling=no>
<FRAME name=frm_body marginWidth=0 marginHeight=0 src="/cgi-bin/pwrap.cgi?proc=t_webif.t_main('spr_body')">
</FRAMESET>
</HTML>

Вы говорите:
попробуйте вместо
ie.Document.forms("formCarSearch").all("addCarMenuButton").Click
ввести также
ie.Document.forms(0).all("addCarMenuButton").Click
Сделал, всё тоже самое
получаю всё ту же 91 ошибку, но самое интересное, когда это делаю вручную прогоняя код всё хорошо, а если это делается после того как я нажму кнопку или код помещу в макрос и поставлю его на выполнение, получаю эту ошибку. Меня удивляет это обстоятельство, что
«когда это делаю вручную прогоняя код всё хорошо, а если это делается после того как я нажму кнопку или код помещу в макрос и поставлю его на выполнение, получаю эту ошибку» Это почему происходит????

Неизвестный
25.03.2010, 14:16
общий
Ципихович Эндрю:
опять фреймы.... поиски нужной страницы затягиваются

можно заодно попробовать в Вашем коде изменить ie.navigate ("http://10.196.192.26:9204/Police.files/login.htm") на
ie.navigate ("http://10.196.192.26:9204/cgi-bin/Police.files/login.htm")
возможно такой путь окажется верным
если нет, то откройте страницу http://10.196.192.26:9204/cgi-bin/pwrap.cgi?proc=t_webif.t_main('spr_body')
и пришлите ее HTML-код

по основному отпишусь позже
Неизвестный
25.03.2010, 15:39
общий
Ципихович Эндрю:
по поводу основного кода: добиться получения 91-ой ошибки с последним вариантом кода у меня не вышло, а это еще раз подтверждает, что ошибка проявляется не всегда (Ваш вариант с пошаговым выполнением и полным выполнением кода)
также меня смущает одна вещь в Вашем коде - это полное отсутствие вызова функций для объекта ie
я привык, что если функция выполняется, то она или должна вызываться оператором Call, или результат ее выполнения присваивается какой-то переменной (если конечно она возвращает какой-то результат)

так что попробуйте сначала сделать так:
Call ie.Document.forms(0).all("addCarMenuButton").Click
давно
Профессионал
848
1596
25.03.2010, 17:57
общий
Ципихович Эндрю:
попробуйте 3 варианта, просто открывайте их в браузере IE
где XXXX замените на правильный логин
а YYYY на правильный пароль
http://10.196.192.26:9204/cgi-bin/auth.cgi?login=XXXX&passwd=YYYY
или
http://10.196.192.26:9204/cgi-bin/auth.cgi?login_ref=%2fcgi-bin%2fpwrap.cgi?proc=t_webif.t_main('spr_body')&login=XXXX&passwd=YYYY
или
http://10.196.192.26:9204/cgi-bin/auth.cgi?login_ref=wrap.cgi?proc=t_webif.t_main('spr_body')&login=XXXX&passwd=YYYY

по идее вам должна открыться уже авторизованная страница.
Неизвестный
26.03.2010, 10:08
общий
PsySex:
Вы поспешили так ответили если пароль ХХХХ заключать в кавычки получится ХХХХ"", или паролю предварительно присваивать переменную??
давно
Профессионал
848
1596
28.03.2010, 00:16
общий
Ципихович Эндрю:
никакие кавычки не нужно было подставлять, и пробелы тоже просто возмите и замените, и попробуйте в браузере.
т.е. если логин John, а пароль Smith, то сделайте такую строку и попробуйте открыть в браузере, не надо пока это открывать програмным методом.
http://10.196.192.26:9204/cgi-bin/auth.cgi?login=John&passwd=Smith
и также 2 других варианта из прошлого поста.
Неизвестный
28.03.2010, 08:24
общий
PsySex:
Вроде так? Завтра попробую!!!

XXXX = "***" 'логин
YYYY = "***" 'пароль
Страница5 = "http://10.196.192.26:9204/cgi-bin/auth.cgi?login=XXXX & passwd= YYYY
Страница6 = "http://10.196.192.26:9204/cgi-bin/auth.cgi?login_ref=%2fcgi-bin%2fpwrap.cgi?proc=t_webif.t_main('spr_body')&login=XXXX & passwd=YYYY
Страница7 = "http://10.196.192.26:9204/cgi-bin/auth.cgi?login_ref=wrap.cgi?proc=t_webif.t_main('spr_body')&login=XXXX & passwd=YYYY
Неизвестный
28.03.2010, 09:35
общий
PsySex:
Ещё извините не понял:
не надо пока это открывать програмным методом
А как надо???
Неизвестный
28.03.2010, 09:45
общий
PsySex:
Уже понял что такое не надо пока это открывать програмным методом
Завтра попробую в браузере открывать

http://10.196.192.26:9204/cgi-bin/auth.cgi?login=1234&passwd=39799
http://10.196.192.26:9204/cgi-bin/auth.cgi?login_ref=%2fcgi-bin%2fpwrap.cgi?proc=t_webif.t_main('spr_body')&login=1234&passwd=39799
http://10.196.192.26:9204/cgi-bin/auth.cgi?login_ref=wrap.cgi?proc=t_webif.t_main('spr_body')&login=1234&passwd=39799
Естественно логин 1234 и пароль 39799 будет заменён на верный
давно
Профессионал
848
1596
28.03.2010, 12:15
общий
Ципихович Эндрю:
да все верно.
Неизвестный
29.03.2010, 19:29
общий
PsySex:
Второй вариант, а именно
Страница = http://10.196.192.26:9204/cgi-bin/auth.cgi?login_ref=%2fcgi-bin%2fpwrap.cgi?proc=t_webif.t_main('spr_body')&login=12&passwd=34
оказался верным, большое спасибо, также она открывается и программно

Также хотел спросить, может тогда можно покороче одним открытием открыть страницу, она по ссылке https://rfpro.ru/upload/2003

В настоящее время я её открываю по коду

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True 'открывает, делает видимым Микрософт Интернет Эксплоер
IE.navigate ("http://10.196.192.7/CarSearch/Login.aspx?ReturnUrl=%2fCarSearch%2fCarSearchGrid.aspx&AspxAutoDetectCookieSupport=1")
Do While IE.ReadyState <> 4 'нужно писать <> 4, потому что это код, который показывает, что ВЭБ страница полностью загружена. Так написано в документации по ReadyState
Loop
DoEvents

'имя формы в коде имеет название: form name="
IE.Document.forms("formLogin").all("tbUsername").Value = "ХХХ" 'ввести имя пользователя ...
IE.Document.forms("formLogin").all("tbPassword").Value = "УУУ" 'ввести пароль ...
IE.Document.forms("formLogin").all("loginButton").Click 'нажать кнопку Войти, кнопка имеет название input name

Do While IE.ReadyState <> 4
Loop
DoEvents
Beep

Также хотел спросить я же задавал на форуме Вопрос № 177423 о том как определить на открытой страницы элементы страницы- поля, кнопки, формы, флажки, их ИД, Вы не в курсе, или может в решебник выложить??
давно
Профессионал
848
1596
30.03.2010, 00:23
общий
Ципихович Эндрю:
к сожалению у меня сейчас мало свободного времени, возможно я вам помогу через пару дней...
https://rfpro.ru/upload/2003 - этот пример, т.е. после того как вы ввели пароль(с помощью той длинной строки), у вас опять запрашивают имя пароль и пользователя для поиска?
Неизвестный
30.03.2010, 10:10
общий
PsySex:
Честно сказать я не понял вопроса???
Отвечу как смогу

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True 'открывает, делает видимым Микрософт Интернет Эксплоер
IE.navigate ("http://10.196.192.7/CarSearch/Login.aspx?ReturnUrl=%2fCarSearch%2fCarSearchGrid.aspx&AspxAutoDetectCookieSupport=1") 'открывает указанную в кавычках страницу
Do While IE.ReadyState <> 4
Loop
DoEvents

'Здесь Появляется страница с полями для ввода пароля

IE.Document.forms("formLogin").all("tbUsername").Value = "ххххх" 'ввести имя пользователя ... ИМЯ ВВЕЛОСЬ!!!!!!!!!!!!!!!!!!!!!!
IE.Document.forms("formLogin").all("tbPassword").Value = "ууууу" 'ввести пароль ... ПАРОЛЬ ВВЁЛСЯ!!!!!!!!!!!!!!!!!!!!!!!
IE.Document.forms("formLogin").all("loginButton").Click 'нажать кнопку Войти, кнопка имеет название input name КНОПКА НАЖАЛАСЬ !!!!!!!!!!!!!!!!!!!!!

Do While IE.ReadyState <> 4
Loop
DoEvents
Beep

'ЗАГРУЗИЛАСЬ НУЖНАЯ СТРАНИЦА, С ВВЕДЁННЫМИ ИМЕНЕМ И ПАРОЛЕМ БОЛЕЕ ИХ НЕ СПРАШИВАЕТ, ВСЁ ХОРОШО, ВОЗМОЖНО ЛИ СДЕЛАТЬ ПОКОРОЧЕ КАК ВЫ ПОСОВЕТОВАЛИ В ПРЕДЫДУЩЕМ ПРИМЕРЕ, ЧТОБЫ ПОЛЬЗОВАТЕЛЬ НЕ ВИДЕЛ КАК ПРОГРАММА ВВОДИТ ПАРОЛЬ, ЛОГИН, В ЭТОМ НИЧГО СТРАШНОГО НЕТ ЕСЛИ ПОЛЬЗОВАТЕЛЬ УВИДИТ, ПРОСТО ПО МОЕМУ МНЕНИЮ ЭТО БУДЕТ ПОСОВРЕМЕННЕЙ И ПОЛЬЗОВАТЕЛЮ БУДЕТ ПОНЯТНЕЙ ???????????????
давно
Профессионал
848
1596
30.03.2010, 20:59
общий
Ципихович Эндрю:
Если у вас проблема только в том, чтоб спрятать процесс авторизации от пользователя, то не делайте в начале
IE.Visible = True 'открывает, делает видимым Микрософт Интернет Эксплоер
эту строку можно поместить уже после Beep например, т.е. пользователю эксплорер уже откроется уже после авторизации. А если эта авторизация занимает длительное время то можно вывести окно в начале процедуры с текстом типа "Ждите, идет обработка запроса..." а перед тем как показать окно эксплорера(IE.Visible = True) окно с текстом ожидания выгрузить.
Я бы не стал менять ваш алгоритм. Потому как сразу войти авторизованным,как в прошлом примере не получится, потому как в этом случае есть скрытые поля __VIEWSTATE и __EVENTVALIDATION, значения которых можно получить только после загрузки страницы.
Я не считаю ваш способ авторизации "древним".
Неизвестный
30.03.2010, 22:20
общий
PsySex:
Спасибо за совет
Неизвестный
31.03.2010, 17:33
общий
PsySex:
По Вашему совету сделал следующим образом:

Страница3 = "http://10.196.192.7/CarSearch/Login.aspx?ReturnUrl=%2fCarSearch%2fCarSearchGrid.aspx&AspxAutoDetectCookieSupport=1"

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate (Страница3)
Do While IE.ReadyState <> 4
Loop
DoEvents

'имя формы в коде имеет название: form name="
IE.Document.forms("formLogin").all("tbUsername").Value = "хххххххххх" 'ввести имя пользователя ...
IE.Document.forms("formLogin").all("tbPassword").Value = "уууууууууу" 'ввести пароль ...
IE.Document.forms("formLogin").all("loginButton").Click 'нажать кнопку Войти, кнопка имеет название input name

Do While IE.ReadyState <> 4
Loop
DoEvents
IE.Visible = True 'открывает, делает видимым Микрософт Интернет Эксплоер
Beep

Увы когда открывает страницу то ещё видно ту предыдущую страницу с введёнными в неё логином и паролем, подскажите ??? почему так происходит, как можно изменить ???

давно
Профессионал
848
1596
31.03.2010, 22:33
общий
Ципихович Эндрю:
видно долю секунды, потом же открывается авторизованная страница, так я понимаю? ну введите задержку(паузу) перед IE.Visible = True....например в пол секунды, чтоб другое окно успело загрузится...
Неизвестный
01.04.2010, 05:00
общий
Правильно понимаете видно долю секунды подскажите как ввести паузу на ВБА??????
давно
Профессионал
848
1596
01.04.2010, 08:17
общий
Ципихович Эндрю:
объявить API
Public Declare Sub Sleep Lib "kernel32" (ByVal lMilliseconds As Long)
использование
Sleep 1000
задержка выражается в милисекундах.
Неизвестный
04.04.2010, 06:37
общий
PsySex:
Спасибо за совет!!
Вы мне не поможете по вопросу 177551, там тема примерно та же
А эксперты сказали А, а Б сказать не могут или не хотят
Заранее спасибо
Форма ответа