Autoit поиск текста в браузере
Сегодня я получил ссылочку на статью на хабре о технологии создания «макроса-бота для браузерной игры». Там же было написано с сожалением, что AutoIT мало представлен на хабре. Со штуками, описанными в статье я баловался год-два назад. В последнее время использую библиотеку IE.au3, которая позволяет творить с браузерными игрушками просто чудеса.Собственно информацией об этом и хотел бы поделиться. Только сразу предупреждаю — речь идет только работе под MS-Internet Explorer. Фанатам других браузеров скажу сразу — можно тоже самое делать наверное под любым браузером, только нужно искать соответствующую библиотеку и как они работают я сказать не могу. Скажу только о библиотеке IE.au3 — она входит в комплект стандартной установки AutoIT-а, достаточно хорошо протестирована, снабжена комментариями и примерами, описанные в ней функции удобно подсвечиваются и предлагаются к завершению при наборе с соответствующими подсказками, как стандартные функции пакета (или как там назвать этот самый AutoIT).
Выбор жертвы
Вариант №1 — примитивный вариант
Ищем на экране куда тыкать, и тыкаем «мышей» куда надо. Сразу скажу – это вариант неправильный, но для общей эрудиции я приведу текст скрипта с пояснениями.Кусок №1: ищем на экране «точку отсчета», за которую можно будет зацепиться и от неё считать местоположение квадратиков куда будем обтыкивать поле.
Func GetTopLeftCorner ( $window )
Global $x = 0 , $y = 0
WinActivate ( $window , "" )
If WinActive ( $window ) Then
$size = WinGetPos ( "[active]" )
For $i = 1 To $size [ 3 ]
If CheckRGB ( PixelGetColor ( $x + $i , $y + $i ) , Dec ( "402215" ) , Dec ( "5A352A" ) ) Then
If CheckRGB ( PixelGetColor ( $x + $i - 259 , $y + $i ) , Dec ( "331A0D" ) , Dec ( "624232" ) ) Then
For $j = $i To 1 Step - 1
If not CheckRGB ( PixelGetColor ( $i + 1 , $j ) , Dec ( "000000" ) , Dec ( "3A301D" ) ) Then
$x = $i
$y = $j
ExitLoop ( 2 )
EndIf
Next
ExitLoop
EndIf
EndIf
Next
EndIf
EndFunc
Функция проверяет цвета точек, пробегая по диагонали, ищет левый край окна игры в браузере. Затем просматривает цвета точек, пробегая вверх, ищет верхнюю границу окна игры. Найденную точку я буду считать «точкой отсчета». Расстояние от неё до каждой клетки на поле игры фиксированное и легко вычисляется по индексу.Результат работы функции возвращается в глобальных переменных $x и $y, которые соответствуют координатам точки по горизонтали и вертикали соответственно.При вызове функции в качестве параметра нужно указать заголовок окна программы. Его можно задать вручную, определив предварительно с помощью утилиты AutoIt Window Info, которая устанавливается вместе с AutoIt-ом.Приведенный выше скрипт использует самодельную функцию CheckRGB:
Func CheckRGB ( $color , $min , $max )
Local $rgb [ 3 ] [ 3 ]
$res = True
$rgb [ 2 ] [ 0 ] = BitAND ( $min , Dec ( "FF0000" ) ) / Dec ( "10000" )
$rgb [ 1 ] [ 0 ] = BitAND ( $min , Dec ( "00FF00" ) ) / Dec ( "100" )
$rgb [ 0 ] [ 0 ] = BitAND ( $min , Dec ( "0000FF" ) )
$rgb [ 2 ] [ 1 ] = BitAND ( $color , Dec ( "FF0000" ) ) / Dec ( "10000" )
$rgb [ 1 ] [ 1 ] = BitAND ( $color , Dec ( "00FF00" ) ) / Dec ( "100" )
$rgb [ 0 ] [ 1 ] = BitAND ( $color , Dec ( "0000FF" ) )
$rgb [ 2 ] [ 2 ] = BitAND ( $max , Dec ( "FF0000" ) ) / Dec ( "10000" )
$rgb [ 1 ] [ 2 ] = BitAND ( $max , Dec ( "00FF00" ) ) / Dec ( "100" )
$rgb [ 0 ] [ 2 ] = BitAND ( $max , Dec ( "0000FF" ) )
For $i = 0 To 2
If $rgb [ $i ] [ 0 ] > $rgb [ $i ] [ 1 ] Or $rgb [ $i ] [ 1 ] > $rgb [ $i ] [ 2 ] Then
$res = False
ExitLoop
EndIf
Next
Return $res
EndFunc
— Функция проверяет цвет точки, передаваемой в качестве первого параметра $color на то, чтобы она находилась в цветовом диапазоне от $min до $max, с учетом трех составляющих цвета точки (RGB). Возвращает, соответственно True или False.
Непосредственно процедура обтыкивания всех клеток на поле выглядит так:
For $i = 1 To 12
For $j = 1 To 10
MouseClick ( "left" , $x + ( $i * 40 ) + 103 , $y + ( $j * 40 ) + 172 , 1 , 1 )
Sleep ( 25 )
Next
Next
Тут все понятно. 10 и 12 в заголовках цикла это размер поля в клетках. Константы в параметрах MouseClick вычислены с помощью той же утилиты AutoIt Window Info, относительно определенной ранее «точки отсчета». Значение задержки в Sleep можно менять по своему желанию – это будет влиять на скорость обтыкивания, но слишком быстрое может приводить к ошибкам выполнения скрипта игры.
Преимущество этого метода – он работает в любом браузере. Везде где можно открыть окно игры так, чтобы была видна вся пашня.Недостаток – окно игры должно быть всегда открыто, нужно подбирать скорость обтыкивания и во время работы скрипта нельзя трогать мышь (иначе тыкнет не там где надо).
Вариант №2 — правильный вариант
Мы не используем указатель мыши вообще. Вместо этого, мы тыкаем на нужном объекте, загруженном в браузере IE по его ID. (ID этих клеток можно посмотреть в HTML коде загруженной страницы, они имеют названия f1-f120 соотвественно).
Local $i , $j , $n
Local $oIE = _IEAttach ( $gamewindowname )
For $i = 1 To 12
For $j = 0 To 9
$obj = _IEGetObjById ( $oIE , "f" & ( 12 * $j + $i ) )
If $obj <> 0 Then $obj . click ( )
Next
Next
Вариант №3 — самый правильный вариант
Недостатком предыдущего варианта является то, что когда нам нужно обтыкать поле, нам нужно переключиться из игры и запустить скрипт. Это неудобно. По-настоящему удобный скрипт не должен заставлять выполнять дополнительные действия в целях экономии на других рутинных операциях. Поэтому, я просто заменяю стандартное действие в игре «посадить одну семачку» на «засадить все поле выбранными семенами». Выглядит этот так:
$obj = _IEGetObjById ( $oIE , "anpflanzen" )
If $obj <> 0 Then _
$obj . outerHTML = "… тут кусок HTML кода, который для удобства привожу отдельно “
Сам код и скрипты на JavaScript позаимствованы из оригинального HTML кода игры и подгружаемого вместе с ней файла скриптов, и немного переделаны с полива на посадку.
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz, 3701 МГц, ядер: 4, логических процессоров: 4 | |
Материнская плата: Gigabyte Technology Co., Ltd. BIOS American Megatrends Inc. F11, 21.08.2012 | |
Память: G.Skill 4096 Мб (DDR3), Corsair 8192 Мб (DDR3) | |
HDD: WDC WD10EALX-009BA0 ATA Device | |
Видеокарта: NVIDIA GeForce GT 220 | |
Звук: VIA Technologies, Inc. | |
Монитор: Fujicom 200804220001 (23) | |
ОС: Windows 10 Professional x64 |
Нужно найти определенное значение в html коде загруженной страницы и сделать это найденное значение переменной » |
-------
“Сделай так просто, как возможно, но не проще этого.”. “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”
P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»
Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community
Creat0R, а можно ли разъяснить что сие значит? Ну с _INetGetSource все ясно. А вот "StringRegExpReplace" мне не понятно. И с "ConsoleWrite" тоже не до конца ясно, т.е. сама команда ясна, выдает данные в поток, но все же не ясно что это дает.
Суть функции "StringRegExpReplace" ясна примере с сайта AutoIt. Но не понятно для чего она в данной ситуации. Она заменяет указанные символы на необходимые.
Было бы хорошо если бы мне разжевали данную функцию и почему именно такие параметры. А то я в англ. не очень хорош чтобы читать офф. док.
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz, 3701 МГц, ядер: 4, логических процессоров: 4 | |
Материнская плата: Gigabyte Technology Co., Ltd. BIOS American Megatrends Inc. F11, 21.08.2012 | |
Память: G.Skill 4096 Мб (DDR3), Corsair 8192 Мб (DDR3) | |
HDD: WDC WD10EALX-009BA0 ATA Device | |
Видеокарта: NVIDIA GeForce GT 220 | |
Звук: VIA Technologies, Inc. | |
Монитор: Fujicom 200804220001 (23) | |
ОС: Windows 10 Professional x64 |
-------
“Сделай так просто, как возможно, но не проще этого.”. “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”
P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»
Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Вот так получилось, ток теперь не могу вытащить данные, может можете сделать данную таблицу ввиде списка с чекбоксами. СПАСИБО
Конфигурация компьютера | |
Процессор: Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz, 3701 МГц, ядер: 4, логических процессоров: 4 | |
Материнская плата: Gigabyte Technology Co., Ltd. BIOS American Megatrends Inc. F11, 21.08.2012 | |
Память: G.Skill 4096 Мб (DDR3), Corsair 8192 Мб (DDR3) | |
HDD: WDC WD10EALX-009BA0 ATA Device | |
Видеокарта: NVIDIA GeForce GT 220 | |
Звук: VIA Technologies, Inc. | |
Монитор: Fujicom 200804220001 (23) | |
ОС: Windows 10 Professional x64 |
-------
“Сделай так просто, как возможно, но не проще этого.”. “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”
P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»
Русское сообщество AutoIt | CreatoR's Lab | Opera AC Community
В предыдущей статье мы узнали, как находить нужное значение.
Здесь, рассмотрим, как взаимодействовать с сайтом, с помощью Autoit.
У меня получился вот такой код:
В предыдущей статье у нас появилась переменная
Теперь ищем с id «search»
После выполнения команды в переменной $oDiv Будет находится следующий элемент:
В этом dive у нас находятся, как поле ввода в которое мы должны ввести 12, так и кнопка, по которой мы должны нажать.
Найдём поле ввода
устанавливаем значение поля ввода такое же как и содержание переменной $Num
Здесь есть момент, сначала я устанавливаю фокус на элемент, с которым я хочу взаимодействовать, потом делаю небольшую задержку и назначаю значение в объект.
Это всё сделано, для того что бы это хоть как то было похоже на взаимодействие человека. Многие сайты не любят роботов, а особенно когда те с ними общаются.
И последнее нажимаем на кнопку
Тоже самое сначала фокус, потом задержка, потом нажимаем на кнопку.
И вуаля… сайт послушно ищет 12.
Комментарии:
Комментарии 19
>И ещё один момент, как скрипт может получить ответит с сайта всё ли прошло успешно или нет.
Здесь надо смотреть, что происходит на сайте, меняется цвет кнопки или появляется надпись. В общем как вы определяете, что всё прошло успешно.
Если же ничего на сайте не поменялось, то и определить не понятно как.
У меня ещё статья с примерами по этому поводу есть, там пример более подходящий вам: Autoit. Парсинг сайта или забрать значение с сайта.
Спасибо за столь быстрый ответ.
То есть для любого взаимодействия с сайтом необходимо производить через _IECreate (он как основа полагающее звено) ?
Странно на $oForm = _IEGetObjById($oIE1, ‘form1’) в консоли пишет
—> IE.au3 T3.0-2 Error from function _IEGetObById, $_IESTATUS_InvalidObjectType
даже не знаю, что на это ответить… без контекста могу только сказать, что там написано…:) может в понедельник доберусь до компа с виндой и у меня получится повторить ошибку. Я бы внимательно посмотрел на $oIE1 скорее всего в нём ошибка
Сделал Local $oIE1 = _IECreate($sUrl, 0, 0, 0, 1) и всё равно страница отображается ((( странно.
Большое спасибо за материал! Единственное вы ошиблись: Поиск
А возможно искать элемент не по id, а допустим по классу или названию?
Прошу прощение за глупый вопрос, надо использовать _IEGetObjByName
Глупых вопросов не бывает, к тому же вы дали на него ответ. Так что большое спасибо.
Не понял где я ошибся.
Добрый день.
Разбираю ваш пример и так же сталкаваюсь с ошибками.
—> IE.au3 T3.0-1 Error from function _IEGetObById, $_IESTATUS_InvalidObjectType
—> IE.au3 T3.0-1 Error from function _IETagNameGetCollection, $_IESTATUS_InvalidDataType
—> IE.au3 T3.0-1 Error from function _IEQuit, $_IESTATUS_InvalidObjectType
Меня зовут Иван Сидоренко, я инженер по тестированию в компании Digital Design.
Передо мной стояла задача разработки авто-тестов для одного из наших проектов с помощью инструмента Selenium WebDriver на языке Java. Подробнее про это вы можете прочитать в моей прошлой статье
Selenium — это инструмент для автоматизации веб-приложений в различных браузерах. В ходе разработки авто-тестов мне попался сценарий, при котором необходимо взаимодействовать с Windows окном для загрузки файлов. К сожалению, Selenium не умеет работать с Windows окнами, поэтому нужно было найти альтернативное решение.
В ходе поисков выбор пал на AutoIT. Этот инструмент разработан для автоматизации задач в Microsoft Windows, что и было необходимо. В этой статье я опишу работу с AutoIT для решения поставленной задачи. Предполагается, что у вас уже развернута среда разработки с подключенным Selenium WebDriver. В качестве примера будет использоваться окно для загрузки фотографий на одном из сайтов по редактированию фото. Итак, приступим.
1. Скачиваем и устанавливаем AutoIT
2. Переходим на один из сервисов по загрузке фотографий, например, сюда. Здесь необходимо нажать кнопку «Загрузить фотографии», для получения такого Windows окна
3. Теперь переходим в папку AutoIT3 и выбираем Au3Info.exe
4. Au3Info — это инструмент, который позволяет получить информацию о необходимом окне для автоматизации. Чтобы получить информацию о конкретном элементе просто перетащите курсор из блока Finder Tool на элемент окна. Получим значения атрибутов поля ввода элемента «Имя файла»
Для использования в скрипте AutoIT нам понадобиться атрибуты Title = 'Открытие' и
5. Перейти в папку AutoIt3\SciTE и выбрать SciTE, здесь напишем такой простой скрипт
Здесь ControlFocus — метод, который устанавливает фокус на элементе окна «Имя файла»
— Первый параметр это значение Title, нужного окна, в нашем случае оно равно 'Открытие'
— Второй параметр необязателен
— Третий параметр это объедение значений атрибута Class и Instance, т.е. получается Edit1
ControlSetText — метод, с помощью которого происходит ввод текста в input элемента «Имя файла»
- Первый параметр — значение Title
- Второй параметр необязателен
- Третий параметр это объедение значений атрибута Class и Instance, т.е. получается Edit1
- Четвертый параметр — текст, который будет введен в input, здесь прописываем путь до файла, который будем прикреплять
- Первый параметр — значение Title
- Второй параметр необязателен
- Третий параметр это объедение значений атрибута Class и Instance, т.е. получается Button1
6. Сохраняем скрипт как Autoit
7. Теперь, чтобы запустить скрипт, его нужно скомпилировать. Для компиляции скрипта есть два варианта — либо для 64 разрядной системы, либо для 86. Выберете соответствующий вашей операционной системе.
8. Получили скомпилированный файл AutoItScript.exe Проверим его работоспособность — перейдем на сервис редактированию фото и нажмем «Выбрать изображение». Теперь запустим AutoItScript.exe
9. Теперь этот скрипт можно добавить в Selenium. Например для Java, такое добавление будет выглядеть вот так:
Это решение отличается высокой стабильностью. Также из-за того, что в конечном итоге получаем исполняемый файл это решение можно использовать с разными языками программирования. Недостатком является то, что такой скрипт нельзя использоваться в headless моде — режиме, при котором не происходит запуск браузера.
Читайте также: