Что нового

[Сеть, интернет] Ожидание загрузки текстового поля

valdur2000

Знающий
Сообщения
155
Репутация
7
Добрый день, опишу ситуацию:
логинюсь на сайте вручную (https) добирась до нужной страницы и включаю макрос AutoIt, который будет тыкать мышкой на кнопки и текстовые поля и вставлять данные из Excel. Страница разбита на несколько секторов, где элементы управления на статичной части, а поля для данных на динамичной. Вначале происходит выбор подкатегории и в динамичной части грузится первая подстраничка. После вставки данных на первой части и автоматической проверки сайтом этих данных на правильность, динамичная часть выдает вторую страничку, где данные добиваются до конца и происходит переход на начало к выбору подкатегории. Записал макрос с мышкиными действиями и комбинациями ctrl+v, все работает, но из-за нестабильной скорости загрузки страницы вынужден выставлять слишком долгий sleep. Тут нашел много подобных примеров с _IECreate и с _IELoadWait, но они все основаны на создании и отслеживании состояния новой странички. И туда надо каждый раз передавать адрес актуальный, а в адресной строке он не меняется с момента моего логина и до конца сессии.
Вопрос первый:
Можно ли использовать например _IELoadWait с активной на данный момент страницей с не важно каким адресом?
Вопрос второй:
Какой функцией можно дождаться загрузки определенного куска текста на страничке и запустить макрос дальше?
Прошу не только названия функций, но 2-3 строчки примера кода, что б разобрался..
 

Houl777

Знающий
Сообщения
38
Репутация
5
Добавь дополнительный функции для проверки: по цвету или по объектам на странице, или по исходному коду.

Ниже пример функций. Писал для одного скрипта. Функция _Test () нажимает нужную кнопку на странице. Внутри вызывает _CheckColor () для проверки загрузки страницы по цвету в определнном месте. Тупо, но работает безотказно.

Есть только момент один. На разных ПК почему-то цвета страницы разные.

В другом скрипте определял загрузку страницы по копированию в буфер определенной фразы, которая появлялась только после полной прорисовки страницы. Все дело было во фреймворке Siebel

Код:
Func _Test ()

	_CheckColor ("E4E4E4",30,200,$HTC)

	$oImgs = _IEImgGetCollection($HTC)

	For $oImg In $oImgs
		If StringInStr($oImg.src, "tb100.png") Then
			$1 = StringInStr($oImg.src, "tb100.png")
			_IEImgClick($HTC, "tb100.png", "src")
			_IELoadWait ($HTC)
			Return $1
		EndIf
	Next

EndFunc

Func _CheckColor ($Color,$x,$y,$hwd)

	For $i = 0 To 10 Step 1
		Sleep (2000)
		$var = PixelGetColor($x,$y,$hwd)
		If Hex($var, 6) = $Color Then ExitLoop
	Next
		If $i = 11 Then
			_IEAction ($HTC, "refresh")
			_IELoadWait ($HTC)
		EndIf
EndFunc
 

axlwor

Скриптер
Сообщения
657
Репутация
147
что то похожее на
Код:
$hwnd = WinActive ( "title" [, "text"] )
_IELoadWait($hwnd)

Со вторым вопросом сложнее. Там могут быть фреймы. Но тоже _IELoadWait($oFrame) после ввода данных
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Спасибо за ответ, название окна начинается на The
$hwnd = WinActive ("The","")
_IELoadWait($hwnd)
При исполнении выдается сообщение:
--> IE.au3 V2.4-0 Error from function _IELoadWait, $_IEStatus_InvalidDataType
макрос не дожидаясь загрузки идет дальше...
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Попробуй
Код:
$hwnd = WinActivate("[CLASS:IEFrame]", "Главная игра")
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
valdur2000 [?]
При исполнении выдается сообщение:--> IE.au3 V2.4-0 Error from function _IELoadWait, $_IEStatus_InvalidDataType
Потому что Object и Handle это разные вещи.
Ошибка указывает на то, что функция _IELoadWait принимает параметр не того типа.
Функция WinActivate отдаёт нам тип Handle а функция _IELoadWait принимает тип Object



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

valdur2000 [?]
Какой функцией можно дождаться загрузки определенного куска текста на страничке и запустить макрос дальше?
Вопрос в том, как перезагружаются данные?
Если происходит Refresh то можно использовать _IELoadWait, если используется AJAX то можно использовать другие методы (по ситуации) и т.д.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
:laugh: точно. ступил
Тогда вот так
Код:
$hwnd = WinActivate("[CLASS:IEFrame]", "Главная игра")
$oIE = _IEAttach ($hwnd,'HWND')
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Код:
Func _CheckColor ($Color,$x,$y,$hwd)

    For $i = 0 To 10 Step 1
        Sleep (2000)
        $var = PixelGetColor($x,$y,$hwd)
        If Hex($var, 6) = $Color Then ExitLoop
    Next
        If $i = 11 Then
            _IEAction ($HTC, "refresh")
            _IELoadWait ($HTC)
        EndIf
EndFunc
Уважаемые, в окне происходит не Refresh, а только обновление фрейма, а на других страницах может быть и по-другому, поэтому кусочек кода с ожиданием цвета , по-моему мнению проще и универсальней. Пробовал запустить _CheckColor, но AutoIt ругается, что $HTC не декларирован. Не понимаю, как декларировать... и объясните пожалуйста что значит $hws. Прошу сердечно, закончить этот код, вызовом какого-нибудь окошка или чего-нибудь, что б было видно, как это работает в IE. Если функция запустится и будет какое-то законченное действие, то далее я думаю разберусь по-примеру.
 

axlwor

Скриптер
Сообщения
657
Репутация
147
$HTC - покажи
Если это объект-фрейм - то он и будет обновляться. Если это "InternetExplorer.Application", то обновлять будет всю страницу

UPD. Перечитал сначала. Мухи и котлеты. Может проще логиниться AutoIt. Переходить им же на нужную страницу. Открывать excel. И начинать заполнять нужные части.

БЕЗ: pixelgetcolor, буфера обмена и других не очень нужных в этом вещей

Не нравится handle, можно по другому
Код:
#include <ie.au3>
$sURL = 'http://site'
;подключаемся к ie по урлу
$oIE = _IEAttach ($sURL, 'url')

;находим в IE фрейм с именем name
$oFrame = _IEFrameGetObjByName($oIE, 'name')

;рефрешем фрейм
_IEAction($oFrame, 'refresh')
_IELoadWait($oFrame)

;рефрешем IE
_IEAction($oIE, 'refresh')
_IELoadWait($oIE)



По поводу заполнения. Надо смотреть. Формы, input или как еще
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Не знаю как показать. не понимаю что это.

Если это объект-фрейм - то он и будет обновляться. Если это "InternetExplorer.Application", то обновлять будет всю страницу
Адрес в адресной строке не меняется, значек эксплорера не крутится, статусной строке Done не появляется, страница меняется не вся, а только 1/3. Отсюда делаю вывод, что это фрейм. Как точно проверить не знаю. AutoIt Window Info все окно експлорера показывает одним целым.
#include <ie.au3>
$sURL = 'http://site'
;подключаемся к ie по урлу
$oIE = _IEAttach ($sURL, 'url')

;находим в IE фрейм с именем name
$oFrame = _IEFrameGetObjByName($oIE, 'name')

;рефрешем фрейм
_IEAction($oFrame, 'refresh')
_IELoadWait($oFrame)

;рефрешем IE
_IEAction($oIE, 'refresh')
_IELoadWait($oIE)
Я захожу на страницу, логинюсь, прохожу еще пару страниц и начинаю оттуда работать с данными. Адрес в адресной строке не меняется на всем протяжении работы, до логаута...

Фильтровать и подготавливать данные, логиниться автоматом и работать напрямую с экселем не используя ClipMate для копирования множества данных, это моя мечта. Честно. И я приду со временем к ней. Но это потребует не одной недели писания кода, а работать мне надо с данными ежедневно :smile: и pixelgetcolor это решение вопроса уже завтра. Сейчас у меня работа автоматизирована Tasker'ом в паре с Clipmate(расширенный буфер обмена), но там пауза только через sleep, а если в этот момент компу вздумалось чего или интернет подвис на 5 сек или антивирус обновляется, то таскер убегает вперед... Надоело исправлять за ним, поискал и увидел Cron и AutoIt и понял, что мне надо именно это. Начал с AutoIt наверное на нем и остановлюсь. Определителя цвета сделать, мне кажется, быстрей всего и он на разных сайтах одинаково будет работать. Помогите пожалуйста разобраться с pixelgetcolor ... пока цвет не тот, макрос встал, как цвет стал нужный, продолжил работу..
 

axlwor

Скриптер
Сообщения
657
Репутация
147
сайт то жууутко секретный?
если нет - можно до excel тут написать.

Если секретный, то ставь debugbar и выкладывай код формы логина
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Код:
While (PixelGetColor(498,642)<>0x6C6C58)
 Sleep(10)
WEnd


Вот так все оказалось просто... и работает аки часики :smile:


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

ставь debugbar и выкладывай код формы логина.
Искал дебуггер, оказалось что у AutoIt родного вроде нету, а AutoIt Debugger медленный, да и обплевали его в комментах... так и хожу без..
 

axlwor

Скриптер
Сообщения
657
Репутация
147
http://debugbar.com/
панелька для ие. удобственно смотреть код странички, элементы. очень помогает, если использовать autoit+ie
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
http://debugbar.com/
панелька для ие. удобственно смотреть код странички, элементы. очень помогает, если использовать autoit+ie
Скачал поставил круто. И на русском. Доделаю все через определение цвета и вернусь с вопросами по-поводу уже взрослых решений.


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


ставь debugbar и выкладывай код формы логина
Код:
<FORM method=post name=kufosignup action=https://secure1.адрес.домен/index.php?varSessionID=24e8f3393187d27eaeca99460bc841c2&amp;se=hz0zh&amp;menu=2343_2351_2355><INPUT name=varSessionID value=24e8f3393187d27eaeca99460bc841c2 type=hidden><INPUT name=menu value=2343_2351_2355 type=hidden><INPUT name=se value=hz0zh type=hidden> <INPUT name=whereTo value=/shop/00006/cms.php type=hidden> <INPUT name=query value=varAccessKey=Cms_OASe_Startseite type=hidden> <INPUT name=todo value=Anmelden type=hidden> 
<TABLE style="MARGIN: 0px auto; WIDTH: 100%" border=0>
<TBODY>
<TR>
<TD>
<TABLE style="BORDER-BOTTOM: #b6c9c8 1px solid; BORDER-LEFT: #b6c9c8 1px solid; WIDTH: 100%; BORDER-TOP: #b6c9c8 1px solid; BORDER-RIGHT: #b6c9c8 1px solid" border=0 cellSpacing=0 cellPadding=2>
<TBODY>
<TR>
<TD class=themeServiceColBg1 colSpan=3><STRONG>Bitte melden Sie sich zunachst an.</STRONG></TD></TR>
<TR>
<TD style="WIDTH: 30%" align=left><LABEL for=login>Benutzername</LABEL></TD>
<TD style="TEXT-ALIGN: left; WIDTH: 30%"><INPUT id=login name=login></TD>
<TD> </TD></TR>
<TR>
<TD style="WIDTH: 30%" align=left><LABEL for=pw>Passwort</LABEL></TD>
<TD style="TEXT-ALIGN: left; WIDTH: 30%"><INPUT id=pw name=pw value="" type=password></TD>
<TD style="WIDTH: 40%" align=left> </TD></TR>
<TR>
<TD style="WIDTH: 30%" align=left> </TD>
<TD style="TEXT-ALIGN: left; WIDTH: 30%"><INPUT style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-TOP: 0px; BORDER-RIGHT: 0px" id=butLogin class=butLogin title=Anmelden name=butLogin value=anmelden src="/shop/00006/images/tph07/buttons/login.gif" type=image></TD>
<TD style="WIDTH: 40%" align=left> </TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></FORM>


Соответственно сделал все через mausklick, ctrl+v и pixelgetcolor прямо на форме. все работает на радость окружающим. Скажите пожалуйста, а можно ли заполнить форму пароля и нажать на кнопку логина непосредственно обращаясь к форме, что б совсем убрать влияние скорости компьютера и интернетсоединения? вы писали сверху подобное...
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Дополнение не заметил :-[, так что увидел только сегодня

Код:
#include <ie.au3>
#include <array.au3>

;Пока можно оставить по Ctrl-F12 - загрузка ИЕ + логин
HotKeySet("^{F12}", "_Login")

;Пока можно оставить по ESC - выход из скрипта
HotKeySet("{ESC}", "ExitScript")

While 1
	Sleep(1000)
WEnd

;Логинимся на сайт
Func _Login()
	If Not IsDeclared ("$oIE") Then
		_StartIE()
	EndIf

	If Not IsObj($oIE) Then
		_StartIE()
	EndIf

	$username = 'MyLogin'
	$password = 'MyPassword'
	
	$oForm = _IEFormGetObjByName($oIE, 'kufosignup')
	If @error = 0 Then
		$oLogin = _IEFormElementGetObjByName ($oForm, 'login')
		$oPassword = _IEFormElementGetObjByName ($oForm, 'pw')
		$oButton = _IEFormElementGetObjByName ($oForm, 'butLogin')
		_IEFormElementSetValue ($oLogin, $username)
		_IEFormElementSetValue ($oPassword, $password)
		
		;Надеюсь по этому батону форма отправляется
 		_IEAction ($oButton, "click")
		_IELoadWait ($oIE)
	ElseIf @error = 7 Then
		MsgBox(0,0, 'Не нашли форму' & @CRLF & 'Может быть она в другом фрейме')
	Else
		MsgBox(0,0, 'Вообще не понятно что творится!!!')
	EndIf
EndFunc

;Запускаем ИЕ. Разворачиваем на весь экран
Func _StartIE()
	$sURL = 'https://secure1.адрес.домен/'
	Global $oIE = _IECreate($sURL)
	
	$hwnd = _IEPropertyGet ($oIE, 'hwnd')
	$title = WinGetTitle ($hwnd)
	WinSetState($title, "", @SW_MAXIMIZE)
EndFunc


;Выход. Можно дополнять
Func ExitScript()
	MsgBox (0, "Внимание", "Вышли!!!!", 10 )
	;Если нужно, по выходу из скрипта закрываем ИЕ
;~ 	_IEQuit($oIE)
	Exit
EndFunc

надеюсь это форма для логина, а не для регистрации
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
Здравствуйте. IE открывается, лог и пасс заполнились, а на кнопку не жмет... хотя судя по коду название кнопки правильное, но результата нет. при выполнении код выдавал ошибку о не объявленной $oIE, я ее объявил сверху и теперь код выполняется без ошибок. а на кнопку не жмет...
 

axlwor

Скриптер
Сообщения
657
Репутация
147
если запускать из под scite, то по умолчанию стоит _IEErrorNotify (True) и в консоле должны выводиться ошибки, например
--> IE.au3 V2.4-0 Warning from function _IEFormGetObjByName, $_IEStatus_NoMatch
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
--> IE.au3 V2.4-0 Warning from function _IEFormElementGetObjByName, $_IEStatus_NoMatch
--> IE.au3 V2.4-0 Error from function _IEAction, $_IEStatus_InvalidDataType
Проверил имя кнопки, все верно.ИЕ стартует, заполняет, но не нажимает... по эскейпу удачно выходит
 

axlwor

Скриптер
Сообщения
657
Репутация
147
А дай сюда код кнопки отправки формы, а то походу butLogin это не отправка

и посмотри что в консоль пишет
Код:
$oButton = _IEFormElementGetObjByName ($oForm, 'butLogin')
ConsoleWrite('@error ' & @error & ' @extended ' & @extended & @CRLF)
 
Автор
V

valdur2000

Знающий
Сообщения
155
Репутация
7
--> IE.au3 V2.4-0 Warning from function _IEFormElementGetObjByName, $_IEStatus_NoMatch
@error 7 @extended 0
--> IE.au3 V2.4-0 Error from function _IEAction, $_IEStatus_InvalidDataType
вот что пишет при исполнении.

Вызываю URL, нажимаю правой мышкой на кнопку Login и выбираю Показать код страницы. Вот кусок кода, который отвечает за форму логина.

<form action="https://secure1.адрес.de/index.php?varSessionID=6134b815577d698c53151434f5728795&se=hz0zh&menu=2343_2351_2355" name="kufosignup" method="post">
<input type="hidden" name="varSessionID" value="6134b815577d698c53151434f5728795"><input type="hidden" name="menu" value="2343_2351_2355"><input type="hidden" name="se" value="hz0zh">
<input type="hidden" name="whereTo" value="/shop/00006/cms.php"/>
<input type="hidden" name="query" value="varAccessKey=Cms_OASe_Startseite"/>
<input name="todo" value="Anmelden" type="hidden"/>
<table border="0" style="width:100%;margin:0px auto;">
<tr>
<td>
<table border="0" cellpadding="2" cellspacing="0" style="width:100%;border:1px solid #B6C9C8">
<tr><td colspan="3" class="themeServiceColBg1"><strong>Bitte melden Sie sich zunächst an.</strong></td></tr>
<tr><td align="left" style="width:30%;"><label for="login">Benutzername</label></td><td style="text-align:left;width:30%;"><input size="20" name="login" id="login" value="" type="text"></td><td> </td></tr>
<tr><td align="left" style="width:30%;"><label for="pw">Passwort</label></td><td style="text-align:left;width:30%;"><input size="20" name="pw" id="pw" value="" type="password"></td><td align="left" style="width:40%;"> </td></tr>
<tr><td align="left" style="width:30%;"> </td><td style="text-align:left;width:30%;"><input src="/shop/00006/images/tph07/buttons/login.gif" name="butLogin" id="butLogin" value="anmelden" title="Anmelden" class="butLogin" type="image" style="border=0px;" /></td><td align="left" style="width:40%;"> </td></tr>
</table>
</td>
</tr>
</table>
</form>
 
Верх