Что нового

[Сеть, интернет] Как работать с элементами GUI в popup окнах написанных на javascript (IE и FF)

beaver

Новичок
Сообщения
58
Репутация
2
Возникла такая проблемка.
При нажатии на ссылку регистрации в браузере возникает окно popup написанное на javascript.
Вот как выглядит вызов этого окна на исходной странице:
Код:
<script type="text/javascript">
addOnLoadEvent(function(){
	var onclickRegister = function()
	{
		showPopup('/register/popup/',640,550,'registrationPopup');
		return false;
	}
	$("#registrationButton").click(onclickRegister);
	$("#registrationLink").click(onclickRegister);
});
</script>

Далее при вызове указанной функции генерируется уже вторая страница этого самого всплывающего окна вторым слоем поверх исходной страницы.
WebDeveloper'ом я вижу исходные коды двух страниц:
1. Исходная http://www.бла-бла-бла.ru/
2. Всплывающего окна: http://www.бла-бла-бла.ru/register/popup/

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

Подскажите, если кто знает, как обратиться именно к всплывающему окну? В частности мне надо:
1. Заполнить поля вида:
Код:
<input type="text" class="text" maxlength="50" id="InputStringName_63382" type="text" name="firstName" value="" />

2. Выбрать значения комбо-бокса:
Код:
<select name="birthDate_m" id="inputDate_71345_month" class="cancel datepicker_month fixsel"><option>...</option><option value="1">Январь</option><option value="2">Февраль</option> и т.д.

3. Отметить чек-бокс... (тут я думаю уже по аналогии)

4. Нажать на кнопку... (тут я думаю уже по аналогии)
 

axlwor

Скриптер
Сообщения
657
Репутация
147
в FF не знаю
в ие хорошая справка (простите усе боги, даж русская)
Код:
$oForm = _IEFormGetObjByName ($oIE, "Тут_Имя_Формы")

$oFirstName = _IEFormElementGetObjByName ($oForm, "firstName")
_IEFormElementSetValue ($oFirstName, "First Name")

$obirthDate_m = _IEFormElementGetObjByName ($oForm, "birthDate_m")
_IEFormElementOptionSelect ($obirthDate_m, "Мой_месяц_в_цифрах", 1, "byValue")

_IEFormSubmit ($oForm)
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
Это все хорошо, когда у элементов нормально аттрибуты прописаны, а вот когда приходится обращаться по коллекции объектов с указанием аттрибута и его значения (я имею ввиду конструкцию вида):
Код:
Local $oInputs = IE_GetCollectionByTag($sTag)
	For $oInput In $oInputs
		If $oInput.getAttribute($sAttribute) == $sAttrValue Then
			_IEFormElementSetValue ($oInput, $sValue)
			Log_Write(4, "В editbox '" & $sAttrValue & "' установлено значение: " & $sValue, "Library: \lib\ie\kernel_ie.au3, Function: IE_EditBox_SetValue_ByAttribute")
		EndIf	
	Next


то тут уже возникают проблемы...

Но за ответ благодарю, видимо увлекся указанной конструкцией и забыл про эти функции.
Кстати для FF есть тоже русская документация :laugh: и схожие функции: http://russian.documentation.ff-au3.thorsten-willert.de/
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Нет имен. Бывают id.
Нет id. Бывают классы.
Нет ничего. Бывают индексы и содержимое.
Конструкция только усложняется лишними проверками. Как только добрался до нужного объекта - можно работать уже через ie.au3
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
Что-то у меня по Вашему совету не получается заставить скрипт работать :blink:

В popup, который мне нужен вижу следующие аттрибуты формы:
Код:
<form method="post" class="register individual" action="" id="formRegister">


Соответственно можно попробовать обратиться по id или по class, собственно, что я и пытаюсь сделать вот тут:
Код:
$oForms = _IEFormGetCollection ($oIE)
	For $oForm In $oForms
		Log_Write(4, "Не найдено", "class= " & $oForm.getAttribute("class"))
		If $oForm.getAttribute("class") == "register individual" Then


Однако, исходя из того, что сваливается в логи $oForm.getAttribute("class") возвращает null.
Не подскажите, что я не так делаю? :wall_brake:
 

axlwor

Скриптер
Сообщения
657
Репутация
147
а так?
Код:
$oForm = _IEGetObjById ("formRegister")

class - вроде зарезервированное слово. нужно использовать className
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
Если я пишу вот так:
Код:
$oForm = _IEGetObjById ($oIE, "formRegister")

То в результате выполнения получаю:
Код:
--> IE.au3 V2.4-0 Warning from function _IEGetObjById, $_IEStatus_NoMatch (formRegister)

замкнутый круг какой то...

я так понимаю эта строка эквивалентна конструкции:
Код:
$oForms = _IEFormGetCollection ($oIE)
	For $oForm In $oForms		
		If $oForm.getAttribute("id") == "formRegister" Then
			ExitLoop
		EndIf
		Log_Write(4, "Не найдено", "id= " & $oForm.getAttribute("id"))
	Next
	_IEFormElementSetValue ($oEditBox, "some text")


но при определении обоих форм по id получаю в логах id = 0
 

axlwor

Скриптер
Сообщения
657
Репутация
147
дай ссылку. хоть сюда, хоть в ПМ
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
axlwor [?]
class - вроде зарезервированное слово. нужно использовать className
Совершенно верно!
Получают его так:
Код:
$Object.className


beaver приложите, пожалуйста, screenshot вашего popup окна.
Если окно диалоговое, то к нему можно обратится стандартными функциями Autoit. Если popup окно формируется как слой документа то через IE.au3.
Проверить можно утилитой Au3Info.exe


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

beaver [?]
<form method="post" class="register individual" action="" id="formRegister">
Код:
$ID = _IEGetObjById($oIE, "formRegister")
 

axlwor

Скриптер
Сообщения
657
Репутация
147
ссылка была дана в приват. в приват и пошло решение.
Форма регистрации была в другом фрейме
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
Да, большое спасибо axlwor за помощь, вот решение:
Код:
#include <ie.au3>

Global $oIE

$oIE = _IECreate ("http://домен.ru", 0, 1, 1, 0)
$oTemps = _IETagNameGetCollection ($oIE, "a")
For $oTemp In $oTemps
    If $oTemp.innerText == 'Зарегистрироваться' Then
        _IEAction ($oTemp, "click")
    EndIf
Next

$oFrames = _IEFrameGetCollection ($oIE)
$iNumFrames = @extended
For $i = 0 to ($iNumFrames - 1)
    $oFrame = _IEFrameGetCollection ($oIE, $i)
    If _IEPropertyGet( $oFrame, "popupFrame") = 0 Then
        ExitLoop
    EndIf
Next

$oForm = _IEGetObjById ( $oFrame, "formRegister")

Sleep (1000)

If @error = 7 Then
    MsgBox (0,0, "Форма во фрейме не найдена")
EndIf

_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "lastName"), "Фамилия")
_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "firstName"), "Имя")
_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "middleName"), "Отчество")
_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "birthDate_d"), "28")

;Месяц в цифрах
_IEFormElementOptionSelect (_IEFormElementGetObjByName ($oForm, "birthDate_m"), "5", 1, "byValue")
;или в буквах
;~ ;_IEFormElementOptionSelect (_IEFormElementGetObjByName ($oForm, "birthDate_m"), "Май", 1, "byText")

_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "birthDate_y"), "1990")
_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "cellPhone"), "+75555555555")
_IEAction(_IEFormElementGetObjByName($oForm, "cellPhone"), "focus")
_IEFormElementSetValue (_IEFormElementGetObjByName($oForm, "email"), "[email protected]")
_IEAction(_IEFormElementGetObjByName($oForm, "agreement"), "click")

_IEAction(_IEFormElementGetObjByName($oForm, "submit"), "click")


:IL_AutoIt_1:
 
Верх