Что нового

[Автоматизация] Выход из скрипта, если не существует окна IE с заданным URL

AngryFlay

Новичок
Сообщения
17
Репутация
0
Скрипт запускает программу в окне IE, жмет кнопки "ОК" и ожидает страницы выхода (она же страница авторизации для входа) так как повторный вход не требуется, то закрывается IE и сам скрипт.

Код:
#include <IE.au3>
#include <UIAutomate.ua3>

$oIE = _IECreate("localhost:8080/program")
_iepropertyset($oIE, "addressbar", False) 
_iepropertyset($oIE, "menubar", False)
_IELoadWait($oIE)
BlockInput(1)
Send("{TAB}{ENTER}")
Sleep(200) 
Send("{TAB}{ENTER}")
BlockInput(0)
Sleep(200)

AdlibRegistr('_Exit',500)
Func _Exit()
     If ProcessExist("iexplore.exe") = 0 Then Exit
EndFunc

WinWaitActive("localhost:8080/login")
_IEAction($oIE,"quit")
Sleep(200)
Exit


Скрипт работает, но это не вариант если открыто несколько окон IE.
И если закрыть окно ("localhost:8080/programl") крестиком или все окна IE, то скрипт так и будет висеть ждать пока не появится страница "localhost:8080/login" чтобы закрыть IE и выйти.

Помогите написать цикл (с заданием времени проверки несколько секунд), существования окна IE по URL с вхождением, например "/ login".
Если окно существует, сидим курим, если нет идем на выход.
 

uritalex

Новичок
Сообщения
197
Репутация
3
Попробуйте так:
Код:
#include <IE.au3>

$oIE = _IECreate("localhost:8080/program")
$hnd = _IEPropertyGet ($oIE, "hwnd")
AdlibRegister ( "_Exit", 5000) ; 5 секунд
_iepropertyset($oIE, "addressbar", False) 
_iepropertyset($oIE, "menubar", False)
_IELoadWait($oIE)
BlockInput(1)
Send("{TAB}{ENTER}")
Sleep(200) 
Send("{TAB}{ENTER}")
BlockInput(0)
Sleep(200)
AdlibRegister("_Exit")
AdlibRegister ( "_Exit2", 5000) ; 5 секунд

$hWnd = WinWaitActive($hnd, "localhost:8080/login", 30000) ; 30 сек
If Not $hWnd Then Exit
_IEAction($oIE,"quit")
Sleep(200)
Exit

Func _Exit()
	If _IEPropertyGet($oIE, 'hwnd') <> $hnd  Or  ProcessExists ("iexplore.exe") = 0 Then Exit
	EndFunc


Func _Exit2()
	If _IEPropertyGet($oIE, 'hwnd') <> $hnd  Or  ProcessExists ("iexplore.exe") = 0 Then Exit
	$sAdresBar = _IEPropertyGet($oIE, "addressbar")
	If StringInStr($sAdresBar, "/ login") Then Exit 	
EndFunc
 
Автор
A

AngryFlay

Новичок
Сообщения
17
Репутация
0
uritalex сказал(а):
Попробуйте так:
Спасибо за отклик. Возможно, я не так изложил...
Нужна проверка (цикл 30 секунд) существования IE окна с URL содержащим нужный текст например "localhost:8080/program".
Если окна с таким вхождением в адресе нет, то завершить скрипт не дожидаясь окончания. Если же окно есть то выполнять скрипт дальше.
 

uritalex

Новичок
Сообщения
197
Репутация
3
Измените так
Код:
Func _Exit2()
    If _IEPropertyGet($oIE, 'hwnd') <> $hnd  Or  ProcessExists ("iexplore.exe") = 0 Then Exit
    $sAdresBar = _IEPropertyGet($oIE, "addressbar")
    If   StringInStr($sAdresBar, "/ login") = 0 Then Exit     
EndFunc
 
Автор
A

AngryFlay

Новичок
Сообщения
17
Репутация
0
uritalex сказал(а):
Измените так
Код:
Func _Exit2()
    If _IEPropertyGet($oIE, 'hwnd') <> $hnd  Or  ProcessExists ("iexplore.exe") = 0 Then Exit
    $sAdresBar = _IEPropertyGet($oIE, "addressbar")
    If   StringInStr($sAdresBar, "/ login") = 0 Then Exit     
EndFunc
Нет не хочет. Почти сразу закрывает IE и себя.
Может можно по ID процесса как-то замутить ?
 

uritalex

Новичок
Сообщения
197
Репутация
3
Так:
Код:
$hWnd = WinWaitActive($hnd, "localhost:8080/login", 30000) ; 30 сек
If Not $hWnd Then Exit
AdlibRegister ( "_Exit2", 5000) ; 5 секунд
_IEAction($oIE,"quit")
Sleep(200)
Exit
 
Автор
A

AngryFlay

Новичок
Сообщения
17
Репутация
0
uritalex сказал(а):
Так:
Код:
$hWnd = WinWaitActive($hnd, "localhost:8080/login", 30000) ; 30 сек
If Not $hWnd Then Exit
AdlibRegister ( "_Exit2", 5000) ; 5 секунд
_IEAction($oIE,"quit")
Sleep(200)
Exit

Тоже, не задерживаясь :scratch:, на выход.
В различных вариациях, либо сразу на выход, либо после закрытия IE в бесконечный цикл с выводом ошибки, что не существует обьекта.
А вот закрываться, при этом не хочет.
 
A

Alofa

Гость
AngryFlay
Так тема решена, или нет?


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

Код:
#RequireAdmin ; На всякий случай
#include <IE.au3>
$sURL = 'localhost:8080/program'

$oIE = _IECreate($sURL)
$hWinHandle = HWnd($oIE.hWnd)
_IEPropertySet($oIE, "addressbar", False) 
_IEPropertySet($oIE, "menubar", False)
_IELoadWait($oIE, 100, 10000)
; Send('{TAB}{ENTER}')
ControlSend($hWinHandle, '', 'Internet Explorer_Server1', '{TAB}{ENTER}') ; Так надежней...
Sleep(200)
; Send('{TAB}{ENTER}')
ControlSend($hWinHandle, '', 'Internet Explorer_Server1', '{TAB}{ENTER}') ; ... Строка высылается точно в нужное окно.
Sleep(200)

$sURL = _IEPropertyGet($oIE, "locationurl")

While 1
	If Not WinExists($hWinHandle) Then Exit
	$sURL2 = _IEPropertyGet($oIE, "locationurl")
	If Not @error And $sURL2 == $sURL Then
		Sleep(30 * 1000)
	Else
		_IEQuit($oIE)
		Exit
	EndIf
WEnd


AngryFlay если не заработает, то:
Код:
; Замените все:
ControlSend($hWinHandle, '', 'Internet Explorer_Server1', '{TAB}{ENTER}')
; На:
ControlSend($hWinHandle, '', '', '{TAB}{ENTER}')


Если и так - облом, то вместо "localhost:8080/program" дайте рабочую ссылку. Далее будем думать.
 
Автор
A

AngryFlay

Новичок
Сообщения
17
Репутация
0
Спасибо за уделенное время.
К сожалению тоже не работает. Открывает, кнопки жмет, а вот на выход после закрытия окна не хочет.
Надежности не добавилось, если фокуса нет, то и кнопки не жмутся. Поэтому я делаю блокировку ввода так гарантированно работает.
Если не убирать адресную строку и меню бар, то количество нажатий (tab) будет зависеть от настроек панелей браузера или вообще не работает (см. ниже кодовое слово "трабла" :stars:smile:
Поэтому мой вариант, он железно надежный для всех версий IE.
Немного упостил задачу.
Пожалуйста посмотрите как работает этот код.
1. Выберите после загрузки страницы (по кнопке "Другой город") - "Москва".
2. После загрузки страницы просто закройте IE крестиком или любым другим способом.
Скрипт в обоих случаях завершит работу (возможно с некоторой задержкой во втором случае, так как процесс может не сразу завершится). Но если будет открыто еще несколько окно браузера, то во втором случае скрипт будет ждать закрытия всех окон IE, само собой.
Нужно вместо " Func Exit() "в скрипте написать такую чтобы мониторила открытые окна IE и как только не найдет запущенного экземпляра в заголовке которого есть текст "pogoda" то закроется, (думаю что вариант с адресом, в моем случае не будет работать, как я изначально хотел). А если такое окно существует то скрипт будет продолжать выполняться.
Еще такая трабла :stars:, если не убирать адресную строку и меню бар, (попробуйте в скрипте что ниже, закомментировать эти параметры) то не работает по 1. варианту...
Код:
#NoTrayIcon
#include <IE.au3>
;Opt("WinTitleMatchMode", 2)
$oie = _iecreate('https://pogoda.yandex.ru/')
_iepropertyset($oie, "addressbar", False)
_iepropertyset($oie, "menubar", False)
_IELoadWait($oIE, 500, 2000)

AdlibRegister('_Exit',500)

Func _Exit()
    If ProcessExists("iexplore.exe") = 0 Then Exit
EndFunc

WinWaitActive('https://pogoda.yandex.ru/ - Прогноз погоды в Москве')
_ieaction($oie, "quit")
Sleep(2000)
Exit
 
A

Alofa

Гость
AngryFlay сказал(а):
... а вот на выход после закрытия окна не хочет...
А вот это ведь не мои слова:
AngryFlay сказал(а):
... Нужна проверка (цикл 30 секунд) ...

Код:
; Замените:
Sleep(30 * 1000)
; На:
Sleep(300) ; к примеру
; и будет вам счастье...



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

AngryFlay сказал(а):
... если фокуса нет, то и кнопки не жмутся...
Только в случае с функцией "Send()". Функции "ControlSend()" все эти фокусы по барабану - можете хоть свернуть, хоть скрыть окно.

AngryFlay сказал(а):
... Поэтому я делаю блокировку ввода так гарантированно работает.
Код:
SendKeepActive()

А вобще, все эти эмуляции штука изначально не самая надежная.
 

uritalex

Новичок
Сообщения
197
Репутация
3
Подождите :smile: Вам нужно (на примере погоды) :
1. открыть сайт
2. выбрать город
3. что то сделать
4. закрыть сайт
+
дополнительные проверки от зависания, я правильно понял?
 
Автор
A

AngryFlay

Новичок
Сообщения
17
Репутация
0
Alofa сказал(а):
AngryFlay
Так тема решена, или нет?
Нет пока не до конца...
Чуток прояснилось, :blink: дело не совсем коде, а в программе, для которой нужен скрипт. Это я как-нибудь подшаманю. Выяснилось что, с моим же примером про погоду скрипт работает, но не так как хотелось бы.
Запускает, кнопки жмет, выходит, все ок! Но выходит сразу же как только чего-нибудь нажать на странице, так как меняется адрес.
В предыдущем ответе, я эти опасения высказал. Будьте любезны, подскажите, как тоже самое реализовать только не через "url", а через заголовок окна, причем тоже только по какому-то тексту, а не полному наименованию. (Тогда можно применять к другим окнам, не только IE) Либо допилить этот вариант, но так же по слову в адресе.
 
A

Alofa

Гость
(Если я вас правильно понял)
В предыдущем моем скрипте замените Это:
Код:
$sURL = _IEPropertyGet($oIE, "locationurl")

While 1
    If Not WinExists($hWinHandle) Then Exit
    $sURL2 = _IEPropertyGet($oIE, "locationurl")
    If Not @error And $sURL2 == $sURL Then
        Sleep(30 * 1000)
    Else
        _IEQuit($oIE)
        Exit
    EndIf
WEnd

... на Это:
Код:
; $sURL = _IEPropertyGet($oIE, "locationurl") ; Удалите строку

While WinExists($hWinHandle)
    $sURL2 = StringInStr(_IEPropertyGet($oIE, "locationurl"), $sURL) ; Смотрите функцию StringInStr()
    If Not @error And $sURL2 Then
        Sleep(300)
    Else
        _IEQuit($oIE)
        Exit
    EndIf
WEnd


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

Чуть подправил спойлеры.
 
Автор
A

AngryFlay

Новичок
Сообщения
17
Репутация
0
Alofa сказал(а):
(Если я вас правильно понял)
В предыдущем моем скрипте замените Это:
Код:
While 1
    If Not WinExists($hWinHandle) Then Exit
    $sURL2 = _IEPropertyGet($oIE, "locationurl")
    If Not @error And $sURL2 == $sURL Then
        Sleep(30 * 1000)
    Else
        _IEQuit($oIE)
        Exit
    EndIf
WEnd

... на Это:
Код:
While WinExists($hWinHandle)
    $sURL2 = StringInStr(_IEPropertyGet($oIE, "locationurl"), $sURL) ; Смотрите функцию StringInStr()
    If Not @error And $sURL2 Then
        Sleep(300)
    Else
        _IEQuit($oIE)
        Exit
    EndIf
WEnd


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

Чуть подправил спойлеры.




Это тоже не работает.


Я написал таки то что нужно, но работает где угодно только не с программой для которой он нужен. :stars: Как именно такой алгоритм реализовать другими методами? Подскажите пожалуйста. :-\
Код:
#NoTrayIcon
#include <IE.au3>
$oie = _iecreate('https://pogoda.yandex.ru/moscow')
_iepropertyset($oie, "addressbar", False)
_iepropertyset($oie, "menubar", False)
_IELoadWait($oIE, 500, 2000)

AdlibRegister('_FindText',500)

Func _FindText()
    If Not StringInStr(_IEPropertyGet($oIE, "locationurl"), "/pogoda") = 1 Then Exit
EndFunc

WinWaitActive('https://pogoda.yandex.ru/ - Прогноз погоды в Челябинске')
_ieaction($oie, "quit")
Sleep(200)
Exit
 

InnI

AutoIT Гуру
Сообщения
4,652
Репутация
1,321
AngryFlay
существования окна IE по URL с вхождением, например "/ login". Если окно существует, сидим курим, если нет идем на выход.
Код:
While Sleep(3000)
  $aList = WinList("[class:IEFrame]")
  For $i = 1 To $aList[0][0]
    $sURL = ControlGetText($aList[$i][1], "", "Edit1")
    If StringInStr($sURL, "login") Then ExitLoop
  Next
  If $i > $aList[0][0] Then Exit
WEnd
 
Автор
A

AngryFlay

Новичок
Сообщения
17
Репутация
0
InnI сказал(а):
AngryFlay
существования окна IE по URL с вхождением, например "/ login". Если окно существует, сидим курим, если нет идем на выход.
Код:
While Sleep(3000)
  $aList = WinList("[class:IEFrame]")
  For $i = 1 To $aList[0][0]
    $sURL = ControlGetText($aList[$i][1], "", "Edit1")
    If StringInStr($sURL, "login") Then ExitLoop
  Next
  If $i > $aList[0][0] Then Exit
WEnd

Спасибо что не прошли мимо :beer:
Ваш вариант работает, но я не могу подружить с ним вот эту часть
Код:
WinWaitActive(' http://any address')
_ieaction($oie, "quit") 
Sleep(200)
Exit

Пособите плиз.
 

InnI

AutoIT Гуру
Сообщения
4,652
Репутация
1,321
AngryFlay
не могу подружить с ним вот эту часть
$oie - это конкретное окно, которое вы закрываете при активности любого другого окна с указанным заголовком (это может быть даже не IE). Укажите критерии поиска нужного окна и закрывайте его через
Код:
WinClose()
 
Автор
A

AngryFlay

Новичок
Сообщения
17
Репутация
0
Alofa сказал(а):
Что с этой строкой что без неё, при смене адреса сразу же закрывает IE.




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

InnI сказал(а):
AngryFlay
не могу подружить с ним вот эту часть
$oie - это конкретное окно, которое вы закрываете при активности любого другого окна с указанным заголовком (это может быть даже не IE). Укажите критерии поиска нужного окна и закрывайте его через
Код:
WinClose()
Тут вроде ничего нездорового нет. В моем случае это выглядит так => В программе есть кнопка "выход" при использовании её по назначению, осуществляется переход на начальную страницу там "логин", "пароль" и поновой в программу. Но мне это не надо, поэтому просто закрываем этот экземпляр IE. На другие это никак не влияет. Да и в примере с pogoda.yandex.ru это тоже срабатывает.
Я не соображу что в ваш код добавить чтоб получить тоже самое.
Этот же цикл может искать еще одно окно (с нужным адресом или именем) и если найдет, то закроет IE и себя?
 
Верх