Что нового

[Автоматизация] Как выбрать значение в дереве в Internet Explorer

vaf

Новичок
Сообщения
165
Репутация
2
Добрый день форумчане.
Делаю автоматизированное заполнение форм в Internet Explorer, используя ie.au3, произошел такой затык.
Не могу выбрать значение из раскрывающегося дерева. Конкретный пример на
http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1
например как выбрать в самом низу категории ну скажем "Компьютеры и ПО" - "Компьютерные сети", после чего:

нажать кнопку ">>>" (<INPUT class=button id=sobi2AddCatBt title="Добавить Категория" onclick=javascript:addCategory() type=button value=">>>">)

и поставить галочку в чекбоксе (<INPUT id=accept_rules type=checkbox value="" name=accept_rules>)

Автоматическое заполнение сделал, а вот это не могу. пока приходится старыми методами - эмулируя нажатия мыши, но это долго и неудобно.

Заранее спасибо за помощь.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
vaf
Раскрыть список и кликнуть по ссылке Компьютерные сети у меня получилось так:
Код:
#include <IE.au3>

$sSrc = 'http://www.rccat.ru/components/com_sobi2/images/plusbottom.gif'
$sId = 'sobi2CatsForm_imgExpand91'
$oIE = _IECreate('http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1')
$oImgs = _IEImgGetCollection($oIE)
For $oImg In $oImgs
	If $oImg.id == $sId And $oImg.src == $sSrc Then
		_IEAction($oImg, 'click')
		_IELoadWait($oIE)
		ExitLoop
	EndIf
Next
_IELinkClickByText($oIE, 'Компьютерные сети')
А дальше, т.к. я не авторизирован (не зарегистрирован), у меня на странице нет ссылки Добавить Категория.

У меня работает и так:
Код:
#include <IE.au3>

$sSrc = 'http://www.rccat.ru/components/com_sobi2/images/plusbottom.gif'
$oIE = _IECreate('http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1')
_IEImgClick($oIE, $sSrc)
_IELinkClickByText($oIE, 'Компьютерные сети')


И так: :smile:
Код:
#include <IE.au3>

$oIE = _IECreate('http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1')
_IELinkClickByText($oIE, 'Компьютерные сети')
 
Автор
V

vaf

Новичок
Сообщения
165
Репутация
2
нет, я имел ввиду дерево которое внизу

http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1

Категории
+--Компьютеры и ПО
+-- компьютерные сети

и справа от нее кнопочка ">>>"

там не обязательно регистрироваться
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
vaf
У меня так работает:
Код:
#include <IE.au3>

$sSrc = 'http://www.rccat.ru/components/com_sobi2/images/plusbottom.gif'
$sUrl = 'http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1'
$sText = 'Компьютерные сети'
$iStartTime = TimerInit()
$oIE = _IECreate($sUrl)
$oClick = _IEGetObjById($oIE, 'sobi2AddCatBt')
$oInfo = _IEGetObjById($oIE, 'catIntroText')
$oSelect = _IEGetObjById($oIE, 'sobi2SlectedCats')

_IEImgClick($oIE, $sSrc)

While 1
	$oCN = _IEGetObjById($oIE, 'sobi2CatsForm95')
	If IsObj($oCN) Then ExitLoop
	If TimerDiff($iStartTime) >= 10000 Then
		MsgBox(16, 'Error', 'Error')
		_IEQuit($oIE)
		Exit
	EndIf
	Sleep(10)
WEnd
$iStartTime = TimerInit()
While 1
	_IEAction($oCN, 'click')
	If StringInStr(_IEPropertyGet($oInfo, 'innertext'), $sText) Then ExitLoop
	If TimerDiff($iStartTime) >= 10000 Then
		MsgBox(16, 'Error', 'Error')
		_IEQuit($oIE)
		Exit
	EndIf
	Sleep(10)
WEnd

_IEAction($oClick, 'click')

MsgBox(64, 'OK', _IEPropertyGet($oSelect, 'innertext'))


Про CheckBox забыл:
Код:
#include <IE.au3>

$sUrl = 'http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1'

$oIE = _IECreate($sUrl)

$oForm = _IEFormGetObjByName($oIE, 'sobi2EditForm')
If Not _IEFormElementCheckBoxSelect($oForm, '', 'accept_rules', -1) Then
	_IEFormElementCheckBoxSelect($oForm, '', 'accept_rules', 1)
EndIf

А так у меня сначала получает все ID дерева внизу страницы и подписи к ним, а потом раскрывает все дерево:
Код:
#include <IE.au3>
#include <Array.au3>

$sID_1 = 'sobi2CatsForm_imgExpand'
$sID_2 = 'sobi2CatsForm_CatUrl'
$iLen = StringLen($sID_1)
Dim $aID_Cats[1][2]
$j = 0

$sUrl = 'http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1'

$oIE = _IECreate($sUrl)
$oImgs = _IEImgGetCollection($oIE)
For $oImg In $oImgs
	If StringInStr($oImg.id, $sID_1) Then
		$j += 1
		ReDim $aID_Cats[$j + 1][2]
		$aID_Cats[$j][0] = $oImg.id
		$oName = _IEGetObjById($oIE, $sID_2 & StringTrimLeft($aID_Cats[$j][0], $iLen))
		$aID_Cats[$j][1] = _IEPropertyGet($oName, 'innertext')
	EndIf
Next
$aID_Cats[0][0] = $j

_ArrayDisplay($aID_Cats)

For $i = 1 To $aID_Cats[0][0]
	$oImg = _IEGetObjById($oIE, $aID_Cats[$i][0])
	_IEAction($oImg, 'click')
Next
 
Автор
V

vaf

Новичок
Сообщения
165
Репутация
2
Я конечно извиняюсь за свой идиотизм, но пытался оформить в виде функции, работает только для "Компьютерные сети"
я так понимаю для выбора других категорий, менять тут нужно 2 параметра

$sText = 'Компьютерные сети'
$oCN = _IEGetObjById($oIE, 'sobi2CatsForm95')
ставлю другие по анологии, например:
$sText = 'Детские больницы'
$oCN = _IEGetObjById($oIE, 'sobi2CatsForm97')

уже не работает. Работает только для "Компьютеры и ПО"
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
vaf
Попробуйте так:
Код:
#include <IE.au3>

$sMy_String = 'Детские больницы'

_SelectString($sMy_String)

If @error Then
	MsgBox(16, 'Error', 'Error')
Else
	MsgBox(64, 'OK', 'OK')
EndIf

Func _SelectString($sString)
	Local $sID_1 = 'sobi2CatsForm_imgExpand'
	Local $sID_2 = 'sobi2CatsForm_CatUrl'
	Local $iLen = StringLen($sID_1)
	Local $aID_Cats[1][2]
	Local $j = 0
	Local $q = 0
	Local $sUrl = 'http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1'
	Local $oIE, $oImgs, $oImg, $oName, $oClick, $oSelect, $oLinks, $oLink, $sSelect

	$sString = StringStripWS($sString, 3)
	$oIE = _IECreate($sUrl)
	If @error Then Return SetError(1)
	$oImgs = _IEImgGetCollection($oIE)
	If @error Then Return SetError(1)
	For $oImg In $oImgs
		If StringInStr($oImg.id, $sID_1) Then
			$j += 1
			ReDim $aID_Cats[$j + 1][2]
			$aID_Cats[$j][0] = $oImg.id
			$oName = _IEGetObjById($oIE, $sID_2 & StringTrimLeft($aID_Cats[$j][0], $iLen))
			If @error Then Return SetError(1)
			$aID_Cats[$j][1] = _IEPropertyGet($oName, 'innertext')
			If @error Then Return SetError(1)
		EndIf
	Next
	$aID_Cats[0][0] = $j
	For $i = 1 To $aID_Cats[0][0]
		$oImg = _IEGetObjById($oIE, $aID_Cats[$i][0])
		If @error Then Return SetError(1)
		_IEAction($oImg, 'click')
		If @error Then Return SetError(1)
		Sleep(100)
	Next
	$oClick = _IEGetObjById($oIE, 'sobi2AddCatBt')
	If @error Then Return SetError(1)
	$oSelect = _IEGetObjById($oIE, 'sobi2SlectedCats')
	If @error Then Return SetError(1)
	$oLinks = _IELinkGetCollection($oIE)
	If @error Then Return SetError(1)
	For $oLink In $oLinks
		If StringInStr($oLink.innertext, $sString) And StringInStr($oLink.id, 'sobi2CatsForm') Then
			_IEAction($oLink, 'click')
			If @error Then Return SetError(1)
			$q = 1
			ExitLoop
		EndIf
	Next
	Sleep(1000)
	If Not $q Then Return SetError(1)
	_IEAction($oClick, 'click')
	If @error Then Return SetError(1)
	$sSelect = _IEPropertyGet($oSelect, 'innertext')
	$sSelect = StringStripWS($sSelect, 3)
	If $sSelect = $sString Then
		Return SetError(0, 0, 1)
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_SelectString
 
Автор
V

vaf

Новичок
Сообщения
165
Репутация
2
Спасибо, как раз то что нужно, только как бы сделать выполнение $oIE = _IECreate($sUrl) не функции, а до нее, т.к. у меня данные берутся из цикла, и каждый раз запускать IE ни к чему.

Код:
$sMy_String = 'Детские больницы'
$oIE = _IECreate ("http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1")

While 1
    If @error = -1 Then ExitLoop

	; Тут у меня код, который заполняет форму

	_SelectString($sMy_String)

	If @error Then
		MsgBox(16, 'Error', 'Error')
	Else
		MsgBox(64, 'OK', 'OK')
	EndIf
WEnd

т.е. IE запускаем только вначале, а далее при обращении к _SelectString($sMy_String) подставляем данные.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,320
vaf [?]
IE запускаем только вначале, а далее при обращении к _SelectString($sMy_String) подставляем данные.
Переделаю. Только у меня, как у не зарегистрированного пользователя, есть ограничение на добавление только 5 категорий?

Получилось у меня так:
Код:
#include <IE.au3>

$sUrl = 'http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1'
Dim $aMy_String[7] = [6, 'Военные структуры', 'Детское творчество', 'Супермаркеты, гастрономы', _
		'Медицинские услуги', 'Производство, продажа, прокат', 'Apple']
$iError = 0
$iMax = 0
$oIE = _IECreate($sUrl)

For $i = 1 To $aMy_String[0]
	_SelectString($oIE, $aMy_String[$i])

	If @error Then
		$iError += 1
	EndIf
	If @extended = $i Then
		$iMax = @extended
		ExitLoop
	EndIf
Next
If $iMax Then
	$sMessage = 'Добавлено: ' & $iMax - $iError & ' категорий из ' & _
			$aMy_String[0] & @CRLF & 'Лимит на ввод категорий: ' & $iMax & @CRLF & 'Ошибок: ' & $iError
Else
	$sMessage = 'Добавлено: ' & $aMy_String[0] - $iError & ' категорий из ' & _
			$aMy_String[0] & @CRLF & 'Ошибок: ' & $iError
EndIf
MsgBox(64, 'Test', $sMessage)

Func _SelectString($oIE, $sString)
	Local $sID_1 = 'sobi2CatsForm_imgExpand'
	Local $sID_2 = 'sobi2CatsForm_CatUrl'
	Local $iLen = StringLen($sID_1)
	Local $aID_Cats[1][2]
	Local $j = 0
	Local $q = 0
	Local $oImgs, $oImg, $oName, $oClick, $oSelect, $oLinks, $oLink, $sSelect, $oLimit, $iLimit

	$sString = StringStripWS($sString, 3)
	If Not IsObj($oIE) Then Return SetError(1)
	$oLimit = _IEGetObjById($oIE, 'catMsg')
	If @error Then Return SetError(1)
	$iLimit = _IEPropertyGet($oLimit, 'innertext')
	If @error Then Return SetError(1)
	$iLimit = Number(StringRegExpReplace($iLimit, '[^0-9]', ''))
	$oImgs = _IEImgGetCollection($oIE)
	If @error Then Return SetError(1)
	For $oImg In $oImgs
		If StringInStr($oImg.id, $sID_1) Then
			$j += 1
			ReDim $aID_Cats[$j + 1][2]
			$aID_Cats[$j][0] = $oImg.id
			$oName = _IEGetObjById($oIE, $sID_2 & StringTrimLeft($aID_Cats[$j][0], $iLen))
			If @error Then Return SetError(1)
			$aID_Cats[$j][1] = _IEPropertyGet($oName, 'innertext')
			If @error Then Return SetError(1)
		EndIf
	Next
	$aID_Cats[0][0] = $j
	For $i = 1 To $aID_Cats[0][0]
		$oImg = _IEGetObjById($oIE, $aID_Cats[$i][0])
		If @error Then Return SetError(1)
		_IEAction($oImg, 'click')
		If @error Then Return SetError(1)
		Sleep(100)
	Next
	$oClick = _IEGetObjById($oIE, 'sobi2AddCatBt')
	If @error Then Return SetError(1)
	$oSelect = _IEGetObjById($oIE, 'sobi2SlectedCats')
	If @error Then Return SetError(1)
	$oLinks = _IELinkGetCollection($oIE)
	If @error Then Return SetError(1)
	For $oLink In $oLinks
		If StringInStr($oLink.innertext, $sString) And StringInStr($oLink.id, 'sobi2CatsForm') Then
			_IEAction($oLink, 'click')
			If @error Then Return SetError(1)
			$q = 1
			ExitLoop
		EndIf
	Next
	Sleep(1000)
	If Not $q Then Return SetError(1)
	_IEAction($oClick, 'click')
	If @error Then Return SetError(1)
	$sSelect = _IEPropertyGet($oSelect, 'innertext')
	For $i = 1 To $aID_Cats[0][0]
		$oImg = _IEGetObjById($oIE, $aID_Cats[$i][0])
		If @error Then Return SetError(1)
		_IEAction($oImg, 'click')
		If @error Then Return SetError(1)
		Sleep(100)
	Next
	If StringInStr($sSelect, $sString) Then
		Return SetError(0, $iLimit, 1)
	Else
		Return SetError(1)
	EndIf
EndFunc   ;==>_SelectString
На всякий случай сделал проверку лимита ввода категорий.
 
Верх