В предыдущей статье мы узнали, как находить нужное значение.
Здесь, рассмотрим, как взаимодействовать с сайтом, с помощью Autoit.
Задача следующая, ввести в поле поиска сайта coolcode.ru число 12 и нажать кнопку поиска.
У меня получился вот такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <IE.au3> #include <StringConstants.au3> Global $Num="12" Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1) Sleep(2000) Local $oDiv = _IEGetObjById($oIE, "search") Local $oInput = _IEGetObjById($oDiv, "s") _IEAction($oInput, "focus") Sleep(1000) _IEFormElementSetValue($oInput,$Num) Local $oInput = _IEGetObjById($oDiv, "s") Sleep(1000) Local $oButton=_IEGetObjById($oDiv, "searchsubmit") _IEAction($oButton, "focus") Sleep(1000) _IEAction($oButton, "click") ;_IEQuit($oIE) |
Воспользуемся модулем:
1 |
#include <IE.au3> |
В предыдущей статье у нас появилась переменная
1 |
Global $Num="12" |
Уже знакомыми командами открываем IE с сайтом coolcode.ru
1 2 |
Local $oIE = _IECreate("http://www.coolcode.ru",0,1,0,1) Sleep(2000) |
Теперь ищем <div> с id «search»
1 |
Local $oDiv = _IEGetObjById($oIE, "search") |
После выполнения команды в переменной $oDiv Будет находится следующий элемент:
1 2 3 4 5 6 |
<div id="search"> <form method="get" id="searchform" action="http://coolcode.ru/"> <label for="s" class="assistive-text hidden">Поиск</label> <input id="s" type="text" name="s" placeholder="Поиск"> <button id="$Num" name="submit" type="submit">Поиск</button> </form> </div> |
В этом dive у нас находятся, как поле ввода в которое мы должны ввести 12, так и кнопка, по которой мы должны нажать.
Найдём поле ввода
1 |
Local $oInput = _IEGetObjById($oDiv, "s") |
и кнопку
1 |
Local $oButton=_IEGetObjById($oDiv, "searchsubmit") |
устанавливаем значение поля ввода такое же как и содержание переменной $Num
1 2 3 |
_IEAction($oInput, "focus") Sleep(1000) _IEFormElementSetValue($oInput,$Num) |
Здесь есть момент, сначала я устанавливаю фокус на элемент, с которым я хочу взаимодействовать, потом делаю небольшую задержку и назначаю значение в объект.
Это всё сделано, для того что бы это хоть как то было похоже на взаимодействие человека. Многие сайты не любят роботов, а особенно когда те с ними общаются.
И последнее нажимаем на кнопку
1 2 3 |
_IEAction($oButton, "focus") Sleep(1000) _IEAction($oButton, "click") |
Тоже самое сначала фокус, потом задержка, потом нажимаем на кнопку.
И вуаля… сайт послушно ищет 12.
Подскажите а как можно заполнить поля на сайте не отображая при этом саму страницу ?
То есть, имеется скрипт на Autoit с некой формой для заполнения.
Пользователь вводит данные в поля Edit и в конце нажимает кнопку отправить, скрипт должен эти данные вставить в поля на сайте и нажать кнопку отправить на том же сайте, но при этом пользователь не должен видеть саму страницу сайта.
И ещё один момент, как скрипт может получить ответит с сайта всё ли прошло успешно или нет.
За ранее спасибо!
>Подскажите а как можно заполнить поля на сайте не отображая при этом саму страницу ?
Всё дело в функции:
_IECreate(url,присоединится ли к существующему окну, отображать ли окно браузера, ожидать ли загрузки страницы, будет ли браузер в фокусе)
Тоесть на моём примере строчку:
Local $oIE = _IECreate(«http://www.coolcode.ru»,0,1,0,1)
Надо изменить так:
Local $oIE = _IECreate(«http://www.coolcode.ru»,0,0,0,1)
И она не будет отображаться.
>И ещё один момент, как скрипт может получить ответит с сайта всё ли прошло успешно или нет.
Здесь надо смотреть, что происходит на сайте, меняется цвет кнопки или появляется надпись. В общем как вы определяете, что всё прошло успешно.
Если же ничего на сайте не поменялось, то и определить не понятно как.
У меня ещё статья с примерами по этому поводу есть, там пример более подходящий вам: Autoit. Парсинг сайта или забрать значение с сайта.
Спасибо за столь быстрый ответ.
То есть для любого взаимодействия с сайтом необходимо производить через _IECreate (он как основа полагающее звено) ?
Странно на $oForm = _IEGetObjById($oIE1, ‘form1’) в консоли пишет
—> IE.au3 T3.0-2 Error from function _IEGetObById, $_IESTATUS_InvalidObjectType
даже не знаю, что на это ответить… без контекста могу только сказать, что там написано…:) может в понедельник доберусь до компа с виндой и у меня получится повторить ошибку. Я бы внимательно посмотрел на $oIE1 скорее всего в нём ошибка
эээ… это первичная инициализация…
то есть эта штука запускает эксплорер, или подключается к нему…
а потом с ним взаимодействовать можно….
Тоесть в моём примере мы получили $oIE
Local $oIE = _IECreate(«http://www.coolcode.ru»,0,1,0,1)
из него $oDiv а из него $oInput
Но первично это $oIE что то типо ссылка на эксплорер…
Сделал 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
Вот упрощеный код:
Есть предположение, что ошибка может вызываться из-за версии ИЕ или AutoIT.
Можно ли попросить вас прокомментировать.
Заранее спасибо.
Добавлю:
IE.au3 в C:\Program Files (x86)\AutoIt3\Include есть.
Обновил его от сюда: https://www.autoitscript.com/forum/files/file/227-ieau3/ — проблема осталась.
Больше идей нет =(
Здрауствуйте.
Я так понимаю приведённые ошибки возникают при запуске моего скрипта, а не вашего примера?
может быть не успевает загрузиться страница? попробуйте вместо задержки Sleep(2000) использовать
Local $oIE = _IECreate(«http://www.coolcode.ru»,0,1,1,1), что бы страница загрузилась полностью.
Спасибо за оперативный ответ.
Ошибки возникали в обоих случаях — своём примере выше я просто упростил ваш пример, чтобы локализовать проблему.
Порылся на буржуйских сайтах — нашел решения:
— данные ошибки могут возникать из-за довереных зон в ИЕ (это случай для интранетовских сайтов)
— работе скрипта может мешать UAC (отключение говорят помогает)
— AutoIt ScriptEditor должен быть запущен под правами администратора (мой случай)
Как только я перезапустил едитор под правами админа — все заработало.
Надеюсь эта информация будет полезной.
Спасибо Вам за чудесные статьи, сайт и помощь — стану постоянным читателем и почитателем =)
Хорошего Вам дня!
И вам спасибо за лестные отзывы. обязательно добавлю эту информацию в статью… только не в эту а в первую.
Здравствуйте, можно ли проделать подобное с браузером chrome, то есть заполнить форму и нажать на кнопку.
м…. конечно можно … но не этими средствами… можно посмотреть на Chromium Browser Automation.
Local $oButton=_IEGetObjById($oDiv, «searchsubmit») выдаёт ошибку (IE.au3 T3.0-0 Warning from function _IEGetObjByName, $_IEStatus_NoMatch) как правильно задать эту переменную? за ранее спасибо
Как ни странно, но у вас всё правильно! Я поменял движок… и теперь код в шапке не работает 🙁 Ещё надо всё от админа запускать… ну это на всякий случай.. 🙂