Что нового

Не работают _IEFrameGetCollection и _IEGetObjById на других компьютерах

Boris

Дорогу осилит идущий
Сообщения
25
Репутация
0
Доброго времени суток форумчане!

Прошу помощи в решении ОЧЕНЬ НУЖНО: на моем компе мой скрипт под IE отлично работает, но на других компах выходит сообщение об ошибке. После анализа нашел что игнорятся команды _IEFrameGetCollection и _IEGetObjById например в коде:
Код:
$oFrame=_IEFrameGetCollection($oIE)
$oObj=_IEGetObjById($oFrame,'j_username'); здесь поле ввода логина
_IEAction($oObj,'focus'); фокус на поле логина
_IEAction($oObj,'CLICK'); клик на логине

На других компах скрипт не реагирует на эти команды как будто их нет. Ради эксперимента в заменил эти команды на _IETagNameGetCollection - эта редакция работает у всех:
Код:
$oInputs=_IETagNameGetCollection($oIE,'input')
;Наводим фокус на поле логина
For $oInput In $oInputs
    If $oInput.type=='text' and $oInput.name=='j_username' Then
        _IEAction($oInput,"focus")
        ExitLoop
    EndIf
Next

Полностью повторил настройки IE на других компьютерах как у себя - никакого эффекта. Что может кроме настроек IE еще влиять на работу команд AutoIT? Что такого в _IEFrameGetCollection что эта команда не работает там где у _IETagNameGetCollection все в порядке? Куда копать дальше? Если у кого есть опыт в этом прошу помочь ...
 
A

Alofa

Гость
_IEFrameGetCollection() вообще возвращает коллекцию, вы проверяли? И есть ли в ней то, что вам нужно?
Судя по вашему второму коду, то в первом по идее нужно использовать _IEGetObjByName() вместо _IEGetObjById().
 
Автор
B

Boris

Дорогу осилит идущий
Сообщения
25
Репутация
0
Alofa сказал(а):
_IEFrameGetCollection() вообще возвращает коллекцию, вы проверяли? И есть ли в ней то, что вам нужно?
Судя по вашему второму коду, то в первом по идее нужно использовать _IEGetObjByName() вместо _IEGetObjById().
Проблема не в командах - они прекрасно работают у меня на компе.
Коллекцию возвращает - если бы нет то у меня не работало бы.
ID=NAME одинаковые разницы в командах нет.
Проблема в том что все работает на моем компе - а у других нет. Что то есть в настройках моего компа чего нет у других а что понять не могу. Голову сломал с пятницы.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Boris
Пробовали?
Код:
#RequireAdmin
 
Автор
B

Boris

Дорогу осилит идущий
Сообщения
25
Репутация
0
Garrett сказал(а):
Boris
Пробовали?
Код:
#RequireAdmin
Попробовал:
Код:
#RequireAdmin
#include <IE.au3>
$oIE=_IECreate("http://10.3.30.103:9080/login.html")
_IELoadWait($oIE)
$oFrame=_IEFrameGetCollection($oIE)
$oObj=_IEGetObjById($oFrame,'j_username')
_IEAction($oObj,'focus')

Без изменений у меня все ок у других команда фокус не работает.
Причем пробовал заходить на других компах под чужими учетками, под своей учеткой с администраторскими правами - без разницы фокуса нет. Интересно то что код с командой _IETagNameGetCollection работает у всех:
Код:
$oInputs=_IETagNameGetCollection($oIE,'input')
For $oInput In $oInputs
	If $oInput.type=='text' and $oInput.id='j_username' Then
		_IEAction($oInput,"focus")
		ExitLoop
	EndIf
Next
Предполагаю что проблема в настройках компов. Настройки IE копировал один в один со своего компа. Что еще можно настроить?


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

Проверил ошибку на других компах:
Код:
Local $oFrame=_IEFrameGetCollection($oIE,0);коллекция 0-го фрейма 
	Local $oObj = _IEGetObjById($oFrame,'common'); нахожу id='common'
			MsgBox(0,'',@error)

Выдает 3 - неверный тип данных. На моем компе ошибок нет - выдает 0
Html код 0-го фрейма такой:
Код:
<input type="submit" value=" Работа " id="common" class="TableM"></input>
Обновил ie.au3 - ничего не помогает. У меня все нормально на других машинах ошибка. Ничего не понимаю


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

Сохранил html код страницы в отдельный файл. Выполнил скрипт по этому файлу:
Код:
#include <IE.au3>; подключаем библиотеку
$oIE=_IECreate("c:\1\Проверка.html"); Загрузка файла с кодом 
_IELoadWait($oIE);Ожидаем загрузки страницы
Local $oFrame=_IEFrameGetCollection($oIE);здесь уже не указываю номер фрейма, беру всю страницу
Local $oObj = _IEGetObjById($oFrame,'common')
_IEAction($oObj,"focus")
_IEAction($oObj,"click")

Код работает на всех компах без проблем, все фокусирует и нажимает. Как только этот же код запускаю на других машинах но в работу с рабочим сервером ("10.3.30.103") - код перестает работать - выдает ошибку 3 - неверный тип данных или 7-нет совпадений. На моем компе все нормально работает. Ничего не понимаю. Админ права проверял - разницы нет что с правами, что без них. Что делать дальше непонятно
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Нужно учитывать скорость соединения с интернетом, скорость загрузки htm документа и всех фреймов в нём. IMHO тогда всё будет работать.
Попробуйте временно поставить задержки Sleep, секунду, две.

Код:
Sleep(1000)
$oFrame=_IEFrameGetCollection($oIE)
Sleep(1000)
$oObj=_IEGetObjById($oFrame,'j_username'); здесь поле ввода логина
Sleep(1000)
_IEAction($oObj,'focus'); фокус на поле логина
Sleep(1000)
_IEAction($oObj,'CLICK'); клик на логине
 
Автор
B

Boris

Дорогу осилит идущий
Сообщения
25
Репутация
0
Garrett сказал(а):
Нужно учитывать скорость соединения с интернетом, скорость загрузки htm документа и всех фреймов в нём. IMHO тогда всё будет работать.
Попробуйте временно поставить задержки Sleep, секунду, две.

Код:
Sleep(1000)
$oFrame=_IEFrameGetCollection($oIE)
Sleep(1000)
$oObj=_IEGetObjById($oFrame,'j_username'); здесь поле ввода логина
Sleep(1000)
_IEAction($oObj,'focus'); фокус на поле логина
Sleep(1000)
_IEAction($oObj,'CLICK'); клик на логине
Поставил слипы по 2 секунды после всех команд - все по прежнему. Ошибка не ушла.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
У вас не правильный код. Вы кажется забыли _IEFrameGetCollection($oIE) про второй параметр. А так, вы получаете коллекцию всех фреймов. Которую нужно обходить циклом.
 
Автор
B

Boris

Дорогу осилит идущий
Сообщения
25
Репутация
0
inververs сказал(а):
У вас не правильный код. Вы кажется забыли _IEFrameGetCollection($oIE) про второй параметр. А так, вы получаете коллекцию всех фреймов. Которую нужно обходить циклом.
_IEFrameGetCollection($oIE) и _IEGetObjById отлично работают без второго параметра и без цикла если фрейм один.


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

Доброго времени суток уважаемые форумчане,
Поиск решения продолжаются. Попробовал поменять команду _IEGetObjById на ее близнеца _IEGetObjByName - работает у всех. Если выгружать html коды в отдельный файл и запускать простой скрипт - все прекрасно работает и нажимается, обе команды. Но при работе в сети с сервером в интранете - _IEGetObjById перестает работать. А по справочнику эти команды практически одинаковы. Почему тогда в сети _IEGetObjById не работает, а _IEGetObjByName работает? Может быть дело не в настройках компов, не в командах AutoIT, а в доменной политике безопасности сети? Может такое быть чтобы сетевая безопасность влияла на работоспособность команды _IEGetObjById? Уже все варианты перебрал - остаются сетевые дела. У кого какие мысли есть? Прошу помочь в - должно же быть решение



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

Доброго времени суток уважаемые форумчане!

В общем решил я проблему. Все дело было все таки в настройках браузера IE. Пепел на мою голову. По своей невнимательности пропустил пару настроек. Теперь все работает, сетка здесь не причем. Не мог подумать что настройки браузера ТАК сильно влияют на то что команда _IEGetObjByName работает, а _IEGetObjById нет. Век живи век учись. Спасибо всем кто откликнулся. :smile:
 
Верх