Что нового

Залогиниться на сайт, форма которого на JavaScript

Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
madmasles [?]
ТАк тоже не нажимает.
Тут получается "странная" структура - есть form в ней лежит table, в таблице лежит td, в колонке лежит еще одна table, а уже в этой таблице в td лежит данный div.
Может возможно "нажать" по форме?
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Код:
<form id="isc_2K" style="margin-bottom: 0px;" onsubmit="return isc_DynamicForm_1.$10d()" onreset="isc_DynamicForm_1.resetValues(); return false;" action="#" encType="application/x-www-form-urlencoded" method="post">
<TABLE id=isc_2L border=0 cellSpacing=0 cellPadding=2 width=344>
<COLGROUP>
<COL width=100>
<COL width=244>
<TBODY>
<TR style="POSITION: absolute">
<TD style="BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: transparent; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; HEIGHT: 0px; OVERFLOW: hidden; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px"></TD>
<TD style="BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: transparent; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; HEIGHT: 0px; OVERFLOW: hidden; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px"></TD></TR>
<TR>
<TD id=isc_2M class=formTitle vAlign=middle align=right $9a="$9g" $89="CheckboxItem"> </TD>
<TD id=isc_2N class=formCell align=left $89="CheckboxItem">
<TABLE style="BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: transparent; MARGIN: 0px; PADDING-LEFT: 0px; WIDTH: 240px; PADDING-RIGHT: 0px; WHITE-SPACE: normal; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px" id=isc_2O class=formCell border=0 cellSpacing=0 cellPadding=0>
<TBODY>
<TR>
<TD style="BACKGROUND-IMAGE: none; BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-BOTTOM: 0px; BACKGROUND-COLOR: transparent; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; HEIGHT: 20px; BORDER-TOP: 0px; BORDER-RIGHT: 0px; PADDING-TOP: 0px" vAlign=middle>
<DIV style="WIDTH: 240px; WHITE-SPACE: nowrap" id=isc_2P class=labelAnchor tabIndex=2246 $9a="$9d" $89="CheckboxItem"><IMG style="MARGIN-LEFT: 4px; VERTICAL-ALIGN: middle; MARGIN-RIGHT: 3px" id=isc_2Q border=0 align=absMiddle src="unchecked.png" width=13 height=13 suppress="TRUE" eventpart="valueicon">User?</DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Velmor
А так?
Код:
;~ ...
$oForm = _IEGetObjById($oIE, 'isc_2K')
If Not @error Then _IEFormSubmit($oForm)
;~ ...
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Добрый день.
madmasles, спасибо Вам за помощь.

Код:
$oForm = _IEGetObjById($oIE, 'isc_2K')
If Not @error Then _IEFormSubmit($oForm)

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

Попробовал проверить, может не ту форму заполняю:
Код:
Local $oForms = _IEFormGetCollection($oIE)
MsgBox($MB_SYSTEMMODAL, "Element Info", "There are " & @extended & " Element(s) on this page")

For $oForm In $oForms
    MsgBox($MB_SYSTEMMODAL, "form ID", $oForm.id)
Next

В результате 6 форм, но 4 из них отвечают за другие элементы. А другие две - одна логин+пароль, вторая - CheckBox+кнопка SingIn (с которыми и работаю).
Хотя, когда мышей+клавиатурой заполнять - все ок...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Velmor [?]
В результате 6 форм, но 4 из них отвечают за другие элементы.
А если сделать так?
Код:
;~ ...
Local $iIndex = 0, $oForms = _IEFormGetCollection($oIE)
ConsoleWrite('Count: ' & @extended & @LF)
For $oForm In $oForms
	ConsoleWrite($iIndex & @TAB & $oForm.id & @LF)
	_IEFormSubmit($oForm)
	Sleep(2000)
Next
;~ ...
Может, найдется нужная форма?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Как в битве экстрасенсов. Кто же найдет верное решение... :beer:
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
inververs
Плохая у Вас шутка.

madmasles
Запустил код, приведенный выше Вами, вот такой результат:
Код:
Count: 6
0	isc_7
0	
--> IE.au3 T3.0-1 Error from function _IEFormSubmit, $_IESTATUS_COMError (-2147024891)
0	
--> IE.au3 T3.0-1 Error from function _IEFormSubmit, $_IESTATUS_COMError (-2147024891)
0	
--> IE.au3 T3.0-1 Error from function _IEFormSubmit, $_IESTATUS_COMError (-2147024891)
0	
--> IE.au3 T3.0-1 Error from function _IEFormSubmit, $_IESTATUS_COMError (-2147024891)
0	
--> IE.au3 T3.0-1 Error from function _IEFormSubmit, $_IESTATUS_COMError (-2147024891)
Может быть проблема в IE, что он не корректно с JS работает? Или возможно сделать весь процесс входа и дальнейших действий не через браузер?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Velmor
Скриншот браузера с окном регистрации можете показать?
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
InnI
Добавил скрин в приложение.

Кстати, я заметил такой момент - когда заполняю поля логин/пароль функцией _IEFormElementSetValue или .value="UserName", то в поле появляется значение, но оно не "работает" - тоесть если так ввести логин/пароль и руками нажать на "SingIn", получаю сообщение "User Name and Password Cannot be Empty". Чтобы при таком вводе сработало - нужно просот кликнуть мышей по полям и тогда логинится.
 

Вложения

  • IE_login.jpg
    IE_login.jpg
    172.3 КБ · Просмотры: 30

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Velmor
Скачайте UIAutomate. Запустите скрипт при открытом окне регистрации. Ошибки (при наличии) будут выведены в консоль SciTE. Если я не угадал с именами, найдите их сами при помощи Inspect (значение свойства Name).
Код:
#include "UIAutomate.au3"

$UserName = "YourName"
$Password = "YourPass"

$hCtrl = ControlGetHandle("[class:IEFrame]", "", "Internet Explorer_Server1")
$oParent = _UIA_GetElementFromHandle($hCtrl)

; поле UserName
$oUser = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "username")
_UIA_ElementSetFocus($oUser)
_UIA_ElementTextSetValue($oUser, $UserName)
; ControlSend("[class:IEFrame]", "", "Internet Explorer_Server1", $UserName)

; поле Password
$oPass = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "password")
_UIA_ElementSetFocus($oPass)
_UIA_ElementTextSetValue($oPass, $Password)
; ControlSend("[class:IEFrame]", "", "Internet Explorer_Server1", $Password)

; флажок (нужно подставить реальное имя)
_UIA_ElementDoDefaulAction(_UIA_GetControlTypeElement($oParent, "UIA_CheckBoxControlTypeId", "Реальное имя"))

; кнопка Sign In
_UIA_ElementDoDefaulAction(_UIA_WaitControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Sign In"))
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Velmor, попробуйте программно установить фокус в поле ввода. И после этого кликнуть по "SingIn"
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
InnI
Подскажите, пожалуйста, что я не так сделал? Запустил "Inspect.exe", ткнул в поле "логина" - записал "User Name" в
Код:
$oUser = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "User Name")

и тоже самое повторил для пароля. А результат такой:
Код:
!> _UIA_GetControlTypeElement : элементы указанного типа не найдены
!> _UIA_ElementDoDefaulAction : параметр не является объектом
!> _UIA_WaitControlTypeElement : превышено время ожидания
!> _UIA_ElementDoDefaulAction : параметр не является объектом

edyapd
Что Вы имеете в виду? Сделать
Код:
MouseClick("left", 100, 100, 1, 0)

так?
 

Вложения

  • IE_login1.jpg
    IE_login1.jpg
    196.6 КБ · Просмотры: 21

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Velmor [?]
Правильно вы сделали. У вас в полях логина и пароля должен был появиться текст из переменных $UserName и $Password. Если не появился - раскомментируйте ControlSend().

результат такой
А это результат для флажка и кнопки. С ними тоже нужно сделать, как с полями ввода: найти и вписать правильные ControlType и Name.
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
InnI
Сделал как Вы указали - в консоли результат тот же и поля в браузере пустые... Если имеет значение, версия IE 9.0.8112.16421

Насколько я понимаю, основная проблема в ONINPUT="isc_TextItem_1.$43g()", тоесть браузер почему-то не понимает, что в него что-то ввели или просто не вызывается функция по ONINPUT
Код:
<INPUT style="MARGIN-TOP: -1px; WIDTH: 140px; MARGIN-BOTTOM: -1px; HEIGHT: 16px" id=isc_2E class=textItem tabIndex=2240 name=userName $9a="$9b" $89="isc_TextItem_1" AUTOCOMPLETE="OFF" ONINPUT="isc_TextItem_1.$43g()" handleNativeEvents="false">
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Velmor сказал(а):
Кстати, я заметил такой момент - когда заполняю поля логин/пароль функцией _IEFormElementSetValue или .value="UserName", то в поле появляется значение, но оно не "работает" - тоесть если так ввести логин/пароль и руками нажать на "SingIn", получаю сообщение "User Name and Password Cannot be Empty". Чтобы при таком вводе сработало - нужно просот кликнуть мышей по полям и тогда логинится.
Когда вы кликаете мышкой по элементу, то устанавливаете фокус на этом элементе. Раз у вас получается ввести туда значения, то можно попытаться и установить фокус с помощью
Код:
_IEAction($o_object, "focus")
И потом уже нажимать на "SingIn"
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Velmor [?]
поля в браузере пустые
Так как доступ к этому сайту только у вас, придётся вам самостоятельно изучить реакцию элементов на события. Это не сложно.
Для начала нажмите на панели Inspect значок жёлтой рамки (или выберите в меню "Options - Show Highlight Rectangle") - текущие объекты будут подсвечиваться. Переместите курсор мыши на элемент, например на поле ввода. Через секунду элемент должен подсветиться жёлтой рамкой и информация в Inspect изменится. Теперь в меню Inspect "Action" появятся пункты с возможными командами для этого элемента. Изучите реакцию элементов: для полей ввода на команды Focus и LegacyIAccessible.SetValue, для флажка и кнопки на команду LegacyIAccessible.DoDefaultAction. Если элементы реагируют на эти команды и успешно проходит авторизация, то используйте соответствующие функции. В противном случае нужно будет использовать функции, связанные с кликами мышью и ControlSend (или Send).
Если совсем ничего не получится, то выкладывайте информацию, которую отображает Inspect по этим элементам, результаты ваших исследований и снимок дерева Inspect с раскрытыми ветвями этих элементов (думаю они идут друг за другом, но возможны вложения).


Добавлено:
Сообщение автоматически объединено:

И всё-таки. Почему вы отказываетесь от варианта, предложенного мной в Ответ #10? ControlClick() и ControlSend() работают и в неактивном и в свёрнутом окне. Если вы считаете, что это "костыль", то UIAutomate - это "инвалидная коляска", которой ещё нужно уметь управлять.
 
Автор
V

Velmor

Новичок
Сообщения
27
Репутация
0
Добрый день.
Спасибо Вам большое за помощь. InnI, Ваша разработка не сравнима с обычной отправкой по "таргету". Я говорил про "костыль" потому, что на сайте могут добавить/убрать всякие элементы, поменять их местами и т.п. Тоесть при каждом подобном изменении пришлось бы переписывать кусок, что очень не желательно. Именно по этому я хотел сделать привязку к id, т.к. шанс их изменения крайне низкий, плюс хотел сделать работу браузера в "invisible" режиме.
В итоге, Вы привели меня к решению, за что благодарен Вам. Выглядит так:
Код:
#include <IE.au3>

$login = "MyUserName"
$pass = "MyPassword"

$oIE = _IECreate("https://mt.opc.com/mt/")
_IELoadWait ($oIE, 1000)  ; задержка нужна, что бы отработал JavaScript

Local $oForm = _IEGetObjById($oIE, "id_form")

Local $iLogin = _IEFormElementGetObjByName($oForm, "userName")
_IEFormElementSetValue($iLogin, $login)
_IEAction($iLogin, "focus")  ; focus понадобился, чтобы активировать форму (имитировать выделение поля для того, что бы сработал JS "ONINPUT")

Local $iPass = _IEFormElementGetObjByName($oForm, "password")
_IEFormElementSetValue($iPass, $pass)
_IEAction($iPass, "focus")  ; focus понадобился, чтобы активировать форму (имитировать выделение поля для того, что бы сработал JS "ONINPUT")

Local $hWnd = _IEPropertyGet($oIE, "hwnd")

; Делаю активным элемент по id, что бы потом "нажать по нему" пробелом (SPACE использую потому, что на него реагирует форма и переводит CheckBox в состояние check/uncheck)
Local $oForm2 = _IEGetObjById($oIE, "id_form2")
_IEAction($oForm2, "focus")
ControlSend($hWnd, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", "{SPACE}")

; Делаю активным элемент по id, что бы потом "нажать по нему" пробелом (SPACE использую потому, что на него реагирует форма и нажимается кнопка SingIn, срабатывает "ONCLICK")
Local $oForm3 = _IEGetObjById($oIE, "id-form3")
_IEAction($oForm3, "focus")
ControlSend($hWnd, "", "[CLASS:Internet Explorer_Server; INSTANCE:1]", "{SPACE}")


Но если браузер не активный, то появляется сообщение "User Name and Password Cannot be Empty" и пока не знаю, что с этим делать.
 
Верх