Что нового

Как заполнить форму авторизации не имеющую ID и Name атрибутов

AlexWolf

Новичок
Сообщения
8
Репутация
0
Помогите продолжить скрипт авторизации на сайте..
С помощью примеров форума заполнил успешно формы: Фамилия и Имя. Не могу заполнить дополнительные формы, не имеющие ID и Name атрибутов, на которых я и тормознул.. Вот они: Дата, Месяц, Год рождения (При этом форма «месяц» – выпадающий при наведении (pop up) список из 12 месяцев..)
После заполнения форм активируется кнопка "Далее" - помогите смоделировать её нажатие.. Поиск снёс голову напрочь.. Не могу найти решенных аналогов.. Help _IE на английском языке.. что смог понять - применил..
Вот код моего скрипта:
Код:
#include <IE.au3>
$sUrl = '...........'	;

$sLast_name = '..........'				
$sFirst_name = '............'				
$sMiddle_name = '.........'			

$sDay = '07'						
$sMonth = 'Февраль'				
$sYear = '....'
;--------
$oIE = _IECreate($sUrl)
	$oLast_name = _IEGetObjById($oIE, 'id_patient_form-last_name')			
	$oFirst_name = _IEGetObjById ($oIE, 'id_patient_form-first_name')			
	$oMiddle_name = _IEGetObjById ($oIE, 'id_patient_form-middle_name')			
_IEFormElementSetValue($oLast_name, $sLast_name)
_IEFormElementSetValue($oFirst_name, $sFirst_name)
;--------	birthday -------------------------
	$oForm_birthday = _IEGetObjByName($oIE, 'patient_form-birthday')			
	$oSelect = _IEFormElementGetObjByName ($oForm_birthday, "data-id")


Вот код HTML-страницы, в части касающейся этих форм авторизации..
Код:
<table><tr><td><label>Фамилия (псевдоним)</label>
<input id="id_patient_form-last_name" placeholder="Фамилия" type="text" name="patient_form-last_name" class="jq_input_patient_last_name textfield rounded jq_input jq_input_flush" />
<em class="arrow"></em>
</td></tr>
<tr><td><label>Имя</label>
<input	id="id_patient_form-first_name" placeholder="Имя" type="text" name="patient_form-first_name" 
class="jq_input_patient_first_name textfield rounded jq_input jq_input_flush" />
<em class="arrow"></em>
</td></tr>

<tr><td><label>Дата рождения</label>
<div class="datepicker">
<ul class="month_popup rounded">
<li data-id="0">Январь</li>
<li data-id="1">Февраль</li>
<li data-id="2">Март</li>
<li data-id="3">Апрель</li>
<li data-id="4">Май</li>
<li data-id="5">Июнь</li>
<li data-id="6">Июль</li>
<li data-id="7">Август</li>
<li data-id="8">Сентябрь</li>
<li data-id="9">Октябрь</li>
<li data-id="10">Ноябрь</li>
<li data-id="11">Декабрь</li>
</ul>
<input type="text" class="textfield rounded jq_input_day jq_dateinput jq_input_flush" placeholder="День" maxlength="2" />
<input type="text" class="textfield rounded jq_input_month_verbose jq_dateinput jq_input_flush" placeholder="Месяц" />
<input type="text" class="textfield rounded jq_input_year jq_dateinput jq_input_flush" placeholder="Год" maxlength="4" />
<input type="hidden" class="jq_input_month_actual jq_dateinput jq_input_flush" />
</div></td></tr>
<tr style="display:none;">

<td><label>Отчество</label>
<input id="id_patient_form-middle_name" placeholder="Отчество" type="text" name="patient_form-middle_name" class="jq_input_patient_middle_name textfield rounded jq_input jq_input_flush" />
<em class="arrow"></em>
</td></tr></table>
</div><div class="submit next">
<span class="button dis">
<input type="submit" value="Далее" disabled="disabled" /></span>
</div>
</form>
 
Автор
A

AlexWolf

Новичок
Сообщения
8
Репутация
0
[Автоматизация] Re: Как заполнить форму авторизации не имеющую ID и Name атрибутов

Опираясь на молчаливую поддержку читателей, продвинулся.. только недалеко.. Вопреки отсутствию у тегов Name-атрибутов научился вводить в текстовые поля свои данные для регистрации.. Но.. в Java ... Вот как выглядит строка внесения в хитрый placeholder даты рождения..
Код:
<script>
function Birthday()
{
var line=document.getElementsByTagName("input")[1];
line.attributes[2].value="07"
var line=document.getElementsByTagName("input")[2]
line.attributes[1].value="Февраль"
}
</script>

Скрипт AutoIt не хочет принимать такую конструкцию:
Код:
$line=$oIE.document.getElementsByTagName("input")[1]					
$line.attributes[2].value="07"


В консоли наслаждаюсь этим ответом:
Код:
[center][/center]<Имя_скрипта>.au3(13,50) : ERROR: syntax error
и указатель на крайние правые квадратные скобки в первой строке кода.. повторю эти скобки ==> [1]

Кто сталкивался с подобной задачей - помогите.. Просмотрел сотни постов здесь и на англоязычном форуме.. В основном попадались однотипные вопросы, которые не помогли в решении моей проблемы..
 

oesoes

xor eax,eax
Сообщения
171
Репутация
9
Что-то как-то у вас все слишком сложно. Известен же placeholder. Можно по нему:

Код:
#include <IE.au3>

Local $oIE = _IECreate('blabla.htm')
Local $oInputs = _IETagNameGetCollection($oIE, "input")
For $oInput In $oInputs
	Switch $oInput.placeholder
		Case "День"
			$oInput.value = "08"
		Case "Месяц"
			$oInput.value = "Март"
		Case "Год"
			$oInput.value = "1945"
		EndSwitch
Next
 
Автор
A

AlexWolf

Новичок
Сообщения
8
Репутация
0
[Автоматизация] Re: Как заполнить форму авторизации не имеющую ID и Name атрибутов

Спасибо всем откликнувшимся за помощь..
Почему-то решил, что молчание будет вечным.. :smile:)
К решению проблемы пришёл именно вашим путём.. Теперь заполняет все поля ввода как надо..
Почти..
При заполнении и клике на кнопку продолжения заполнения следующей формы документа /кнопка с названием "Далее"/ - сервер отвечает "Неправильно заполнены данные.." Так сказать, фейс-контроль пройти не удаётся.. :scratch:

Я ввёл в код для большей имитации ручного ввода перемещения мыши на поля ввода, задержки, фокус на полях ввода.. и даже расфокусировку после введения текста..
Не помогло..
Вот код:
Код:
$oIE = _IECreate ($sUrl)
	Sleep(3000)
		if not IsObj($oIE) then
			Msgbox(0,"Error","$oIEl is not an Object.")
		else
			ConsoleWrite(" Successfully created Object $oIE "  & @CRLF)
		endif
;---------------------------------------------------------------------------------------------------------
$oInputs = _IETagNameGetCollection($oIE,'input')
		if not IsObj($oInputs) then
			Msgbox(0,"Error","$oInputs is not an Object.")
			Exit
		else
			ConsoleWrite(" Successfully created Object $oInputs "  & @CRLF)
		endif
;-----------
For $Input In $oInputs
		If String($Input.name) == "patient_form-last_name" Then
			MouseMove(660,560)							;	660,560	- координаты фамилии
			Sleep(2000)
			$Input.Focus()
			Sleep(220)
			$Input.Click()
			Sleep(120)
			$Input.value = $sLast_name					; работает!
		Sleep(1250)
		EndIf
		If String($Input.name) == "patient_form-first_name" Then
			MouseMove(650,640)							;	650,640	- координаты Имени
			Sleep(2000)
			$Input.Focus()
			Sleep(220)
			$Input.Click()
			Sleep(120)
			$Input.value = $sFirst_name		
			Sleep(210)
			$Input.Blur()
		EndIf
		If String($Input.GetAttribute('placeholder')) == 'День' Then
			MouseMove(540,707)							;	540,707	- координаты День
			Sleep(1220)
			$Input.value = $sDay		; работает!
		Sleep(200)
			$Input.Blur()
		EndIf
;'Год'
		If String($Input.GetAttribute('placeholder')) == 'Год' Then
			MouseMove(770,707)							;	770,707	- координаты 'Год'
			Sleep(1220)
			$Input.value = $sYear		; работает!
			Sleep(220)
			$Input.Blur()
		EndIf
;'Месяц'
		If String($Input.GetAttribute('placeholder')) == 'Месяц' Then
			;MouseMove(660,707)							;	660,707	- координаты Месяц
			Sleep(1220)
			;$Input.Focus()
			$Input.value = $sMonth		; работает!
			Sleep(300)
			$Input.Blur()
		EndIf
		If (String($Input.value) == 'Далее') Then				; работает
			MouseMove(540,780)							;	540,780	- координаты кнопки 'Далее'
			$Input.disabled = False
			Sleep(220)
			$Input.Focus()
			Sleep(120)
			$Input.Click()
		EndIf
		Sleep(120)
	Next


Лечится ситуация только перенабором всех полей тем же текстом вручную.. Кто сталкивался с проверками сервера на анти-автоматизацию.. Подскажите..
Мне видится только вариант имитации ввода клацанием мышки по клавишам.. И, как вариант, имитацией выбора поля "Месяц" выбором из выпадающего списка.. /Сейчас реализован простой ввод в поле../
 

Вложения

  • _ форма ввода с раскрытым списком.png
    _ форма ввода с раскрытым списком.png
    32.8 КБ · Просмотры: 14
  • _ форма ввода с отказом ВВЕДЁнные данные некорректны.png
    _ форма ввода с отказом ВВЕДЁнные данные некорректны.png
    6.1 КБ · Просмотры: 5

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
AlexWolf
Проще дать ссылку и тест-аккаунт, и вам всё сделают.
Стол заказов
Почему? Потому что долго объяснять, как устроен HTML, JScript и т. д. и т. п.
 
Автор
A

AlexWolf

Новичок
Сообщения
8
Репутация
0
Спасибо за совет.. Он не приемлем, так как тест-аккаунтов на этом ресурсе не бывает.. Это не игра.. и не порно-сайт.. Это протокол базы данных госструктуры с крипто-защитой.. /так во всяком случае разработчики пишут о своём детище/..
HTML-структуру страниц представляю.. Объяснять не надо.. Прежде, чем писать то, что вызвало ваш совет я написал несколько сервис-скриптов, которые помогли мне прийти к тому результату, который я показал в своём коде..
Открою новую тему.. потихоньку разберёмся.. Опыт осваивания "вражеских" продуктов даже без мануалов имеется.. Жалко усилий..
Всем спасибо..
Ставлю Решено.. поскольку большая часть темы решена..
 
Верх