Что нового

[Сеть, интернет] Зависание выполнения скрипта при выполнении _IEAction

beaver

Новичок
Сообщения
58
Репутация
2
Всем доброго дня.
Прошу помощи в решении моей проблемы.
При автоматизации страницы в IE требуется выполнить элементарное действие - нажать на кнопку, которая имеет следующий код (привожу маленький кусок из всей страницы):

Код:
        <tr>
        <td>downStatus</td>
        <td></td>
        <td>OFF</td>
        <td>
            <form method="post" enctype="application/x-www-form-urlencoded">
                <input type="hidden" name="cstatus" value="downStatus" />
                <input type="submit" name="change_downStatus" value="Изменить" onclick="return confirm('изменить статус downStatus? Вы уверены?');"  />
            </form>
        </td>
    </tr>

Собственно саму кнопку идентифицирую по значению "change_downStatus" для аттрибута "name".
Для клика по объектам написал функцию, куда в качестве аргументов передаем тег, имя аттрибута и значение аттрибута. За стиль написания сразу прошу прощения :-[ рефакторинг будет после того как это чудо заработает. Итак, сама функция:

Код:
;-----------------------------------------------------
;Клик мышкой с таргетингом по аттрибуту
;-----------------------------------------------------
Func lib_gui_ie_ObjectClick_ByAttribute($sTag, $sAttribute, $sAttrValue)
	Log_Write(4, "Клик мышкой с таргетингом по аттрибуту для IE ", "Library: \lib\ie\gui_ie.au3, Function: lib_gui_ie_ObjectClick_ByAttribute, $sTag: " & $sTag & "$sAttribute: " & $sAttribute & "$sAttrValue: " & $sAttrValue)
	Local $oInputs = lib_gui_ie_GetCollection_ByTag($sTag)
	For $oInput In $oInputs
		Log_Write(4, "Получено значение '" & $oInput.getAttribute($sAttribute) & "' для аттрибута '" & $sAttribute & "' ", "Library: \lib\ie\gui_ie.au3, Function: lib_gui_ie_ObjectClick_ByAttribute")
		If $oInput.getAttribute($sAttribute) == $sAttrValue Then	
			Log_Write(4, "Не выполнен клик мышкой с таргетингом по аттрибуту для IE ", "Library: \lib\ie\gui_ie.au3, Function: lib_gui_ie_ObjectClick_ByAttribute, $sTag: " & $sTag & "$sAttribute: " & $sAttribute & "$sAttrValue: " & $sAttrValue)
			_IEAction($oInput, "click")			
			Log_Write(4, "Выполнен клик мышкой с таргетингом по аттрибуту для IE ", "Library: \lib\ie\gui_ie.au3, Function: lib_gui_ie_ObjectClick_ByAttribute, $sTag: " & $sTag & "$sAttribute: " & $sAttribute & "$sAttrValue: " & $sAttrValue)
			
		EndIf	
	Next
EndFunc


Внутри этой функции используется функция получения коллекции объектов, вот она:

Код:
;---------------------------------------------------------
;Получение коллекции объектов по заданному тегу
;---------------------------------------------------------
Func lib_gui_ie_GetCollection_ByTag($sTag)
	Log_Write(4, "Получение коллекции по Tag для IE ", "Library: \lib\ie\gui_ie.au3, Function: lib_gui_ie_GetCollection_ByTag, $sTag: " & $sTag)
	Local $oInputs
	Do		
		$oInputs = _IETagNameGetCollection($oIE, $sTag)
	Until @error=0
	Return $oInputs
EndFunc


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

"24.11.2010 17:33:45","DEBUG","Не выполнен клик мышкой с таргетингом по аттрибуту для IE ","Library: \lib\ie\gui_ie.au3, Function: lib_gui_ie_ObjectClick_ByAttribute, $sTag: input $sAttribute: name $sAttrValue: change_downStatus"

и далее AutoIt висит без падений и сообщений об ошибке в трее. Сломал голову от чего может быть такое зависание.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
beaver
При клике на кнопке change_downStatus срабатывает JScript
onclick="return confirm('изменить статус downStatus? Вы уверены?');"
что приводит к появлению диалогового окна [CLASS:#32770]
Пока вы его не закроете, скрипт будет висеть.
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
Garrett сказал(а):
beaver
При клике на кнопке change_downStatus срабатывает JScript
onclick="return confirm('изменить статус downStatus? Вы уверены?');"
что приводит к появлению диалогового окна [CLASS:#32770]
Пока вы его не закроете, скрипт будет висеть.

А как тогда сделать так, чтобы скриптом закрыть это окно? Получается, что скрипт висит и диалог можно закрыть только руками?
 
Автор
B

beaver

Новичок
Сообщения
58
Репутация
2
Проблема решена параллельным запуском еще одного скрипта, который банально ожидает появления диалогового окна и закрывает его нажатием на нужную кнопку.

Вызов параллельного скрипта выглядит как:

Код:
$file_loc = "C:\svn\qa\lib\useful\dialog_close.au3"
	$file_au3 = FileGetShortName($file_loc)
	Run(@AutoItExe & " " & $file_au3, "", @SW_HIDE)


Сам скрипт выглядит так:
Код:
Do
	Sleep(500)	
Until WinExists("Сообщение с веб-страницы")

WinActivate("Сообщение с веб-страницы")
ControlClick("Сообщение с веб-страницы", "", "[CLASS:Button; INSTANCE:1]")

;Ждем когда окно закроется
Do
	Sleep(500)
Until Not(WinExists("Сообщение с веб-страницы"))


Дальше эти страшные вещи причесываем, параметризуем, рефакторим...
Но даже в таком виде оно работает. :smile:
 
Верх