Что нового

[Окна, Диалоги] Различить окна IE и вкладки

Dedullika

Новичок
Сообщения
22
Репутация
0
Добрый день!

Назрел такой вопрос, например у меня открыта страница (http://autoit-script.ru/ например), я открываю несколько ссылок в новых окнах и несколько во вкладках. И собственно вопрос в том как определить какая во вкладке, а какая в окне ? И как к ним обращаться ? напрмер в следующий момент времени нужно открыть вторую вкладку и сделать IEAction ($Link, "click") , затем открыть второе ОКНО и сделать в нем IEAction ($Link, "click") , затем вторую вкладку (в начальном) и сделать в ней IEAction ($Link, "click") и затем третье окно и IEAction ($Link, "click") ? Уже голову сломал, на ум идёт инспектировать их через Au3Info.exe , но там вроде все поля идентичны у окон и вкладок.. тогда видимо нужно использовать HANDLE окон, но как понять какой из них чей ? в смысле старое отличать от новых

И вдогонку спрошу - вот я открываю в окне зажимая шифт и вкладке при помощи клика с зажатым контрол, может есть более элегантный способ и более надежный ?

Заранее спасибо!!!
 
Автор
D

Dedullika

Новичок
Сообщения
22
Репутация
0
Как оперировать разными окнами разобрался, $handle = WinGetHandle("[CLASS:IEFrame]")
Подскажите пожалуйста как быть с вкладками ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Dedullika [?]
как быть с вкладками ?
Попробуйте так.
Код:
#include <IE.au3>
#include <Array.au3>

Dim $aoIE[101][3] = [[100, 'Url', 'Title']]
$iCount = 0
$oIE = _IECreate('http://www.google.ru/')
$oForm = _IEGetObjById($oIE, 'tsf')
$oInput = _IEFormElementGetObjByName($oForm, 'q')
_IEFormElementSetValue($oInput, 'AutoIt')
_IEFormSubmit($oForm)
$oLinks = _IETagNameGetCollection($oIE, 'a')
For $oLink In $oLinks
	If $oLink.classname == 'l' Then
		$iCount += 1
		_IEAction($oLink, 'click')
	EndIf
	If $iCount = 9 Then ExitLoop
Next
$oLink = 0
$oLinks = 0
$oInput = 0
$oForm = 0
$oIE = 0
$iCount = 0
While 1
	$iCount += 1
	$aoIE[$iCount][0] = _IEAttach('', 'Instance', $iCount)
	If @error Then ExitLoop
	$aoIE[$iCount][1] = _IEPropertyGet($aoIE[$iCount][0], 'locationurl')
	$aoIE[$iCount][2] = _IEPropertyGet($aoIE[$iCount][0], 'title')
WEnd
ReDim $aoIE[$iCount][3]
$aoIE[0][0] = $iCount - 1
_ArrayDisplay($aoIE)
For $i = 1 To $aoIE[0][0]
	If StringInStr($aoIE[$i][2], 'Русское сообщество AutoIt') Then
		_IELinkClickByText($aoIE[$i][0], 'Автоматизация IE и Web-интерфейса')
	Else
		_IEQuit($aoIE[$i][0])
	EndIf
	Sleep(1000)
Next
 
Автор
D

Dedullika

Новичок
Сообщения
22
Репутация
0
Спасибо!! работает. теперь бы разобраться КАК оно работает :wacko:
 

focus

Осваивающий
Сообщения
69
Репутация
20
Не понятно следующее. Запустил Ваш скрипт. Доходит до показа массива и

--> IE.au3 V2.4-0 Warning from function _IEAttach, $_IEStatus_NoMatch.

(Окна заблокированы) Снимаю блокировку окон - пролетает массив (не показывает) и открывает 10 окон. Я принудительно останавливаю. Как быть?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
focus
Ошибку он должен писать (If @error Then ExitLoop), а дальше я Вас не понял.
 
Автор
D

Dedullika

Новичок
Сообщения
22
Репутация
0
В коде разобрался, пример хороший, много нового узнал. товарищ focus видимо имел в виду, что IE по умолчанию блокирует попытки открытия вкладок. пишет мол всплывающие окна. и если разрешить всплвывающие окна то все работает!

В примере вкладки прсото закрываются и мы попадаем на нужную, проверив титл. А нету способа всегда обращаться скажем именно ко второй вкладке из открытых ? Чтобы первая осталась открытая, и сделать активной вторую. Глупый вопрос наверно, но у меня не получается))
 

focus

Осваивающий
Сообщения
69
Репутация
20
Да, правильно выразился товарищ Dedullika. Так и было. У меня вкладки открываются в новой вкладке. Снял блокировку и дал скрипту доработать до конца. Всё встало на свои места. Вопрос возник по этой конструкции: If $oLink.classname == 'l' Then
именно $oLink.classname.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
focus [?]
Вопрос возник по этой конструкции: ... именно $oLink.classname.
Потому, что у нужных нам ссылок такой класс.

Dedullika [?]
А нету способа всегда обращаться скажем именно ко второй вкладке из открытых ? Чтобы первая осталась открытая, и сделать активной вторую.
С переходом по вкладкам:
Код:
#include <IE.au3>
#include <Array.au3>
;===============
;проверялось только на IE8
;без проверок на ошибки
;===============
Dim $aoIE[101][3] = [[100, 'Url', 'Title']]
$iCount = 0
$oIE = _IECreate('http://www.google.ru/')
$hWin = _IEPropertyGet($oIE, 'hwnd')
$oForm = _IEGetObjById($oIE, 'tsf')
$oInput = _IEFormElementGetObjByName($oForm, 'q')
_IEFormElementSetValue($oInput, 'AutoIt')
_IEFormSubmit($oForm)
$oLinks = _IETagNameGetCollection($oIE, 'a')
For $oLink In $oLinks
	If $oLink.classname == 'l' Then
		$iCount += 1
		_IEAction($oLink, 'click')
	EndIf
	If $iCount = 9 Then ExitLoop
Next
$oLink = 0
$oLinks = 0
$oInput = 0
$oForm = 0
$oIE = 0
$iCount = 0
While 1
	$iCount += 1
	$aoIE[$iCount][0] = _IEAttach('', 'Instance', $iCount)
	If @error Then ExitLoop
	$aoIE[$iCount][1] = _IEPropertyGet($aoIE[$iCount][0], 'locationurl')
	$aoIE[$iCount][2] = _IEPropertyGet($aoIE[$iCount][0], 'title')
WEnd
ReDim $aoIE[$iCount][3]
$aoIE[0][0] = $iCount - 1
_ArrayDisplay($aoIE)
;горячие клавиши IE8: http://windows.microsoft.com/ru-RU/windows-vista/Tabbed-browsing-in-Internet-Explorer-8-frequently-asked-questions
;вперед
For $i = 1 To $aoIE[0][0] - 1
	ControlSend($hWin, '', '', '^{TAB}')
	Sleep(1000)
Next
;назад
For $i = 1 To $aoIE[0][0] - 1
	ControlSend($hWin, '', '', '^+{TAB}')
	Sleep(1000)
Next
;ищем конкретную вкладку
For $i = 1 To $aoIE[0][0]
	If StringInStr($aoIE[$i][2], 'Русское сообщество AutoIt') Then
		_IELinkClickByText($aoIE[$i][0], 'Автоматизация IE и Web-интерфейса')
		ExitLoop
	Else
		ControlSend($hWin, '', '', '^{TAB}')
	EndIf
	Sleep(1000)
Next
;или (до 8 вкладок)
ControlSend($hWin, '', '', '^1')
For $i = 1 To $aoIE[0][0]
	If StringInStr($aoIE[$i][1], 'autoit-script.ru') Then
		If $i < 9 Then
			ControlSend($hWin, '', '', '^' & $i)
			_IELinkClickByText($aoIE[$i][0], '[Окна, Диалоги] Различить окна IE и вкладки')
			ExitLoop
		EndIf
	EndIf
Next
 

ssvih

Новичок
Сообщения
35
Репутация
1
Посмотрите для моего примера плиз

Код:
$oIE = _IEAttach ("Google") ; Тут я активирую окно с Google
$zapros = ClipGet() ; Вставляю запрос в фору поиска из буфера
$oGForm = _IEGetObjById($oIE, 'gbqf')
$oGInput = _IEFormElementGetObjByName($oGForm, 'q')
_IEFormElementSetValue($oGInput, $zapros )
Send("{ENTER}")
_IELoadWait($oIE, 2000)

; Ищем текст в гугле и кликаем по нему

Dim $aClick[7] = [6, 'Приобретение недвижимости в США » Финансовый мир', _
        'Прямые инвестиции » Финансовый мир', _
        'Недвижимость – таунхаус » Финансовый мир', _
        'Аренда коммерческой недвижимости » Финансовый мир', _
        'Форекс и инвесторы » Финансовый мир', _
        'Недвижимость » Финансовый мир']
For $i = 1 To $aClick[0]
   _IELinkClickByText($oIE, $aClick[$i])
   _IELoadWait($oIE, 2000)
Next
; Все работает на ура

; Линк копируем из окна

$zLink1=ControlGetText("[CLASS:IEFrame]","","[CLASS:Edit;INSTANCE:1]")
ConsoleWrite($zLink1)
FileWriteLine('prova.txt', $zLink1)


Sleep(2000)
; Вот тут начинаются проблемы первая это то что переход осуществляется не в новом окне что открыто _IELinkClickByText($oIE, $aClick[$i]) а в окне где был произведен переход хотя ConsoleWrite($zLink1) уже копирует адрес с нового окна
For $i = 1 To 1
    My_Func()
Next

Func My_Func()
    Local $aURL[5] = ['http://parifinance.ru/foreks/', 'http://parifinance.ru/internet-i-biznes/', 'http://parifinance.ru/investirovanie/', _
            'http://parifinance.ru/investirovanie/', 'http://parifinance.ru/filosofiya-biznesa/']
    ;ConsoleWrite($aURL[Random(0, 4, 1)] & @LF)
    _IENavigate($oIE, $aURL[Random(0, 4, 1)])
 EndFunc   ;==>My_Func
 Sleep(2000)
; Из-за того что функция перехоидт по ссылки в прошлом окне не могу скопировать новую ссылку ConsoleWrite($zLink2)

$zLink2=ControlGetText("[CLASS:IEFrame]","","[CLASS:Edit;INSTANCE:1]")
ConsoleWrite($zLink2)
FileWriteLine('prova.txt', $zLink2)


Что делать ( Читаем коментарии
 
Верх