1 (изменено: alexii, 2008-11-01 17:50:11)

Тема: VBS: программное заполнение Web-форм-2

Есть сайт https://uslugi.beeline.ru/. Чтобы посмотреть баланс сотовой связи, на нём необходимо ввести login и password. Открывается

https://uslugi.ru/navigateMenu.do

Затем надо перейти по ссылке, для выбора нужного предприятия, например

https://uslugi.beeline.ru/hierarchyTreeAction.do?products_ctrl=products&products_action=Drilldown&products_param=1

или

https://uslugi.beeline.ru/hierarchyTreeAction.do?products_ctrl=products&products_action=Drilldown&products_param=3

А вот потом кликнуть по ссылкам "Финансовая информация" ---> "Счета" и кликнуть по кнопке «выгрузить в Excel».

С первыми двумя пунктами все здорово получается

'***************************************************************
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "https://uslugi.beeline.ru/"

Do
Loop Until objIE.readystate = 4

Set objForm = objIE.Document.forms("EcareLoginForm")

objForm.elements("userName").value = "kenser"
objForm.elements("password").value = "dddddd"

objForm.submit()

While objIE.Busy
    WScript.Sleep 300
Wend

objIE.document.links.item(8).click()
'***************************************************************

Но вот "Финансовая информация" это не ссылка, а такая ерунда

'***************************************************************
<script language="JavaScript" type="text/javascript">
<!--    

    // Create Top Level Items - TopLevelItem(sText, sURL, sAction, isSelectedItem)    // isSelectedItem - true | false
    multiLevelMenu.add(new TopLevelItem("Финансовая информация", "", "doEcareLinkSubmit( 'navigateMenu.do', '_navigation_primaryMenu=billing','true')", false));

//-->
</script>
'***************************************************************

Так может, кто знает, как программно пройти этот скрипт?

Штука это нужная, особенно корпоративным клиентам, да и просто интересно как это можно сделать.

2

Re: VBS: программное заполнение Web-форм-2

2Hartgumml: справка по BBCode. Ваше сообщение я откорректировал в соответствии с Правилами форума. Нажмите кнопку «Редактировать» под своим сообщением и посмотрите, как примерно это должно выглядеть.

3 (изменено: NikR, 2008-11-01 20:19:49)

Re: VBS: программное заполнение Web-форм-2

ЗЫ https://uslugi.beeline.ru/ ужасно тормозит

Поскольку билайна не имею - нужен подробный исходник загружаемой страницы. Там наверное есть несколько <script language="JavaScript" src="/???.js"></script> - посмотрите эти скрипты.

А лучше не разгребать код, а поставить Fiddler и смотреть http запросы и слать похожие.

Вообще, InternetExplorer.Application - тяжелый процесс. Лучше использовать XMLHttp и RegExp. В идеале ещё поставить сайта микрософт и использовать MSXML2.ServerXMLHTTP.6.0 (там есть свойство setProxy) - тогда можно видеть в Fiddler свои запросы.

4

Re: VBS: программное заполнение Web-форм-2

NikR пишет:

ЗЫ https://uslugi.beeline.ru/ ужасно тормозит

Поскольку билайна не имею - нужен подробный исходник загружаемой страницы. Там наверное есть несколько <script language="JavaScript" src="/???.js"></script> - посмотрите эти скрипты.

А лучше не разгребать код, а поставить Fiddler и смотреть http запросы и слать похожие.

Вообще, InternetExplorer.Application - тяжелый процесс. Лучше использовать XMLHttp и RegExp. В идеале ещё поставить сайта микрософт и использовать MSXML2.ServerXMLHTTP.6.0 (там есть свойство setProxy) - тогда можно видеть в Fiddler свои запросы.

Чё такое Fiddler я не знаю - если это сниффер, то Give-Me-Too 2.50 вообще не показывает ни одной
ссылки наверное потому что https, что такое XMLHttp и RegExp я тоже не знаю, ленивый я, да и хочу чтоб
работало на голой Винде

но я похоже начал добивать, тут вроде все просто

objIE.document.script.doEcareLinkSubmit "/navigateMenu.do", "_navigation_primaryMenu=billing", "true"

осталось с выгрузкой в Эксель закончить

и все таки, что это за фича

doEcareLinkSubmit( 'navigateMenu.do', '_navigation_primaryMenu=billing','true')

она встроенна в JavaScript или в движке сайта, я в JavaScript вообще не разбираюсь

5

Re: VBS: программное заполнение Web-форм-2

Fiddler - веб-дебагер. По сути почти сниффер. На самом деле прокси. Https видит.
XMLHttp и RegExp - голая винда. Тот же Эксель - не голая винда . Ленишься в одном - геморишся в другом.
doEcareLinkSubmit - движок  сайта. Читай тогда исходники страниц.

6 (изменено: SirKukk, 2008-12-14 16:23:28)

Re: VBS: программное заполнение Web-форм-2

Для регистрации требуется заполнить 2 формы, при чем вторая открывается после submit'а  первой, в том же окне. Как заполнить поля второй формы?
В VBS не силен, не могу понять, как к полям второй формы обращаться...

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true
objIE.Navigate "http://..."

While objIE.Busy
    WScript.Sleep 100
Wend

'нахожу и заполняю первую форму
Set objForm = objIE.Document.forms("form_registration")
objForm.elements("login").value = "ttt@ttt.ru"
objForm.elements("password").value = "11111"
'отправляю первую форму
objIE.document.script.send_auth().click

While objIE.Busy
    WScript.Sleep 100
Wend

'загружается страница с формой 2
'пытаюсь найти форму, хотя, подозреваю, что ее в имеющемся  objIE нет...
Set objForm = objIE.Document.forms("form_reason")
objForm.elements("deadline").value = "12.12.08"
objForm.elements("comment").value = "bla-bla"
'подразумеваю отправку данных
objIE.document.script.send_reason().click

P.S.
send_auth(), send_reason() - js на сервере.

7

Re: VBS: программное заполнение Web-форм-2

SirKukk пишет:
…
objIE.Navigate "http://..."

Сферический конь в вакууме?

8

Re: VBS: программное заполнение Web-форм-2

Просто корпоративный сервер локальный, на нем что-то типа сервисдеска.
Задачи повторяются, потому, создав несколько почти одинаковых скриптов можно было бы здорово облегчить себе жизнь...

9

Re: VBS: программное заполнение Web-форм-2

Нужен исходный html-код страницы, содержащий форму «form_registration», форму «form_reason» и, возможно, некоторые внешние (<SCRIPT SRC=...) скрипты, буде таковые потребуются.

10 (изменено: SirKukk, 2008-12-14 22:43:27)

Re: VBS: программное заполнение Web-форм-2

что-то похожее на ресурсе rabotuza.ru: там вводишь сначала общие данные, нажимаешь на сабмит, данные отправляются и одновременно загружается вторая форма.
JS тут только для отправки и никакой обработки формы не делают.
Буду признателен, если подскажете решение в случае формы с обычной кнопкой submit...
Вопрос в том, почему задав объект objIE, я могу получить доступ и произвести изменения в objIE.document.forms("form_registration"), а после перехода на другую страницу (загрузки второй формы) в том же окне я уже не могу увидеть objIE.document.forms("form_reason").
После загрузки второй страницы, objIE.document должен тоже поменяться? Или как мне обратиться к форме на загруженной станице 2? Может быть нужно создать какой-то новый объект, или есть что-то типа refresh objIE.document source?
Что-то мне говорит, что это должно делаться элементарно...

11

Re: VBS: программное заполнение Web-форм-2

SirKukk, а мне что-то говорит, что Вы плохо понимаете написанное на русском языке. Я написал Вам, какая информация нужна для того, чтобы начать решение Вашей задачи. Не rabotuza.ru, ни какая другая, а хотя бы

исходный html-код страницы, содержащий форму «form_registration»

для начала. Что не понятно?!

12

Re: VBS: программное заполнение Web-форм-2

По-русски я нормально понимаю. Исходный код страницы сейчас предоставить не смогу, потому как из интернета к сервису нет доступа, если только завтра. Просто хотел сегодня все доделать...

13

Re: VBS: программное заполнение Web-форм-2

Хорошо.

14 (изменено: SirKukk, 2008-12-20 16:37:49)

Re: VBS: программное заполнение Web-форм-2

Проблема с обращением к формам вытекала из незнания VBS. Исправил.
Смоделировал у себя на локальном сервере пример с двумя упрощениями: отправка форм кнопкой сабмит, метод get. Все прекрасно работает, никаких сложностей.
Кому интересно, архив с примером здесь (2 Кб)
http://www.speedyshare.com/937433123.html

Я нашел в чем дело в моей задаче - скрипт останавливается из-за ошибки в отправке первой формы.

Отправка формы производится вот так:

<input src="/images/register.jpg" onclick="send_auth();" value="Зарегистрироваться" type="image">

После запуска скрипта загружается эксплорер, заходит на страницу, заполняет форму, но когда дело доходит до отправки, т.е. до

objIE.document.script.send_auth().click

выдается ошибка: Требуется объект 'objIE.document.script.send_auth()', Код: 800A01A8.

Выполнение скрипта на этом останавливается, НО! форма ОТПРАВЛЯЕТСЯ нормально...

Подскажите, как правильно имитировать клик по такому "сабмиту"? Как выглядит объект (к которому можно применить ".click") в данном случае?

15

Re: VBS: программное заполнение Web-форм-2

Подскажите новичку ,Плз, простой вопрос :
Как с помощью VBS нажать кнопку формы , если у этой кнопки нет имени ?

With CreateObject("InternetExplorer.Application").Document.Forms(0)
Debug.Print .Name & "|" & .Type & "|" & .Value
End with

Дает :
|submit|Принять

???

16

Re: VBS: программное заполнение Web-форм-2

alexii пишет:

исходный html-код страницы, содержащий форму

17

Re: VBS: программное заполнение Web-форм-2

http://tensortelecom.ru/uls/settp

18

Re: VBS: программное заполнение Web-форм-2

Примерно так:

Option Explicit

Const READYSTATE_COMPLETE = 4

Dim objIE
Dim objForm

Set objIE = WScript.CreateObject("InternetExplorer.Application")

With objIE
    '.Visible = False
    .Visible = True
    
    .Navigate "http://tensortelecom.ru/uls/settp/"
    
    ' Ждём…
    Do 
        WScript.Sleep 100
    Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
    
    ' Заполняем форму #0
    Set objForm = .Document.forms(0)
    
    With objForm
        .elements("uls_name").value = "MyLogin"
        .elements("uls_pswd").value = "MyPassword"
        
        ' Отправляем форму на сервер
        .submit()
    End With
    
    ' Ждём…
    Do
        WScript.Sleep 100
    Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
    
    'Тут прочие действия, для чего, собственно и затевались…
End With

Set objIE = Nothing

WScript.Quit 0

В данном случае нас вовсе не интересует, что у неё нет имени: поскольку кнопка имеет тип «Submit» — нужно пользоваться методом .submit самой формы.

19 (изменено: kefi, 2009-01-25 19:52:04)

Re: VBS: программное заполнение Web-форм-2

2 alexii> спасибо,

Я вот только еще хотел бы понять :
- а метод Click() формы применим вместо Submit(), Если говорить вообще о любой форме с одной submit'овой  кнопкой ?

И когда нужно применять :
Do
Loop Until objIE.readystate = 4
а когда (и какую задержку разумно ставить):
Do
  WScript.Sleep 100
Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
??

20

Re: VBS: программное заполнение Web-форм-2

kefi, используйте BBCode для оформления кода.

kefi пишет:

Я вот только еще хотел бы понять :
- а метод Click() формы применим вместо Submit(), Если говорить вообще о любой форме с одной submit'овой  кнопкой ?

В данном случае думаю, что — да, хотя специально не проверял. В ряде случаев на практике я сталкивался с тем, что требовался именно .click, только не для формы, а кнопки, особенно, когда отправка формы производилась скриптом на html-странице (то есть, скриптом, привязанным к событию click, делались ещё некие пассы, и только потом форма отправлялась на сервер; теоретически, большинство этих пассов можно было реализовать и в своём скрипте, но проще было использовать именно .click).

kefi пишет:

И когда нужно применять :

Do
Loop Until objIE.readystate = 4

а когда (и какую задержку разумно ставить):

Do
  WScript.Sleep 100
Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE

??

1. Задержка WScript.Sleep нужна для того, чтобы скрипт попусту «не жрал» процессорное время. Так что, задержку применять нужно всегда, когда требуется дождаться наступления некоего события.
2. Что касается «Until Not .Busy» и «Until .ReadyState = READYSTATE_COMPLETE». В теме VBScript: Проверка почты на Рамблере для Mail.RU достаточно было использовать «Until Not .Busy», либо «.ReadyState = READYSTATE_COMPLETE»; для Rambler.RU же пришлось проверять и то, и другое — так уж у них устроено. Заранее сказать сложно. Слишком уж неоднозначны Web-стандарты и их реализация разными конторами.

21 (изменено: kefi, 2009-01-25 21:08:29)

Re: VBS: программное заполнение Web-форм-2

2 alexii >
спасибо.
Еще такие вопросы:
- по  HTTPS  InternetExplorer.Application.navigate  тоже можно   использовать ?
- как лучше обрабатывать ошибки при програмном заполнении WEB-форм ?

22

Re: VBS: программное заполнение Web-форм-2

kefi пишет:

- по  HTTPS  InternetExplorer.Application.navigate  тоже можно   использовать ?

А попробовать?

kefi пишет:

- как лучше обрабатывать ошибки при програмном заполнении WEB-форм ?

Какого рода ошибки? Например?

23 (изменено: kefi, 2009-01-25 22:26:22)

Re: VBS: программное заполнение Web-форм-2

alexii пишет:

kefi написал:- как лучше обрабатывать ошибки при програмном заполнении WEB-форм ?

Какого рода ошибки? Например?

Вообще-то, мне кажется, быть может все, что угодно.

У меня, например, почему-то скрипт иногода подвешивается, точно не могу локализовать проблему,  вроде как из-за того, что оставались в памяти от предыдущей отладки wscript.exe и IEXPLORER.EXE.
Вообще для InternetExplorer.Application я в конце скрипта делаю Quit. Точно Не знаю как правильно с ним расквитаться ...

Или Вот такие ошибки : при неверном вводе данных в форму невозможно авторизоваться или невозможно какой-либо другой неавторизационной форме принять данные  и код

 While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE
  WScript.Sleep 100 '  DoEvents
 Wend

никогда не завершается.

Или в ответ на ввод моих данных в форме сервер выдает страницу с сообщением :

"Сообщение об ошибке: Нельзя выполнить данный запрос для лицевого счёта, по которому есть действующие подключения."

24

Re: VBS: программное заполнение Web-форм-2

kefi пишет:

Вообще-то, мне кажется, быть может все, что угодно.

Не знаю чем лечить сферического коня в вакууме.

Или Вот такие ошибки : при неверном вводе данных в форму невозможно авторизоваться или невозможно какой-либо другой неавторизационной форме принять данные  и код

While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE
  WScript.Sleep 100 '  DoEvents
Wend

никогда не завершается.

Ну, не знаю. Возможно, какие-то ошибки на самой странице. У меня код, приведённый в посте #20 нормально отрабатывает (учитывая, что имя/пароль липовые) и не зависает, IE в конце даёт ту же страницу http://tensortelecom.ru/uls/settp, сообщая на ней «Сообщение об ошибке: Неверное имя, пароль или pin-код.» Но никаких подвисаний нет.

Вообще для InternetExplorer.Application я в конце скрипта делаю Quit. Точно Не знаю как правильно с ним расквитаться ...

Правильно делаете. Это я в примере делаю его видимым и не выхожу в конце.

25 (изменено: kefi, 2009-01-26 00:09:51)

Re: VBS: программное заполнение Web-форм-2

alexii пишет:

У меня код, приведённый в посте #20 нормально отрабатывает (учитывая, что имя/пароль липовые) и не зависает, IE в конце даёт ту же страницу http://tensortelecom.ru/uls/settp, сообщая на ней «Сообщение об ошибке: Неверное имя, пароль или pin-код.» Но никаких подвисаний нет.

Ну пускай подвисания не будет, но как в скрипте определить эту ситуацию «Сообщение об ошибке: Неверное имя, пароль или pin-код.» - когда имя и пароль липовые и не приняты формой ?

Или вот выдает ошибку в скрипте, ИНОГДА ЕСТЬ ОНА ИНОГДА НЕТ:

http://img217.imageshack.us/img217/5968/scr007xn5.th.png

PS. Кстати, насчет метода Click для формы :
Как сейчас обнаружил для вышеприведенной мной страницы - Click ( или Click() со скобками ) для формы как-то вообще игнорируется и приходтся кликать 7-й элемент - кнопку (это всегда отрабатывает верно) :

 With .Document.Forms(0)
  .Item(7).Click

26

Re: VBS: программное заполнение Web-форм-2

alexii пишет:

kefi написал:- по  HTTPS  InternetExplorer.Application.navigate  тоже можно   использовать ?

А попробовать?

попробовал - предлагается Сертификат подтвердить. Как это сделать, причем не делая видимым IE ?

27

Re: VBS: программное заполнение Web-форм-2

Ну пускай подвисания не будет, но как в скрипте определить эту ситуацию «Сообщение об ошибке: Неверное имя, пароль или pin-код.» - когда имя и пароль липовые и не приняты формой ?

Варианты могут быть разные. Например, если при правильном имени/пароле результирующая страница будет отличной от «http://tensortelecom.ru/uls/settp», то можно проверять это.

Или вот выдает ошибку в скрипте

Возможно, что-то не то со ссылками, не могу посмотреть большую картинку (и пользуйтесь Alt-PrintScrn). Попробуйте просто нажать Ctrl-C в диалоговом окне об ошибке и затем вставить в текст.

28

Re: VBS: программное заполнение Web-форм-2

Кстати, насчет метода Click для формы :
Как сейчас обнаружил для вышеприведенной мной страницы - Click ( или Click() со скобками ) для формы как-то вообще игнорируется и приходтся кликать 7-й элемент - кнопку (это всегда отрабатывает верно) :

Ну, да. Всё правильно. Так и должно работать.
Разве у той формы где-то есть обработчик события onclick?

29

Re: VBS: программное заполнение Web-форм-2

попробовал - предлагается Сертификат подтвердить. Как это сделать, причем не делая видимым IE ?

Не могу сказать. Никогда не автоматизировал подобные вещи. В FireFox, во всяком случае, если сертификат не просрочен, можно принять один раз и больше не дёргаться до истечения срока действия. Как это в IE, тем более в 7/8 — вовсе не знаю.

30 (изменено: kefi, 2009-01-27 02:18:35)

Re: VBS: программное заполнение Web-форм-2

alexii пишет:

Возможно, что-то не то со ссылками, не могу посмотреть большую картинку

А так ? :
http://s53.radikal.ru/i140/0901/dd/830f9f3fa781t.jpg
Дело в том, что иногда только это не обрабатывается, возможно предыдущий .Navigate "http://" & rtIp & "/st_device.php" не дает нужной страницы, но ie.busy при этом показывает не занятость и ie.ReadyState=4.


И еще :
часто бывает на экране открыто много окон IE пользователем, и еще имеется объект Set ie = CreateObject("InternetExplorer.Application"), созданный в скрипте . Если этот скрипт при предыдущем запуске ЗАВИС ,  или , например, при отладке сорван, то при следующем запуске может статься, что работа с InternetExplorer.Application не получается ( разные проявления ) . Если из Диспетчера Задач убить процесс IEXPLORER.EXE, то скрипт проходит нормально.

Так вот вопрос - как при запуске скрипта убить подвисший процесс IEXPLORER.EXE(причем окно его скрыто), не затрагивая остальных IEXPLORER.EXE, открытых пользователем.
Я могу убить ВСЕ процессы с именем IEXPLORER.EXE перед Set ie = CreateObject("InternetExplorer.Application"), но тогда будут удалены с экрана и нужные пользователю окна IE , как же убить только подвисший процесс IEXPLORER.EXE  ?

31

Re: VBS: программное заполнение Web-форм-2

kefi пишет:

А так ? :

Теперь нормально. Обычно такое бывает, если документ не весь загрузился, если что-то дорисовывается в коде уже на клиенте, если делается редирект/несколько редиректов, технология AJAX может так шалить.

kefi пишет:

Дело в том, что иногда только это не обрабатывается, возможно предыдущий .Navigate "http://" & rtIp & "/st_device.php" не дает нужной страницы, но ie.busy при этом показывает не занятость и ie.ReadyState=4.

Не знаю. Если у Вас есть какой-либо адрес, на котором можно поглядеть — попробую.

Попробуйте в этом месте поставить два цикла ожидания с !(ie.busy) + ie.ReadyState=4. То есть, сначала один, затем паузу на x*100 мс, затем ещё один. Пропадёт эта ошибка?

kefi пишет:

Если этот скрипт при предыдущем запуске ЗАВИС ,  или , например, при отладке сорван,…

Завис — это вряд ли, просто его окно скрыто. Я вместо Диспетчера задач применяю Process Explorer. Там хорошо видно, что процесс «iexplore.exe», являющийся хостом для объекта "InternetExplorer.Application", является дочерним процессом по отношению к «svchost.exe». Командная строка у него будет «"C:\Program Files\Internet Explorer\iexplore.exe" -Embedding», а у «svchost.exe» — «C:\WINDOWS\system32\svchost -k DcomLaunch», возможно с соответствующей поправкой на пути к исполняемым файлам. Можно попробовать убить процессы «iexplore.exe», соответствующие этим условиям через WMI.

32 (изменено: kefi, 2009-02-06 18:53:33)

Re: VBS: программное заполнение Web-форм-2

alexii пишет:

Завис — это вряд ли, просто его окно скрыто

Почему вряд ли ? -  Скрыто-то оно скрыто, но он и Завис  - скажем, в цикле проверки какой-ни готовности . У меня, например, эта страница идет с WEB конфигуратора глюкаватого рутера, работа IE с которым может с чем угодно столкнуться...

Если у Вас есть какой-либо адрес, на котором можно поглядеть — попробую.

Адреса нет, могу только соус страницы выложить, м.б. поймете что из ее скриптов, в котроых я не разбираюсь .

Попробуйте в этом месте поставить два цикла ожидания с !(ie.busy) + ie.ReadyState=4. То есть, сначала один, затем паузу на x*100 мс, затем ещё один. Пропадёт эта ошибка?

Да не, не пропадает, точнее - не могу локализовать, когда же она появляется, И не могу понять - как нужно обрабатывать нажатие клавиш Подключения для вышеприведенной страницы. Я уже вот такую штуку замутил, ( есть, правда, сомнения , кодга ie.Busy когда ie.ReadyState нужно анализировать , у меня пока ReadyState всегда 4 ) :

Function ieBusy(ie,ByVal TimeOut,ByRef Descr) 'SHDocVw.InternetExplorer
' TimeOut=0         -  Ждать бесконечно до готовности
'        =N         -  Ждать готовности, ( в цикле на 100 msec передавая управление другим) не более N sec ,
'                      после чего возвратить состояние IE в функции..
'        ="T0;T1;T2;T3" -  проверка готовности(незанятости) на вшивость
'                  - Ждать готовности не более T0 sec(или при T0=0 - бесконечно дтпп не будет незанятости) , 
'                    Если в течении T0 msec обнаружится готовность, то
'                    еще через T1>0 sec проверить ее T2 раз с T3 msec перерывом(при T2=1 перерыв T3 не важен), 
'                    Это придумано на случай, когда в течении T1 msec после первой готовности IE может еще не не раз терять готовность. 
'        T2,T3 - м.б. опущены, тогда предполагается T2=2,T3=50
' Например : ieBusy ie,"60;5;4;100" - ждать готовности не более 60сек,после чего через 5 сек 4 раза с периодом 100msec ее проверить.
'        N,T0,T1 -  м.б. дробными с разделитем "." или ","
' Descr - Если не пустой, то при невозможности дождаться незанятости , выполнение прерывается с сообщением, которое
'         содержит Descr. 
'         Если пустой , то при невозможности дождаться незанятости , в Descr заносятся параметры цикла ожидания, а
'         в функции производится возврат  : 0 - ie освободился, 1 - остался Занятым
Dim n,n1, T, flDescr
Const READYSTATE_COMPLETE=4, SlipPeriod =100
If typename(TimeOut)="String" Then 
 T=Split(TimeOut,";") 
 T(0)=CDblDotComma(T(0))*1000 : T(1)=CDblDotComma(T(1))*1000 ' приведение к msec
 If UBound(T)=1 Then
  ReDim Preserve T(3)
 End If
 If T(2)="" Then T(2)=2 : If T(3)="" Then T(3)=50
 T(2)=CLng(T(2))        : T(3)=CDblDotComma(T(3))
Else
 ReDim T(1)
 T(0)= TimeOut*1000  : T(1)= 0 ' - без проверки на вшивость
End If 
flDescr=Not (Descr="" Or IsNull(Descr) Or IsEmpty(Descr))

On Error Resume Next ' - на случай , если обработчики событий от IE закроют Quit этот объект.

n=0 : ieBusy=(ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE )
Do While ieBusy And  Err.Number=0
 'WriteLog "n=" & n & "TimeOut=" & T(0) & "ie.Busy=" & ie.Busy & ",ie.ReadyState=" & ie.ReadyState
 WScript.Sleep SlipPeriod '  DoEvents
 ieBusy=(ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE )
 n=n+SlipPeriod : If T(0)>0 Then If n>=T(0) Then Exit Do
Loop

n1=0
If T(1)>0 And Not ieBusy  And  Err.Number=0 Then ' При необходимости - проверка Готовности на вшивость
 WScript.Sleep T(1) '  - в течении T(1) готовность может теряться, но после этого она д.б. воспроизводима T(2) раз с T(3) msec перерывом
 While n1<T(2) And  Not ieBusy  And  Err.Number=0
  n1=n1+1 : ieBusy=(ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE )
  If n1<T(2) then WScript.Sleep T(3) '  DoEvents
 Wend
 n1=T(1)+n1*T(3)
End If 
n=n+n1 ' - сколько всего msec ждали

Descr=Time & ";" & "n=" & n & ";TimeOut=" & TimeOut &  ";ie.Busy=" & ie.Busy & ";ie.ReadyState=" & ie.ReadyState & ";" & Descr
AccumulateLog Descr

If flDescr And (ieBusy Or Err.Number<>0) Then 
 ie.Quit: ErrRiseMsg= "Невозможно дождаться готовности IE или случилась какая-то ошибка" & vbCrLf & Descr :  WScriptQuit '-->>
End If 
End Function ' ieBusy -->>

Там хорошо видно, что процесс «iexplore.exe», являющийся хостом для объекта "InternetExplorer.Application", является дочерним процессом по отношению к «svchost.exe».

Это, если прежде пользователем не открыты окна IE, а если они уже открыты, то IEXPLORER.EXE от моего объекта "InternetExplorer.Application" вообще не виден ни  в svchost.exe , ни отдельно среди пользовательских, которые  дочерние для Explorer.exe без параметров запуска.
При этом, если скрипт при отладке сорван, и после закрыты пользовательские IEXPLORER окна крестиком, то в дочерних для Explorer.exe ОСТАЕТСЯ этот сорванный IEXPLORER.EXE .

33

Re: VBS: программное заполнение Web-форм-2

помогите пожалуйста, на сайте кнопка создаётся вот таким способом

<form method="post" name="form_prolong">
<div class="div_button">
<input type="submit" name="prolong" value="продлить" class="button">
</div>
</form>

если я правильно понимаю - с помощью set form=ie.document.forms(0) создается ссылка на объект из всех форм открытой скриптом в ИЕ страницы, но в этом случае кнопка создаётся не прямо формой, хоть и имеющей имя, а с помощью div внутри формы, поэтому если пытаться form.submit (form.form_prolong.submit) , или даже set form=ie.document.forms(form_prolong) - ссылаться на конкретную форму, то даже возможно и "submit-ится" , но безрезультатно... или пишет, что объект такого свойства не имеет или такого объекта нет (интуитивно испробовал разные "варианты" написания). как делать в таком случае и главное правильно ли я понимаю суть???
а можно сделать, чтоб не вся страница грузилась, а только нужная часть?

34

Re: VBS: программное заполнение Web-форм-2

bomz, можете привести прямую ссылку на страницу с этой формой?

35 (изменено: bomz, 2009-08-25 13:02:49)

Re: VBS: программное заполнение Web-форм-2

я за день понял, что все хитрее, возможно... потому что не смог там и заполняемые формы заполнить.

пароль seriiforum
scriptcoding.info@gmail.com 
имя script
фамилия:  script
Фамилия:  coding
номер моего первого телефона 12345678

http://ifolder.ru/
логин:  scriptcoding.info
E-mail: scriptcoding.info@gmail.com
дата рождения 1.1.2000
пол - мужской
пароль: seriiforum

http://ifolder.ru/control/?file_id=13690467&code=e90a6fb26cab4578dbe76ca23a8b9f41

неделю как про эти скрипты начал читать, до этого только бейсик в школе учил.

форум почитал - не знаю куда писать. вижу что вопрос мигающей консоли еще возникает. есть такая прога Bat_To_Exe_Converter легко ее найти гуглой с талбеткой. вот при конвертации тама кнопошка есть  "сделать невидимым". и соответсвенно никакой консоли не будет. размер екзешника приемлимый (такого порядка пара строк 22,0 КБ (22 528 байт). ну и это помимо иконки и включаемых файлов.

36

Re: VBS: программное заполнение Web-форм-2

Ничего не понял.

37 (изменено: bomz, 2009-08-25 15:55:32)

Re: VBS: программное заполнение Web-форм-2

надеюсь не в коде страницы. это я зарегил почтовый ящик на гугле, на него аккаунт на ифолдере. самое нижнее ссылка на страницу, но чтоб на нее попасть надо залогинится на ифолдере. если надо пароль можно сменить и аккаунтами пользоватся, с модным именем.

38

Re: VBS: программное заполнение Web-форм-2

Здравствуйте.
Собственно, в связи с написанием VBScript для автоматического заполнения формы анкеты на web-странице одного сайта, возник вопрос: как программно нажать кнопку «Дальше», то есть произвести так называемый «click» на кнопке. Просмотрел много сайтов по данному вопросу, однако, к сожалению, решение не нашел…
Спасибо.

Здесь часть кода формы с описанием кнопки "Дальше":

    }
}
        document.getElementById('disclaimer_submit').innerHTML = '<input type="button" value="Дальше" onclick="hide(\'disclaimer\');show(\'form_button\');show(\'form\');hide(\'extra_buttons\');" class="button" />';
                check_requere();
    list_fields=true;
    function hide_saugoti()
    {
        document.getElementById('txtfile').innerHTML = '';
        document.getElementById('txtfile').className = '';
        document.getElementById('pdfprint').innerHTML = '';
        document.getElementById('pdfprint').className = '';
    }
    function fix_stars()
    {

39

Re: VBS: программное заполнение Web-форм-2

Приведите ссылку на страницу.

40 (изменено: Pers2012, 2013-06-07 11:50:50)

Re: VBS: программное заполнение Web-форм-2

alexii пишет:

Приведите ссылку на страницу.

41 (изменено: mozers, 2013-06-04 22:29:45)

Re: VBS: программное заполнение Web-форм-2

как программно нажать кнопку «Дальше»

document.getElementsByName("submit")[0].click()

42

Re: VBS: программное заполнение Web-форм-2

mozers пишет:

как программно нажать кнопку «Дальше»

document.getElementsByName("submit")[0].click()

К сожалению, выдаёт ошибку с указанием на необходимость «окончания инструкции»…

43

Re: VBS: программное заполнение Web-форм-2

По ходу возник ещё один вопрос:
что должно находиться в «.getElementByID("…………..").value = "M"» для того, чтобы выбрать «мужской»

Код:

  <div class="border_f" id="b_10">
            <table
                class="item_f"
                style="visibility:visible;position:static;left:-1000px;top:-1000px;"
                id="input_10"
            >
                <tr>
                  <td class="label" id="label_10">
                  
                
                      <span class="index" >8.</span>
                                                                Пол 
                     <span class="star">*</span>                                                                                                                                                                           <img
                          src="templates/img/klaustukas.gif"
                                                    style="margin:0 0 0 10px;"
                          onmouseover="return overlib('Выберите подходящий вариант из числа предложенных.',FGCOLOR,'#008803',TEXTCOLOR,'#ffffff',WIDTH,200);" onmouseout="nd();"
                          />
                                                                                    </td>
                  <td>                   
                                
                                                                                                                                                          
                                                  <div class="radio">
                              
                              <input
                              type="radio"
                              id="radio_10_M"
                              name="form_data[10][1]"
                              value="M"
                                                            class="radio"
                                                                                          />
                                                                                                                                                       Мужчина
                             
                          </div>
                                                                              
                                                  <div class="radio">
                              
                              <input
                              type="radio"
                              id="radio_10_F"
                              name="form_data[10][1]"
                              value="F"
                                                            class="radio"
                                                                                          />
                                                                                                                                                          Женщина
                             
                          </div>
                                                                              <input id="input_10_1_name" type="hidden" value="8. Пол"/>
                                      </td>
                  </tr>
            </table>
        </div>                    
       

44

Re: VBS: программное заполнение Web-форм-2

Pers2012, «по ходу», приведите ссылку на страницу ещё раз.

45

Re: VBS: программное заполнение Web-форм-2

https://kiris.urm.lt/by1/index.php?id=f … g=RU_BY1_1

46

Re: VBS: программное заполнение Web-форм-2

Как-то так (не проверялось):

.getElementByID("radio_10_M").checked = true

checked attribute | checked property (Internet Explorer)

47

Re: VBS: программное заполнение Web-форм-2

Огромное спасибо.
Всё работает...

48 (изменено: Pers2012, 2013-07-07 09:50:02)

Re: VBS: программное заполнение Web-форм-2

В продолжение изучения мной темы, связанной с автоматизацией заполнения форм, столкнулся с небольшой проблемой, которую не могу осилить самостоятельно…
Код:

<form id="flightBookingForm" method="POST" action="https://www.bookryanair.com/SkySales/booking.aspx?culture=en-ie&amp;lc=en-lt">
<input style="" tabindex="15" type="submit" class="bookFlightButton" value="Book Now">
</form>

Вопрос: как с помощью метода Focus() или иного метода VBS активировать кнопку "Book Now" для дальнейшего её нажатия с клавиатуры?

.getElementByID("flightBookingForm").submit() не подходит, поскольку сайт распознаёт программное нажатие кнопки "Book Now" и сбрасывает всё для заполнения формы снова.

Спасибо.

49

Re: VBS: программное заполнение Web-форм-2

Pers2012, скорее всего либо что-то не заполнили, либо какой-нибудь hidden пропустили.

50

Re: VBS: программное заполнение Web-форм-2

… перепроверил – похоже ничего не пропустил. При этом на последнем этапе, при использовании SendKeys Method, а именно, программно нажав на клавиатуре клавишу {TAB} – 19 раз (!), которая активирует на web-странице нужную кнопку «Book Now», а затем {ENTER} – всё срабатывает нормально, и сайт пропускает пользователя на следующую страничку, открывая доступ для просмотра данных.
Вместе с тем, сам по себе SendKeys метод работает не идеально, часто происходят сбои - {TAB} активирует не ту кнопку :-), в результате чего происходит сбой в работе VBS. Вот поэтому хочу опробовать метод Focus(), да только знаний маловато… Посетил ряд сайтов, однако ответа для себя не нашёл. Вернее, рассмотренные там варианты в моём случае не сработали. Нужен совет…

51

Re: VBS: программное заполнение Web-форм-2

Программный вызов form.submit() не вызывает обработчик form.onsubmit, его, может быть, необходимо (а, может, и достаточно) вызвать перед form.submit(); так же какие-то проверки могут выполняться в обработчике submit_button.onclick.
Чтобы не выковыривать, что же делают эти обработчики и не вызывать их или воспроизводить их действия, можно попробовать вместо form.submit() вызвать form.submit_button.click() (т.е. программно щёлкнуть по кнопке отправки формы без всяких SendKeys-ов):

document.forms.item("flightBookingForm").elements.item(SUBMIT BUTTON INDEX).click()
Pers2012 пишет:
mozers пишет:

как программно нажать кнопку «Дальше»

document.getElementsByName("submit")[0].click()

К сожалению, выдаёт ошибку с указанием на необходимость «окончания инструкции»…

Просто это JavaScript (квадратные скобки).

52

Re: VBS: программное заполнение Web-форм-2

wisgest пишет:

Программный вызов form.submit() не вызывает обработчик form.onsubmit, его, может быть, необходимо (а, может, и достаточно) вызвать перед form.submit(); так же какие-то проверки могут выполняться в обработчике submit_button.onclick.
Чтобы не выковыривать, что же делают эти обработчики и не вызывать их или воспроизводить их действия, можно попробовать вместо form.submit() вызвать form.submit_button.click() (т.е. программно щёлкнуть по кнопке отправки формы без всяких SendKeys-ов):

document.forms.item("flightBookingForm").elements.item(SUBMIT BUTTON INDEX).click()

Выдаёт ошибку - error: Предполагается наличие ')'
Возможно, здесь: (SUBMIT BUTTON INDEX) необходимо так записать: ("SUBMIT BUTTON INDEX")

wisgest пишет:

Просто это JavaScript (квадратные скобки).

Да, большое спасибо. В дальнейшем догадался, и так сделал...

53

Re: VBS: программное заполнение Web-форм-2

Проблема решена в такой вариации:

objIE.document.forms.item("flightBookingForm").elements.item(SUBMIT, BUTTON, INDEX).click()

Всем большое спасибо.

Однако… возможно подскажите решение и через метод Focus()

54

Re: VBS: программное заполнение Web-форм-2

Pers2012 пишет:

Возможно, здесь: (SUBMIT BUTTON INDEX) необходимо так записать: ("SUBMIT BUTTON INDEX")

Нет, здесь необходимо записать всего лишь индекс submit-кнопки в наборе элементов формы (если у кнопки есть атрибут name или id, лучше использовать, конечно, его). Т.к. какие ещё элементы есть в форме и в каком порядке, я не знаю, то и указать определённое число я не мог. Поэтому я нарочно выделил эти слова заглавными буквами и разделил пробелами, чтобы при бездумном копировании в этом месте возникла синтаксическая ошибка и заставила задуматься.

Pers2012 пишет:

Однако… возможно подскажите решение и через метод Focus()

А что даст установка фокуса на кнопке? — всё равно после .focus() надо будет делать .click().

55

Re: VBS: программное заполнение Web-форм-2

wisgest пишет:

А что даст установка фокуса на кнопке?

… знания…

wisgest пишет:

— всё равно после .focus() надо будет делать .click().

... или {ENTER} при использовании SendKeys Method.
Последний вариант для меня также интересен...

56 (изменено: wisgest, 2013-07-08 23:30:25)

Re: VBS: программное заполнение Web-форм-2

.focus() — такой же метод элементов документа как и .click(), вызывается одинаково:

objIE.document.forms.item("flightBookingForm").elements.item(ИНДЕКС).focus()
WshShell.SendKeys "{Enter}"

57

Re: VBS: программное заполнение Web-форм-2

Благодарю за науку… Всё идеально работает.

58 (изменено: alexii, 2014-10-10 14:52:31)

Re: VBS: программное заполнение Web-форм-2

Помогите нажать кнопку, есть определенный сайт на нем есть кнопка <input align="left" type="submit" name="hello" value="Привет">
Что должно происходить по запуску скрипта открывается IE переходит на сайт и нажимает эту кнопку вот что есть сейчас

Option Explicit

Const READYSTATE_COMPLETE = 4

Dim objIE
Dim objForm

Set objIE = WScript.CreateObject("InternetExplorer.Application")

With objIE
    '.Visible = False
    .Visible = True
    
    .Navigate "http://***.**.***.**/**/index.php/disc"
    End With
    Do
        WScript.Sleep 100
    Loop Until Not .Busy And .ReadyState = READYSTATE_COMPLETE
Set objIE = Nothing

WScript.Quit 0

59

Re: VBS: программное заполнение Web-форм-2

ghostgloom,


1) В данном случае, если это целиковый скрипт, то строки кода


Set objIE = Nothing

WScript.Quit 0

не являются необходимыми.

2) В темах выше (в частности даже в первом посте) уже были приведены примеры как поставить фокус на кнопку и выполнить нажатие. Что-то помешало Вам их использовать ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !