Что нового

[Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического вывода

eropov

Jury
Сообщения
195
Репутация
25
Привет всем!
Недавно начал работать с AutoIt и напоролся на проблему, но потом решил :D
Есть таблица с четырьмя колонками, динамически изменяющаяся javascript’ом

Открытые игры:Ставка:Соперник:Тип:
Евгения10 RUBzettП
ASV3 RUBolga3232П 20
Лидер1 RUBПрисоединиться

Задача состоит в том что, нужно нажать на слово "Присоединиться" только в том случае если :
1)“Ставка:” 1 RUB
2)“Тип:” должен быть пустой
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

Вот рабочий код может кому пригодиться :ok:
Код:
Dim $sUrl = "http://igrun.com/?p=39" ; url для теста.
Dim $s1 = "1RUB"
Dim $s2 = "Присоединиться"    ; искомая строка
Dim $s3 = "0"     ; искомая игра

$oIE = _IECreate($sUrl,1,1,1,1)
_IETableGetCollection($oIE) ; Проверяем пришла ли таблица
If @error Then Exit

For $iTIndex = 33 To @extended -5 ; Таблиц много поэтому начинаем с 33 и присикаем остальные -5
    $oTables = _IETableGetCollection($oIE,$iTIndex)
    $aTable = _IETableWriteToArray($oTables)
    If UBound($aTable,2) = 4 Then
        _IETagNameGetCollection($oTables,"tr")
        For $iTRIndex = 0 To @extended -1
            $oTR = _IETagNameGetCollection($oTables,"tr",$iTRIndex)
            $oTH = _IETagNameGetCollection($oTR,"th",0)
            If StringReplace($aTable[$iTRIndex][1], " ", "") = $s1 And StringReplace($aTable[$iTRIndex][2], " ", "") = $s2 And StringReplace($aTable[$iTRIndex][3], " ", "") = $s3  Then
                _IELinkClickByText($oIE, StringReplace($aTable[$iTRIndex][2]," ",""))
				Return 1
                 Exit
			EndIf
        Next
    EndIf
Next
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

eropov,
Можно заменить все
Код:
;...
StringReplace($sString, " ", "") = $s
;...
;на
;...
StringStripWS($sString, 8) == $s
;...
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

Я знал что так можно сделать, но я специально оставил StringReplace для наглядности.
В принципе, сам код был немного больше, для обработки первого столбца и второго столбца. Во втором столбце было так(если не ошибаюсь) :-\
Код:
Dim $s1 = 10
StringReplace($aTable[$iTRIndex][1], "(\ [RUB])", "") <= $s1



Вот немного подправил таблицу :ok:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

eropov [?]
Если внимательно посмотреть на таблицу
Мне очень сложно посмотреть на таблицу, которая находится на сайте www.sait.ru. ;D
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

Помогите, пожалуйста! Функция описанная выше отказывается работать(хоть и работала). В чем может быть дело :shok: :scratch:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

eropov,
Попробуйте так, у меня работает (предлагает авторизироваться после клика).
Код:
#include <IE.au3>
#include <Array.au3>

$iCountX = 0
$iCountY = 0
$iError = 1
$fClick = False
$fYes = False
$sUrl = 'http://igrun.com/?p=39'

$oIE = _IECreate()
If @error Then
	MsgBox(16, 'Error', '_IECreate')
	Exit
EndIf
For $i = 1 To 1
	_IENavigate($oIE, $sUrl)
	If @error Then ExitLoop
	$oTable = _IEGetObjById($oIE, 'gs')
	If @error Then ExitLoop
	$oTrs = _IETagNameGetCollection($oTable, 'tr')
	If @error Or Not @extended Then ExitLoop
	Dim $aInfo[@extended + 1][5] = [[@extended, 3]]
	For $oTr In $oTrs
		If $oTr.bgColor <> '0' Then
			$oThs = _IETagNameGetCollection($oTr, 'th')
			If @error Or Not @extended Then ContinueLoop
			$iCountX += 1
			$iCountY = 0
			For $oTh In $oThs
				$aInfo[$iCountX][$iCountY] = $oTh.innertext
				If $aInfo[$iCountX][$iCountY] == 'Присоединиться' Then
					$aInfo[$iCountX][4] = _IETagNameGetCollection($oTh, 'a', 0)
					If @error Then ExitLoop 3
				EndIf
				$iCountY += 1
				If $iCountY > $aInfo[0][1] Then ExitLoop
			Next
		EndIf
	Next
	If $iCountX Then
		ReDim $aInfo[$iCountX + 1][5]
		$aInfo[0][0] = $iCountX
		$iError = 0
	EndIf
Next
If Not $iError Then
	_ArrayDisplay($aInfo)
	For $i = 1 To $aInfo[0][0]
		If $aInfo[$i][1] == '1 RUB' And $aInfo[$i][2] == 'Присоединиться' And $aInfo[$i][3] == '0' Then
			$fYes = True
			For $j = 1 To 1
				_IEAction($aInfo[$i][4], 'click')
				If @error Then ExitLoop 2
				_IELoadWait($oIE)
				If @error Then ExitLoop 2
				$fClick = True
			Next
			If $fClick Then
				MsgBox(64, 'Info', 'OK')
			Else
				MsgBox(16, 'Error', 'Error')
				_IEQuit($oIE)
			EndIf
		EndIf
	Next
	If Not $fYes Then
		MsgBox(64, 'Info', 'Нет нужных игр')
		_IEQuit($oIE)
	EndIf
Else
	MsgBox(16, 'Error', 'Error')
	_IEQuit($oIE)
EndIf
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

У меня тоже работает. Объясните пожалуйста по коду, что как работает :ok:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

eropov [?]
что как работает
Вы спрашивайте, что не понятно.
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

Примерно я понимаю как это работает, можно ли этот код обвернуть в функцию которая будет работать до тех пор пока не нажмет на выбираемую игру?
Мне интересно почему _IECreate реализована без параметров, для чего?
Код:
$oIE = _IECreate()

Мне не понятна строчка (Это массив обьектов?)
Код:
Dim $aInfo[@extended + 1][5] = [[@extended, 3]]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

eropov [?]
можно ли этот код обвернуть в функцию которая будет работать до тех пор пока не нажмет на выбираемую игру?
Можно.
Мне интересно почему _IECreate реализована без параметров, для чего?
Просто мне так удобнее, других целей я не преследовал. :smile:
Мне не понятна строчка (Это массив обьектов?)
Это массив и текстов(колонки 0 - 3), и, если есть, объектов (колонка 4). По большому счету, массив не нужен, я его для наглядности сделал.
Код:
;...
$oTrs = _IETagNameGetCollection($oTable, 'tr')
;@extended - кол-во элементов с тегом <tr> в объекте $oTable
If @error Or Not @extended Then ExitLoop
;если ошибка иди нет элементов с тегом <tr>
Dim $aInfo[@extended + 1][5] = [[@extended, 3]]
;массив с кол-вом строк = @extended + 1 и с 5 колонками, в котором
;$aInfo[0][0] = @extended (не нужно, вообще-то)
;$aInfo[0][1] = 3
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

Как я понимаю , чем компактней код тем он надежнее, понятнее и больше его скорость работы? Напиши пожалуйста, как этот код обвернуть в функцию которая будет работать до тех пор пока не нажмет на выбираемую игру? Я никогда еще такого не делал :shok:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

eropov,
Дайте мне тестовый логин-пароль (можно в ЛС).
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

Дайте мне тестовый логин-пароль (можно в ЛС).
В принципе логин-пароль там не нужны и у меня их нет, а чтобы их получить целый геморой. Надо регистрировать webmoney т.к. там привязка к идентификатору.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

eropov,
По уму, надо бы сначала авторизироваться. Попробуйте так.
Код:
#include <IE.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $oIE, $iStart, $sNick

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

$oIE = _IECreate()
If @error Then
	MsgBox(16, 'Error', '_IECreate')
	Exit
EndIf

HotKeySet('{Esc}', '_Exit');Esc - выход

$sNick = _Play_Fool($oIE)
If Not @error And $sNick <> -1 Then
	MsgBox(64, 'Info', 'Авторизируйтесь и играйте с ' & $sNick)
Else
	$iStart = TimerInit()
	While 1
		If TimerDiff($iStart) >= 30000 Then ;30sec
			$sNick = _Play_Fool($oIE)
			If Not @error And $sNick <> -1 Then
				MsgBox(64, 'Info', 'Авторизируйтесь и играйте с ' & $sNick)
				ExitLoop
			Else
				$iStart = TimerInit()
			EndIf
		EndIf
		Sleep(50)
	WEnd
EndIf

Func _Play_Fool(ByRef $o_Obj, $s_Rate = '1 RUB', $s_Type = '0')
	Local $s_Url = 'http://igrun.com/?p=39', $o_Table, $o_Trs, $o_Ths, $o_Link, $s_Url_Obj, _
			$s_Nick_Player, $s_String = 'Присоединиться', $s_String_Control, $f_Yes, $i_Error = 1

	If Not IsObj($o_Obj) Then Return SetError(1)
	For $i = 1 To 1
		$s_Url_Obj = _IEPropertyGet($o_Obj, 'locationurl')
		If @error Then ExitLoop
		If $s_Url_Obj == $s_Url Then
			_IEAction($o_Obj, 'refresh')
			If @error Then ExitLoop
		Else
			_IENavigate($o_Obj, $s_Url)
			If @error Then ExitLoop
		EndIf
		$o_Table = _IEGetObjById($o_Obj, 'gs')
		If @error Then ExitLoop
		$o_Trs = _IETagNameGetCollection($o_Table, 'tr')
		If @error Or Not @extended Then ExitLoop
		For $o_Tr In $o_Trs
			If $o_Tr.bgColor <> '0' Then
				$o_Ths = _IETagNameGetCollection($o_Tr, 'th')
				If @error Or Not @extended Then ContinueLoop
				$s_String_Control = ''
				For $o_Th In $o_Ths
					$s_String_Control &= $o_Th.innertext & '|'
					If StringInStr($s_String_Control, $s_Rate & '|' & $s_String & '|' & $s_Type) Then
						$o_Link = _IETagNameGetCollection($o_Tr, 'a', 0)
						If @error Then ExitLoop 3
						$f_Yes = True
						ExitLoop 2
					EndIf
				Next
			EndIf
		Next
		$i_Error = 0
	Next
	If $i_Error Then Return SetError(1)
	If $f_Yes Then
		For $i = 1 To 1
			_IEAction($o_Link, 'click')
			If @error Then ExitLoop
			;здесь вылазит окно Пройдите авторизацию
			_IELoadWait($oIE)
			If @error Then ExitLoop
			$s_Nick_Player = StringRegExpReplace($s_String_Control, '\|.*$', '')
		Next
		If @error Then
			Return SetError(1)
		Else
			Return $s_Nick_Player
		EndIf
	Else
		Return -1
	EndIf
EndFunc   ;==>_Play_Fool

Func _Exit()
	If IsObj($oIE) Then
		_IEQuit($oIE)
	EndIf
	Exit
EndFunc   ;==>_Exit
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

Мне еще не удалось проверить работоспособность скрипта, но я думаю он рабочий. Смысл в том, что, когда скрипт работает без авторизации нужно обновлять страницу сайта, а когда пройдешь авторизацию страница обновляется javascript`ом и еще там в таблице появляется пятая колонка с помощью которой можно просмотреть как играют другие люди.



Проверил, все хорошо работает. Спасибо вам огромное <b><i>madmasler</i></b>. Я еще хотел узнать строка (ExitLoop 3) обозначает выход из самого скрипта, а тройка возвращаемое функцией значение подобное Return?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

eropov,
Немного модифицировал код. Если при первой проверке нужной игры нет, то окно IE делается скрытым (Ctrl + 1 - скрыть или отобразить окно IE). При появлении нужной игры окно IE отображается. Теперь скрипт сам нажимает кнопки в сообщениях IE.
Код:
#include <IE.au3>
#include <File.au3>

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1)

Global $oIE, $iStart, $sNick

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

$oIE = _IECreate()
If @error Then
	MsgBox(16, 'Error', '_IECreate')
	Exit
EndIf

HotKeySet('{Esc}', '_Exit');Esc - выход

$sNick = _Play_Fool($oIE)
If Not @error And $sNick <> -1 Then
	MsgBox(64, 'Info', 'Авторизируйтесь и играйте с ' & $sNick)
Else
	$oIE.Visible = False
	HotKeySet('^{1}', '_Visible_IE'); Ctrl + 1 - скрыть или отобразить окно IE
	$iStart = TimerInit()
	While 1
		If TimerDiff($iStart) >= 30000 Then ;30sec
			$sNick = _Play_Fool($oIE)
			If Not @error And $sNick <> -1 Then
				$oIE.Visible = True
				MsgBox(64, 'Info', 'Авторизируйтесь и играйте с ' & $sNick)
				ExitLoop
			Else
				$iStart = TimerInit()
			EndIf
		EndIf
		Sleep(50)
	WEnd
EndIf

Func _Play_Fool(ByRef $o_Obj, $s_Rate = '1 RUB', $s_Type = '0')
	Local $s_Url = 'http://igrun.com/?p=39', $o_Table, $o_Trs, $o_Ths, $o_Link, $s_Url_Obj, _
			$s_Nick_Player, $s_String = 'Присоединиться', $s_String_Control, $f_Yes, $i_Error = 1, _
			$s_TempFile, $i_PID

	If Not IsObj($o_Obj) Then Return SetError(1)
	For $i = 1 To 1
		$s_Url_Obj = _IEPropertyGet($o_Obj, 'locationurl')
		If @error Then ExitLoop
		If $s_Url_Obj == $s_Url Then
			_IEAction($o_Obj, 'refresh')
			If @error Then ExitLoop
		Else
			_IENavigate($o_Obj, $s_Url)
			If @error Then ExitLoop
		EndIf
		$o_Table = _IEGetObjById($o_Obj, 'gs')
		If @error Then ExitLoop
		$o_Trs = _IETagNameGetCollection($o_Table, 'tr')
		If @error Or Not @extended Then ExitLoop
		For $o_Tr In $o_Trs
			If $o_Tr.bgColor <> '0' Then
				$o_Ths = _IETagNameGetCollection($o_Tr, 'th')
				If @error Or Not @extended Then ContinueLoop
				$s_String_Control = ''
				For $o_Th In $o_Ths
					$s_String_Control &= $o_Th.innertext & '|'
					If StringInStr($s_String_Control, $s_Rate & '|' & $s_String & '|' & $s_Type) Then
						$o_Link = _IETagNameGetCollection($o_Tr, 'a', 0)
						If @error Then ExitLoop 3
						$f_Yes = True
						ExitLoop 2
					EndIf
				Next
			EndIf
		Next
		$i_Error = 0
	Next
	If $i_Error Then Return SetError(1)
	If $f_Yes Then
		$i_Error = 1
		For $i = 1 To 1
			$s_TempFile = _TempFile()
			$i_PID = _Click_IE_Msg($s_TempFile)
			If @error Then ExitLoop
			_IEAction($o_Link, 'click')
			If @error Then ExitLoop
			_IELoadWait($oIE)
			If @error Then ExitLoop
			$s_Nick_Player = StringRegExpReplace($s_String_Control, '\|.*$', '')
			$i_Error = 0
		Next
		If ProcessExists($i_PID) Then ProcessClose($i_PID)
		If ProcessWaitClose($i_PID, 2) Then FileDelete($s_TempFile)
		If $i_Error Then
			Return SetError(1)
		Else
			Return $s_Nick_Player
		EndIf
	Else
		Return -1
	EndIf
EndFunc   ;==>_Play_Fool

Func _Exit()
	If IsObj($oIE) Then
		_IEQuit($oIE)
	EndIf
	Exit
EndFunc   ;==>_Exit

Func _Visible_IE()
	If Not IsObj($oIE) Then Return
	Local $f_Visible = _IEPropertyGet($oIE, 'visible')
	$oIE.Visible = Not $f_Visible
EndFunc   ;==>_Visible_IE

Func _Click_IE_Msg($s_File)
	Local $h_File, $i_Pid_Process
	Local $s_Script = "#NoTrayIcon" & @CRLF & _
			"While 1" & @CRLF & _
			"$hWin = WinGetHandle('[Title:Сообщение с веб-страницы; Class:#32770]')" & @CRLF & _
			"If $hWin Then ControlClick($hWin, '', '[CLASS:Button; INSTANCE:1]')" & @CRLF & _;INSTANCE:1 - OK, INSTANCE:2 - Отмена
			"Sleep(100)" & @CRLF & _
			"WEnd"
	$h_File = FileOpen($s_File, 2)
	If $h_File = -1 Then Return SetError(1)
	If Not FileWrite($h_File, $s_Script) Then Return SetError(1)
	FileClose($h_File)
	$i_Pid_Process = Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $s_File & '"')
	If Not $i_Pid_Process Then Return SetError(1)
	Return $i_Pid_Process
EndFunc   ;==>_Click_IE_Msg


eropov [?]
хотел узнать строка (ExitLoop 3) обозначает
Это означает выход из цикла 3:
Код:
For $i = 1 To 5; третий цикл
	For $j = 1 To 5 ; второй цикл
		For $q = 1 To 5 ; первый цикл
			ExitLoop 1 ; Выход из первого цикла
			;ExitLoop 2 ; Выход из второго цикла
			;ExitLoop 3 ; Выход из третьего цикла
		Next
	Next
Next
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

ExitLoop 3 означает на какой уровень вложенности цикла ты попадешь при применении команды
Код:
While 1
    While 1
        While 1
            ;ExitLoop
            ;ExitLoop 2
            ;ExitLoop 3
        WEnd
        ;Сюда приведет ExitLoop
    WEnd
    ;Сюда приведет ExitLoop 2
WEnd
;Сюда приведет ExitLoop 3
 
Автор
E

eropov

Jury
Сообщения
195
Репутация
25
Re: [Сеть, интернет] Как через IE.au3 нажать на javascript строку в таблице после логического выво

Да, от этого кода у меня каша в голове :wacko: . Большее количество функций которые я никогда не использовал, допустим opt(Изменить параметры выполнения функций AutoIt.) для чего изменить и что изменить, но в целом код замечательно работает.
Теперь скрипт сам нажимает кнопки в сообщениях IE.
О чем это говорит? Я буду вам признателен ,если вы объясните как все работает(будет как учебное пособие)
 
Верх