PDA

Показать полную графическую версию : [решено] Как нажать на ява-кнопку


zbruy
05-10-2009, 01:18
Простите за тупой вопрос, как съэмулиповать нажатие такой кнопки?:
<td><a href="javascript:document.loginForm.submit();"><img src="http://www.сайт.ru/assets/image/button_small-trans.png"></a></td>
Ну тоесть используем скажем конструкцию:
$oIE = _IECreate (" http://www.сайт.ru/")
_IELoadWait ($oIE)
$oUser =_IEGetObjByName($oIE,"login")
$oPass =_IEGetObjByName($oIE,"password")
_IEFormElementSetValue ($oUser, 'ник')
_IEFormElementSetValue ($oPass, 'пароль')
и натыкаемся на вышеописанную кнопку, как ее в итоге нажать? А то помучился, но так и не сообразил

Medic84
05-10-2009, 13:59
_IEFormSubmit :blink:

zbruy
06-10-2009, 00:53
_IEFormSubmit
и как ее этой функцией привентить?

evg64
06-10-2009, 08:41
Пожалуй, вот так:

$oIE = _IECreate (" http://www.сайт.ru/")
_IELoadWait ($oIE)
$Form=_IEFormGetObjByName($oIE,"loginForm"); насколько я понял, в данном примере форма называется loginForm, хотя в каждом случае отдельно смотреть надо название формы
$oUser =_IEGetObjByName($Form,"login")
$oPass =_IEGetObjByName($Form,"password")
_IEFormElementSetValue ($oUser, 'ник')
_IEFormElementSetValue ($oPass, 'пароль')
_IEFormSubmit($Form)

Если что-то не получится, дайте название сайта, посмотрим :)

zbruy
06-10-2009, 11:22
Ага, спасибо, сделал уже вчера, как-то так..:

#include <IE.au3>
Opt("TrayIconDebug",1)
$oIE = _IECreate (" http://www.сайт.ру")
$oUser =_IEGetObjByName($oIE,"login")
If @Error = 0 Then
_IELoadWait ($oIE)
$oSubmit = _IEGetObjByName ($oIE,"loginForm")
$oUser =_IEGetObjByName($oIE,"login")
$oPass =_IEGetObjByName($oIE,"password")
_IEFormElementSetValue ($oUser, 'ник')
_IEFormElementSetValue ($oPass, 'йцукен')
_IEFormSubmit ($oSubmit, "click")
EndIf

evg64
06-10-2009, 18:31
Если нет иных ссылок, имеющих статическую часть "http://192.168.12.158/infa1", можно так:

#include <IE.au3>
Opt("TrayIconDebug",1)
$oIE = _IECreate (" http://www.сайт.ру")
$Links=_IELinkGetCollection($oIE)
for $Link in $Links
if StringInStr(_IEPropertyGet($Link,"innerhtml"),"http://192.168.12.158/infa1")<>0 then
$Link.click
exitloop
endif
next

Либо если текст ссылки всегда постоянен, можно так:

#include <IE.au3>
Opt("TrayIconDebug",1)
$oIE = _IECreate (" http://www.сайт.ру")
$Links=_IELinkGetCollection($oIE)
for $Link in $Links
if _IEPropertyGet($Link,"innertext")=="текст ссылки" then
$Link.click
exitloop
endif
next

evg64
06-10-2009, 21:16
В первом скрипте все ссылки перебираются по очереди. Если программа определяет, что в текущей ссылке имеется кусок "http://192.168.12.158/infa1", она кликнет по этой ссылке, каким бы ни было продолжение.

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

zbruy
06-10-2009, 22:49
evg64, да, но ведь изначально кусок ссылки "http://192.168.12.158/infa1" в коде страницы не указывается, там есть только '?response=3&info=12' кусок. Поэтому скрипт ничего не найдет. Мысль я понял. Но простой поиск даже если я буду искать скажем по шаблону ?response=3&info= найти то он найдет, затем нужно эту ссылочку собрать, чтобы по ней перейти=)

evg64
07-10-2009, 08:14
http://192.168.12.158/infa1?response=0&info=хх
хх - две цифры?
Тогда:

#include <IE.au3>
$FinalLink=""
$LinkFound=0
Opt("TrayIconDebug",1)

$oIE = _IECreate (" http://www.сайт.ру")
$Links=_IELinkGetCollection($oIE)
for $Link in $Links
if StringInStr(_IEPropertyGet($Link,"innerhtml"),"?response=0&info=")<>0 then ; находим ссылку с частью "?response=0&info=", насколько я понял, она на странице одна-единственная
for $i=0 to 99; начинаем перебирать варианты от 00 до 99
$LinkPart="?response=0&info="&$i
if $i<10 then $LinkPart="?response=0&info=0"&$i
if _IEPropertyGet($Link,"innerhtml")==$LinkPart then ; если есть совпадение, значит компонуем финальную ссылку в следующей строке и выходим из циклов
$FinalLink="http://192.168.12.158/infa1"&$LinkPart
$LinkFound=1
exitloop
endif
next
endif
if $LinkFound then exitloop
next
msgbox(0,"Искомая ссылка:",$FinalLink)

Sp01LeR
07-10-2009, 15:04
Она бы подошла если б сразу написать пример исходного URL. Вот, подкорректированный рабочий вариант(ищет и помещает в массив результатов только первую ссылку):


#include <IE.au3>
#include <INet.au3>
#include <Array.au3>

Dim $prot = "http://"
Dim $domen = "192.168.12.158"
Dim $delim = "/"
Dim $s_get = "infa1"
Dim $s_page = "index.html"
;Dim $browser = "iexplore.exe"

$get_data = _INetGetSource($domen&$delim&$s_get)


If @Error = 1 Then
MsgBox(16, "Error", "Не могу загрузить страницу!")
Exit
Else
MsgBox(4096, "Ok!", "Загружено: "&StringLen($get_data)&" байт")
EndIf

$qts = "['""]"
$prs_data = "<a.*href="&$qts&"(\?response=0&info=[0-9]+)"&$qts& _
".*>(.[^><]*)</a><br/><br/>"
$prs_arr = StringRegExp($get_data, $prs_data, 1)

If UBound($prs_arr) > 0 Then
_ArrayDisplay( $prs_arr, "Результаты поиска:" )
_IECreate ($prot&$domen&$delim&$s_get&$prs_arr[0])
Else
MsgBox(16, "RegExp Error", "Ошибка поиска по шаблону. Код ошибки="&@error)
EndIf


В строке:
Dim $s_page = "index.html"
"index.html" нужно заменить на страницу с сылками.

zbruy
07-10-2009, 19:37
Огромное спосибо за поддержку, а можно объединить как нибудь старый вариант и эту схему, потому как этот отдельно не подходит, из-за того, что вначале необходимо пройти авторизацию=)

Sp01LeR
08-10-2009, 14:02
#include <IE.au3>
#include <INet.au3>
#include <Array.au3>
Opt("TrayIconDebug",1)

Dim $prot = "http://"
Dim $domen = "192.168.12.158"
Dim $delim = "/"
Dim $s_get = "infa1"
Dim $s_page = "index.html"

$oIE = _IECreate ($domen&$delim&$s_page)
$oSubmit = _IEGetObjByName ($oIE,"loginForm")

If $oSubmit <> 0 Then
$oUser =_IEGetObjByName($oIE,"login")
$oPass =_IEGetObjByName($oIE,"password")
_IEFormElementSetValue ($oUser, 'ник')
_IEFormElementSetValue ($oPass, 'йцукен')
$act_submit = _IEFormSubmit ($oSubmit)
If $act_submit == -1 Then
_IELoadWait ($oIE)
Else
MsgBox(16, "Error", "Ошибка авторизации")
Exit
EndIf
Else
MsgBox(16, "Error", "Ошибка при загрузке страницы """& _
$domen&$delim&$s_page&"""")
Exit
EndIf

$get_data = _IEBodyReadHTML($oIE)

If @Error Then
MsgBox(16, "Error", "Не могу загрузить данные!")
Exit
EndIf

$qts = "['""]"
$prs_data = "<a.*href="&$qts&"(\?response=0&info=[0-9]+)"&$qts& _
".*>(.[^><]*)</a><br/><br/>"
$prs_arr = StringRegExp($get_data, $prs_data, 1)

If UBound($prs_arr) > 0 Then
_ArrayDisplay($prs_arr, "Результаты поиска:")
_IENavigate($prot&$domen&$delim&$s_get&$prs_arr[0])
Else
MsgBox(16, "RegExp Error", "Ошибка поиска по шаблону. Код ошибки="&@error)
EndIf


Могут быть ошибки при сабмите формы, рекомендую основательно протестировать работу скрипта.

zbruy
08-10-2009, 14:40
Огромнейшее спасибо, не скажу, что работает, вылетают ошибки на $prs_data, но, главное есть та конструкция которую я и искал, вечером попробую поиграть с настройкой шаблона, с меня стакан красного=)

Sp01LeR
08-10-2009, 20:17
Выше в скрипте ошибка - нет обьекта $oIE:
_IENavigate($oIE, $prot&$domen&$delim&$s_get&$prs_arr[0])

вылетают ошибки на $prs_data »
Возможно, что искомая комбинация размещена в двух и более строках, а этот шаблон для поиска ищет только в одну строку.

Для многострочного поиска по шаблону $prs_data будет такой:
$prs_data = "(?s)<a.*href="&$qts&"(\?response=0&info=[0-9]+)"&$qts& _
".*>(.[^><]*)</a>"




© OSzone.net 2001-2012