Что нового

[Сеть, интернет] Как получить ссылку на элемент DOM

lightGray

Новичок
Сообщения
16
Репутация
1
Передо мной стоит задача автоматизировать вход на сайт банк-клиента. С т.з. человека, обладающего урезанным знанием DOM, на сайте творится какая-то магия. В т.ч. не удается обратиться к нужным элементам, которые отражаются по _IEDocReadHTML($oie) и в "Просмотре кода элемента". Т.е. IsObj нужных кнопок сайта и полей постоянно возвращает 0.
Речь идет о странице https://wbc10.sobinbank.ru/v20/s/bsi.dll?T=RT_1Loader.Load&ref=http://wbc.sobinbank.ru/
(у меня криво отображается в Chrome. По идее под IE9 нужно заходить)

Для начала проблемы со следующим элементом:
Код:
<input type="checkbox" id="fUnsafe" class="ldWrk" style="border: 0px;" onclick="Top.changeSafe(this)">

Следующий код дал 000000
Код:
Sleep(10000)
$id = "fUnsafe"
$o1 = $ie.getelementbyid($id)
$o2 = _IEGetObjById($oie,$id)
$o3 = _IEGetObjByName($oie,$id)
$o4 = _IEFormGetObjByName($oie,$id)
$o5 = _IEFormElementGetObjByName($oie,$id)
$o6 = _IETagNameGetCollection($oie,"id",0)
ConsoleWrite(@CRLF & IsObj($o1) & IsObj($o2) & IsObj($o3) & IsObj($o4) & IsObj($o5) & IsObj($o6))
ConsoleRead()


Грешу на JavaScript и Загрузку компонентов ActiveX. Не знаю, что из них, но наверняка хоть что-то влияет на это "безобразие".
И второстепенный вопрос, если он уместен: можно ли как-то напрямую обратиться к функции "Top.changeSafe(this)", которая возникает при клике?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
lightGray [?]
И второстепенный вопрос, если он уместен: можно ли как-то напрямую обратиться к функции "Top.changeSafe(this)", которая возникает при клике?
да можно
 
Автор
L

lightGray

Новичок
Сообщения
16
Репутация
1
Код:
$ie.documentElement.execscript('Top.changeSafe(this)')

тоже не работает. Ожидание перед этим ни к чему не приводит.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
lightGray
lightGray сказал(а):
вот знаете, по вашим обрывкам кода совершенно не понятно, как вам помогать.
Если $ie - это объект интерент експлорер, то это:
lightGray [?]
$ie.documentElement.execscript('Top.changeSafe(this)')
вообще не правильно
А если $ie это объект документа, то documentElement - возвратит первый корень, т.е объект html, у которого нету метода execscript

Код:
.execscript('Top.changeSafe(this)')

так врядли будет работать, т.к this опредиться только тогда, когда будет нажат input.

Скрипты выполняются так:
Код:
$oIE.document.parentWindow.execScript("какой то скрипт")
 
Автор
L

lightGray

Новичок
Сообщения
16
Репутация
1
Справедливо, в общем-то. Просто хотел сократить код. Пропущены строки
Код:
$oie = _IECreate("url")
$ie = $oie.document

Про document.parentWindow... - мог спутать. У меня код работал, просто конец рабочего дня был, видимо запутался. Надо будет проверить на работе, не спутал ли и в коде, который проверял.
Я так понял, что метод execscript или eval, последний из которых помимо действий возвращает какое-то вычисляемое значение, относятся к объекту window. Мое кропотливое изучение темы стопорится от того, что я нигде в одном месте не могу найти всей информации, как было бы, если бы я изучал javascript; например по этой ссылке метод вообще отсутствует http://www.w3schools.com/jsref/obj_window.asp

this опредиться только тогда, когда будет нажат input.
Правильно понял, что функции с "this" через execscript невозможно обрабатывать?

И если знаете, то подскажите ответ или направление для поиска по основному вопросу: что делать, чтобы получить для клика объект fUnsafe?
В любом случае, большое спасибо. Наверное из всего, что я изучал в жизни, это дается с максимальным трудом именно в силу разбросанной по всему интернету информации, которую приходится собирать как паззл.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
lightGray [?]
я нигде в одном месте не могу найти всей информации
я все ищу на msdn. Вот с чего можно начать.
это
и это

Правильно понял, что функции с "this" через execscript невозможно обрабатывать?
Попробуйте вместо this передать объект input

Код:
$oIE.document.parentWindow.execScript("Top.changeSafe("&$oinput&")")

или гляньте что делает Top.changeSafe
 
Автор
L

lightGray

Новичок
Сообщения
16
Репутация
1
За ссылки, кстати, спасибо. Вообще не понятно, причем тут Visual Basic, но я изучу.

Попробуйте вместо this передать объект input
Да было бы здорово, если бы объект вообще существовал. Я бы тогда может и не заморачивался с execscript. Хотя в любом случае интересно и полезно.
Создав коллекцию тэгов (_IETagNameAllGetCollection) и пройдя их циклом с tagname, увидел, что половина из них: SCRIPT, а остальные представлены HTML, HEAD, TITLE, META, XML, FRAMESET и FRAME. Нет инпутов.
Все упирается в то, что бОльшая часть сайта дозагружается так, что даже Sleep не помогает обратиться к этим элементам.
Честно, над вопросом уже неделю или дольше бьюсь.



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

только что нашел. Если после загрузки страницы сделать Sleep (1000), то добавляется один тег OBJECT сразу после HEAD. Но на нужный объект это не влияет.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А в фреймах этот input находится? если находится, то обратите внимание на домен этого фрейма.
 
Автор
L

lightGray

Новичок
Сообщения
16
Репутация
1
Там на странице подгружается ActiveX объект (BSS ActiveX library v 3.17.9.1820).
хотя бы подскажите, что почитать на эту тему. Я знаю, что там ActiveX, хотя плохо понимаю, что с ним делать. Я об этом в первом сообщении указывал.

А в фреймах этот input находится? если находится, то обратите внимание на домен этого фрейма.
Я не понимаю, что вы имеете в виду.
В смысле следующий код возвращает 0:
Код:
Sleep (3000)
_IETagNameGetCollection($oie,"input")
$all = @extended
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
lightGray [?]
хотя бы подскажите, что почитать на эту тему
Ну, например это, для общего понимания.

что с ним делать
Работать как с объектом. У объекта есть методы и свойства.

Можно попробовать работать непосредственно через объект. Правда не спрашивайте как, ставить клиент и разбираться в логике работы банковской надстройки для IE я не буду. :smile:

Вот код, он покажет вам версию вашего клиента:
Код:
$oBSSAx = ObjCreate('BSSAx.AXTools')
If Not IsObj($oBSSAx) Then
	MsgBox(16, @ScriptName, 'bssax.ocx not found!')
	Exit
EndIf

ConsoleWrite('У вас установлен BSS ActiveX library v' & $oBSSAx.AXVersion & @CRLF)

$oBSSAx = 0
 
Автор
L

lightGray

Новичок
Сообщения
16
Репутация
1
Можно попробовать работать непосредственно через объект. Правда не спрашивайте как, ставить клиент и разбираться в логике работы банковской надстройки для IE я не буду. :smile:
Допустим, это и не нужно. Но если бы стали, что бы делали, где и как бы искали информацию?
Тот чудесный непонятный код дал следующий ответ
"У вас установлен BSS ActiveX library v3.17.9.1820"
Мне от этого ни холодно, ни жарко. Мне не понятно даже, что гуглить, чтобы понять методы наверное объекта BSS ActiveX library v3.17.9.1820. Просто поиск по запросу BSS ActiveX library v3.17.9.1820 дает ноль вариантов.
Сижу, перебираю запросы...
Означает ли все это, кстати, что к id элемента input я никак не могу обратиться? Почему в html-коде элемент тогда есть? Я общего принципа не понимаю.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
lightGray [?]
Я общего принципа не понимаю
Почитайте материал, для начала:
Введение в COM - RSDN
COM/DCOM/COM+

Мне от этого ни холодно, ни жарко
А жаль, потому как у вас установлен клиент v3.17.9.1820

Но если бы стали, что бы делали
Попробовал бы общаться с сервером банка используя библиотеку клиента напрямую, тем более она у вас уже зарегистрирована в системе.
где и как бы искали информацию?
Код:
Нашёл бы в системе библиотеку (её имя bssax.ocx). Как я узнал её имя? Просто не поленился, и по запросу BSS ActiveX в Google, нашёл ссылку где можно скачать Installer клиента, и распотрошил его.
Утилитой OLEView посмотрел её методы и свойства.
Проанализировал бы работу клиента, собрал все данные. Проанализировал сетевые заголовки, пакеты (если они не зашифрованы).
Ну, и так далее.

Означает ли все это, кстати, что к id элемента input я никак не могу обратиться?
Нет. Вы можете обратиться, если только input не находится в документе который грузится с другого домена или субдомена в iframe.
 
Автор
L

lightGray

Новичок
Сообщения
16
Репутация
1
для того, чтобы понять ваш ответ, мне не хватает высшего образования или хотя бы нескольких месяцев изучения всего подряд) Вообще о чем-то подобном я мечтал, чтобы вслепую ковыряясь в методах объектов был какой-то способ получить просто перечень всех доступных методов. И их потом перебирать. Потому что информация в интернете полезна в том случае, если ты понимаешь, что ищешь.
Но вообще ответ мне понравился. Видимо, пока слишком глубоко копаю для того, чтобы без базы разобраться поверхностно с вопросом.
Все-таки интересно почитать, что по первой ссылке. Она битая.

Попробую теперь разобраться с фреймами. Действительно, один из фреймов обладает атрибутом src, правда как добавить его к имеющему документу я не понимаю. Как и не понимаю, почему если в коде html элемент есть, то autoit его не видит и не может к нему обратиться.
Если не смогу разобраться, продолжу эту тему. Иначе отчитаюсь здесь. Так или иначе, тема уникальная, судя по произведенному поиску в этом форуме.


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

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

Код:
$fie = _IEFrameGetObjByName($oie,"RT_IC_HLP")
$fie = $fie.document.documentelement
$id = "fUnsafe"
$o = _IEGetObjById($fie,$id)

ConsoleWrite(@CRLF & IsObj($o))
ConsoleRead()

В последнем сообщении inververs тоже говорил об этом. Сбило с толку указание на домен, наверное, или не понял чего-то.
Работать через объект bssax.ocx все-таки не очень разумно, потому что в общем случае это потребует времени на изучение самого объекта. Но в некоторых случаях наверняка оно того стоит. Однако сама возможность узнать методы объекта мне точно понадобится.
Всем большое спасибо.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
lightGray [?]
что элемент во фрейме принадлежит другому документу
Совершенно верно.
Сбило с толку указание на домен
Документ в iframe может грузиться с:
своего домена:
Код:
//основной домен httр://mydomain.ru
<iframe src="banner.html" width="468" height="60" align="left">
    Ваш браузер не поддерживает фреймы!
</iframe>
другого домена
Код:
//основной домен httр://mydomain.ru
<iframe src="httр://microsoft.com/banner.html" width="468" height="60" align="left">
    Ваш браузер не поддерживает фреймы!
</iframe>
или субдомена:
Код:
//основной домен httр://mydomain.ru
<iframe src="httр://chat.mydomain.ru/banner.html" width="468" height="60" align="left">
    Ваш браузер не поддерживает фреймы!
</iframe>

Работать через объект bssax.ocx все-таки не очень разумно
Ну, это с какой стороны посмотреть.
узнать методы объекта мне точно понадобится.
Я прикрепил вам файл где есть все данные по этой библиотеке.
Эта библиотека практически не описана в интернете, но зная логику работы приложения (клиента) и имея названия методов и свойств можно пытаться работать.
 
Верх