Что нового

как получить свойства и значения элемента или объекта ?

Сообщения
35
Репутация
-1
Добрый вечер
Юный Люк Скайуокер ищет магистра Йоду :smile:
Хочу немного упростить разбор документа написать функцию которая загоняла бы в массив свойства и значения элемента но не знаю как это сделать,
и на основе возвращаемых значений устанавливать параметры которые бы использовала другая функция
Сейчас обрисую ситуацию.
Код:
$oIE = _IECreate('https://mail.yandex.ru/')
;эта страница содержит 2 формы

; например мне нужны все формы в документе и информация которую они содержат
$oForm = _IEFormGetCollection($oIE,-1)
; получаю коллекцию форм

For $i In $oForm
 ; перебираю каждую форму через цикл (тут все норм) 
 $oForms = _IEFormGetCollection($oIE,$i)
;и тут не знаю что делать сейчас разложу по полочкам 
;я так понимаю свойства и значения формы это своего рода массив и можно получить значения указав свойство

1) $oForms.Classname
2) $oForms.id
3) $oForms.type
4) $oForms.valye
5) $oForms.method 
; ну и так далее
Next

У каждой формы может быть разный набор свойств и количество и они прописаны в объекте
будьте добры подскажите как собственно получить этот набор свойств в виде строки а дальше уже перебирать значения по этому набору,
и еще способ получения свойств элементов данной формы если отличается, если аналог (то сам разберусь),
и еще вопрос некоторые элементы имеют значение "hidden" и значения у них стандартной функцией не возвращается может тоже есть способ?
P:S Душевная благодарность всем кто поможет, и поднятие репутации гарантирую ;)
 

The Dream

Новичок
Сообщения
393
Репутация
3
Просто на заметку, может натолкнет на мысли:

Код:
#include <IE.au3>

$oIE = _IECreate('https://mail.yandex.ru/')

$oColl = _IETagNameAllGetCollection($oIE)

For $o In $oColl
	ConsoleWrite('$o.value=' & $o.value & _
			' | $o.name=' & $o.name & _
			' | $o.id=' & $o.id & _
	'  | $o.value=' & $o.classname & _
			' | $o.type=' & $o.type & @CRLF)
Next


For $o In $oColl
	if $o.type = 'hidden' Then
        	ConsoleWrite('Hidden tags: ' & '$o.value=' & $o.value & _
			' | $o.name=' & $o.name & _
			' | $o.id=' & $o.id & _
	' | $o.value=' & $o.classname & _
			' | $o.type=' & $o.type & @CRLF)
    EndIf
Next



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

Gen345 [?]
и еще вопрос некоторые элементы имеют значение "hidden" и значения у них стандартной функцией не возвращается может тоже есть способ?

У любого тега могут быть под-теги (например тег TD в конструкции тега TR и т.д.), поэтому любой тег доступен для вас, вам только стоит его извлекать из другого тега. Для этого необходимо использовать ф-цию _IETagNameGetCollection() или _IETagNameAllGetCollection(), которая будет извлекать теги из вами найденного например по маске (учтите, что _IETagNameGetCollection() извлекает не все теги).
 
Автор
G
Сообщения
35
Репутация
-1
Zalman1980 сказал(а):
Просто на заметку, может натолкнет на мысли:

Код:
#include <IE.au3>

$oIE = _IECreate('https://mail.yandex.ru/')
[autoit]
$oColl = _IETagNameAllGetCollection($oIE)

For $o In $oColl
	ConsoleWrite('$o.value=' & $o.value & _
			' | $o.name=' & $o.name & _
			' | $o.id=' & $o.id & _
	'  | $o.value=' & $o.classname & _
			' | $o.type=' & $o.type & @CRLF)
Next


For $o In $oColl
	if $o.type = 'hidden' Then
        	ConsoleWrite('Hidden tags: ' & '$o.value=' & $o.value & _
			' | $o.name=' & $o.name & _
			' | $o.id=' & $o.id & _
	' | $o.value=' & $o.classname & _
			' | $o.type=' & $o.type & @CRLF)
    EndIf
Next

так давайте разберемся
Код:
For $o In $oColl
	ConsoleWrite('$o.value=' & $o.value & _
			' | $o.name=' & $o.name & _
			' | $o.id=' & $o.id & _
	'  | $o.value=' & $o.classname & _
			' | $o.type=' & $o.type & @CRLF)
Next

вот смотрите свойство указывать я умею,
а нужно мне получить список свойств в виде строки через цикл не зная имена этих свойств у данного объекта и их количество
например форма объект HTMLFormElement
$oForm.("свойство неизвестно") варианты могут быть "acceptCharset" "action" "enctype" "name" ...
некоторые свойства будут 100% но некоторых может и не быть , так вот надо узнать какие свойства есть и их количество
если с самой формой еще более менее там не много вариантов то с елементом формы намного сложней вопрос,
поэтому и нужно получить список свойств и их имя в массив а дальше уже значения получать прогоняя через список свойств.

ну вот пример из JavaScript
https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Working_with_Objects
Код:
Вы можете пользоваться квадратными скобками в конструкции for...in чтобы выполнить итерацию всех свойств объекта для которых она разрешена. Чтобы показать как это работает, след. функция показывает все свойства объекта, когда вы передаете в нее сам объект и его имя как аргументы функции:

function showProps(obj, objName) {
  var result = "";
  for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
        result += objName + "." + i + " = " + obj[i] + "\n";
    }
  }
  return result;
}
Так что, если вызвать эту функцию вот так showProps(myCar, "myCar") то получим результат:

myCar.make = Ford
myCar.model = Mustang
myCar.year = 1969
то есть данная функция возвращает имена свойств имеющихся у объекта и их значения не зная их изначально
но блин скок я не бился и не пытался перевести такой вариант на AutoIt не получается
там еще есть куча команд которые тоже самое делают что как это применять не могу разобраться,
есть проверка атрибутов объекта типо можно ли ваще перечислить свойства объекта в цикле FOR IN и еще куча непоняток кароч в тупике
есть функция которая возвращает булево есть например данное свойство у объекта или нет
то есть можно проверять все возможные варианты и если True значит можно в массив но это не самый лучший вариант лучше чтобы список имеющихся возвращался
вот еще ссылка вроде тож свойства объекта возвращает
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
 

The Dream

Новичок
Сообщения
393
Репутация
3
Gen345 [?]
вот смотрите свойство указывать я умею,а нужно мне получить список свойств в виде строки через цикл не зная имена этих свойств у данного объекта и их количество

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

PS И советую более конкретно указать задачу..


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

Gen345 [?]
function showProps(obj, objName) {

Вот здесь как раз и указывается имя обьекта, то есть аналогично и в AutoIt.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Gen345,
Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.
 
Автор
G
Сообщения
35
Репутация
-1
Zalman1980 сказал(а):
В том то и дело, что если вы не знаете какие свойства есть у обьекта, а каких нет - то нужно их перебирать и пустые не отображать. Вот и все, в примере выводятся все подряд. А какие могут быть свойства - это уже указывайте самостоятельно, вряд ли возможно по-другому.
PS И советую более конкретно указать задачу..
не серчайте учусь правильно писать потихоньку

Я уже не знаю как точней указать задачу
1) получить из объекта ИМЕНА и КОЛИЧЕСТВО свойств а не значений свойств не прописывая эти свойства в ручную, что тут не понятного я написал не понимаю честное слово (вернуть имя свойства в виде строки)
2) не может быть такого чтоб не существовало функции или команды которая могла бы вернуть имена свойств находящиеся в объекте
3) пример функции из JavaScript так и делает она возвращает имена свойств (а не значений) покажите пример из библиотеки IE которая вернет имена свойств в массив беря за основу только объект как переменную
блин я не знаю как еще расписать более подробней
P:S вы не подумайте что я на вас серчаю, или наезжаю у меня просто такая манера письма )
 
Автор
G
Сообщения
35
Репутация
-1
сейчас попробую
хотя честно не очень нравится способ с использованием StringRegExp
хотелось бы функции JavaScript заюзать но походу выбора пока нет )
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Код:
$oLinks = $oHTML.getElementsByTagName("a")
If Not IsObj($oLinks) Then Exit 2
For $oLink In $oLinks
	$oAttributes = $oLink.attributes()
	If IsObj($oAttributes) Then
		For $oAttribute In $oAttributes
			ConsoleWrite($oAttribute.name & "=" & $oAttribute.value & @CRLF)
		Next
	EndIf
Next



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

Код:
#include <IE.au3>
$oIE = _IECreate('https://mail.yandex.ru/')
$oForm = _IEFormGetCollection($oIE, -1)

For $i In $oForm
	$oAttributes = $i.attributes()
	If IsObj($oAttributes) Then
		For $oAttribute In $oAttributes
			ConsoleWrite($oAttribute.name & "=" & $oAttribute.value & @CRLF)
		Next
	EndIf
Next

Код:
onchange=
onmsanimationiteration=
onmspointerhover=
onmsgotpointercapture=
aria-haspopup=
onbeforeactivate=
onbeforepaste=
onmspointermove=
onmscontentzoom=
onvolumechange=
onmsgotpointercapture=
oncopy=
onmspointerdown=
onmsgesturedoubletap=
onmspointerleave=
onmouseleave=
ondragstart=
onmsanimationend=
onpointerup=
onpointerover=
onseeking=
onmsinertiastart=
onpointercancel=
aria-required=
aria-expanded=
onscroll=
aria-grabbed=
onmouseup=
onbeforecut=
implementation=
onclick=
spellcheck=
ondurationchange=
role=
aria-disabled=
tabindex=
aria-label=
lang=
onkeypress=
aria-valuenow=
aria-checked=
onmspointermove=
onmstransitionstart=
onpause=
onemptied=
onmsanimationstart=
aria-busy=
ontimeupdate=
onabort=
onmouseover=
onmsgestureend=
onfocusin=
onmsgesturechange=
onmspointerdown=
onmsmanipulationstatechanged=
onseeked=
aria-describedby=
ondblclick=
aria-flowto=
onpage=
onmsgesturehold=
onmstransitionend=
ondragleave=
ondragend=
onplaying=
aria-orientation=
aria-multiline=
onmspointerenter=
onlostpointercapture=
onmouseenter=
onmousemove=
aria-secret=
onkeyup=
aria-hidden=
onbeforedeactivate=
onmousedown=
aria-pressed=
oncut=
onended=
aria-readonly=
onfocus=
aria-posinset=
onmouseout=
onmsgesturestart=
disabled=
aria-selected=
onloadstart=
onerror=
onpointercancel=
aria-dropeffect=
onmspointerleave=
ondragover=
onreset=
oncanplay=
x-ms-aria-flowfrom=
onmspointerout=
onratechange=
aria-controls=
onfocusout=
aria-relevant=
draggable=
x-ms-acceleratorkey=
aria-level=
onmsgesturetap=
onsuspend=
oninput=
onblur=
ondragenter=
aria-setsize=
ondrag=
onwaiting=
id=
title=
onmsregionupdate=
onprogress=
aria-live=
aria-valuetext=
aria-multiselectable=
onreadystatechange=
aria-sort=
onplay=
class=new-auth-form js-new-auth-form
onsubmit=
aria-invalid=
onselectstart=
aria-autocomplete=
onpaste=
onhelp=
onload=
ondeactivate=
onpointerup=
hidefocus=
oncanplaythrough=
contenteditable=
onkeydown=
aria-valuemin=
language=
style=
onloadeddata=
oncontextmenu=
aria-valuemax=
onmspointerenter=
dir=
aria-activedescendant=
onbeforecopy=
onpointerover=
onactivate=
oninvalid=
oncuechange=
ondrop=
onlostpointercapture=
accesskey=
aria-owns=
onselect=
aria-atomic=
aria-labelledby=
onmspointerout=
onloadedmetadata=
onmousewheel=
onstalled=
accept-charset=
enctype=
method=POST
name=
action=https://passport.yandex.ru/passport?mode=auth&from=mail&origin=hostroot_ru_nol_mobile_enter&retpath=https%3A%2F%2Fmail.yandex.ru
novalidate=
target=
onchange=
onmsanimationiteration=
onmspointerhover=
onmsgotpointercapture=
aria-haspopup=
onbeforeactivate=
onbeforepaste=
onmspointermove=
onmscontentzoom=
onvolumechange=
onmsgotpointercapture=
oncopy=
onmspointerdown=
onmsgesturedoubletap=
onmspointerleave=
onmouseleave=
ondragstart=
onmsanimationend=
onpointerup=
onpointerover=
onseeking=
onmsinertiastart=
onpointercancel=
=
=
onscroll=
aria-grabbed=
onmouseup=
onbeforecut=
implementation=
onclick=
spellcheck=
ondurationchange=
role=
aria-disabled=
tabindex=
=
lang=
onkeypress=
=
aria-checked=
onmspointermove=
onmstransitionstart=
onpause=
onemptied=
onmsanimationstart=
aria-busy=
ontimeupdate=
onabort=
onmouseover=
onmsgestureend=
onfocusin=
onmsgesturechange=
onmspointerdown=
onmsmanipulationstatechanged=
onseeked=
aria-describedby=
ondblclick=
aria-flowto=
onpage=
onmsgesturehold=
onmstransitionend=
ondragleave=
ondragend=
onplaying=
aria-orientation=
=
onmspointerenter=
onlostpointercapture=
onmouseenter=
onmousemove=
aria-secret=
onkeyup=
=
onbeforedeactivate=
onmousedown=
aria-pressed=
oncut=
onended=
aria-readonly=
onfocus=
aria-posinset=
onmouseout=
onmsgesturestart=
disabled=
aria-selected=
onloadstart=
onerror=
onpointercancel=
aria-dropeffect=
onmspointerleave=
ondragover=
onreset=
oncanplay=
x-ms-aria-flowfrom=
onmspointerout=
onratechange=
aria-controls=
onfocusout=
aria-relevant=
draggable=
x-ms-acceleratorkey=
aria-level=
onmsgesturetap=
onsuspend=
oninput=
onblur=
ondragenter=
aria-setsize=
ondrag=
onwaiting=
=
title=
onmsregionupdate=
onprogress=
aria-live=
aria-valuetext=
aria-multiselectable=
onreadystatechange=
aria-sort=
onplay=
class=promo-phone-form
onsubmit=
=
onselectstart=
aria-autocomplete=
onpaste=
onhelp=
onload=
ondeactivate=
onpointerup=
hidefocus=
oncanplaythrough=
contenteditable=
onkeydown=
aria-valuemin=
language=
style=
onloadeddata=
oncontextmenu=
aria-valuemax=
onmspointerenter=
dir=
aria-activedescendant=
onbeforecopy=
onpointerover=
onactivate=
oninvalid=
oncuechange=
ondrop=
onlostpointercapture=
accesskey=
aria-owns=
onselect=
aria-atomic=
aria-labelledby=
onmspointerout=
onloadedmetadata=
onmousewheel=
onstalled=
accept-charset=
enctype=
method=
name=
action=
novalidate=
target=
+>07:51:52 AutoIt3.exe ended.rc:0
+>07:51:52 AutoIt3Wrapper Finished.
>Exit code: 0    Time: 3.165


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

Можно их даже отфильтровать:
Код:
;...
		For $oAttribute In $oAttributes
			If $oAttribute.value = "" Then ContinueLoop
			ConsoleWrite($oAttribute.name & "=" & $oAttribute.value & @CRLF)
		Next
;...

Код:
class=new-auth-form js-new-auth-form
method=POST
action=https://passport.yandex.ru/passport?mode=auth&from=mail&origin=hostroot_ru_nol_mobile_enter&retpath=https%3A%2F%2Fmail.yandex.ru
class=promo-phone-form
Вот... На много лучше воспринимается, только нужная информация...


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

Вот... Самые настоящие
Gen345 [?]
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
alex33 [?]
Можно их даже отфильтровать
Какая у вас версия IE?

Gen345 [?]
хотелось бы функции JavaScript заюзать
Что мешает?
Код:
$oIE = ObjCreate('InternetExplorer.Application')
$oIE.Visible = 1
$oIE.Navigate('https://mail.yandex.ru/')

While Not (String($oIE.readyState) = "complete" Or $oIE.readyState = 4)
	Sleep(100)
WEnd

$oForm = $oIE.Document.getElementsByTagName("form")

For $oF In $oForm
	For $i = 0 To $oF.Attributes.length-1
		$oValue = $oF.Attributes($i).Value
		Switch $oValue
		Case 'null', '0', '[object Object]', False
			ContinueLoop
		Case Else
			$oName = $oF.Attributes($i).Name
			ConsoleWrite($oName &' - > '& $oValue & @CR)
		EndSwitch
	Next
	ConsoleWrite('===================================' & @CR)
Next


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

Ну если уж совсем чистый JScript. :smile:
Код:
_IEHeadInsertEventScript
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Garrett сказал(а):
OffTopic:
И ваш код фильтрации работает?

alex33 [?]
Можно их даже отфильтровать
Ну да, работает. Он просто пропускает пустые (неопределённые) элементы.


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

См. под спойлером и после фильтрации.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
OffTopic:
alex33 [?]
См. под спойлером и после фильтрации.
Я не спорю.
Однако, ваш метод фильтрации не работает должным образом в IE8.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
OffTopic:
Garrett [?]
Однако, ваш метод фильтрации не работает должным образом в IE8.
Ну это просто потому, что на 8 версии я это не предусмотрел и не проверял... ::smile:
 
Автор
G
Сообщения
35
Репутация
-1
alex33 сказал(а):


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

Можно их даже отфильтровать:
Код:
;...
		For $oAttribute In $oAttributes
			If $oAttribute.value = "" Then ContinueLoop
			ConsoleWrite($oAttribute.name & "=" & $oAttribute.value & @CRLF)
		Next
;...




вот вроде работает как надо с методом фильтрации,
можно будет написать универсальную функцию и больше не лазить в документе по панели DOM

всем спасибо кто откликнулся , alex33 благодарю :ok:
 
Верх