Что нового

Существует ли способ кликнуть на нужном элементе Web страницы

vaf

Новичок
Сообщения
186
Репутация
2
С наступившим новым годом уважаемые форумчане.
Автоматизирую ввод объявлений по продаже автомобилей, многие сайты не поддерживают Internet Explorer так что делаю в FireFox
Возник вопрос - как щелкнуть на определенном элементе, Web страницы и заполнить его.
Можно примере http://buy.110km.ru/cars/add/
заполнить несколько произвольных полей и нажать галочку "аварийный"
пробовал через FF.au3, он почему то не работает с последним Firefox
 

uritalex

Новичок
Сообщения
197
Репутация
3
Что мешает установить не последнюю версию Firefox, а стабильно работающую со скриптами?
В любом случае можно попробовать при помощи этого реализовать : UIAutomate
 
Автор
V

vaf

Новичок
Сообщения
186
Репутация
2
uritalex сказал(а):
Что мешает установить не последнюю версию Firefox, а стабильно работающую со скриптами?
В любом случае можно попробовать при помощи этого реализовать : UIAutomate

Спасибо, думаю это как раз то что нужно. Пойду экспериментировать.
 

uritalex

Новичок
Сообщения
197
Репутация
3
И еще тот Сайт что Вы указали нормально и в Internet Explorer отображается и работает, так что лучше делайте в нем т.к. больше методов и возможностей в нем для автоматизации ;)
 
Автор
V

vaf

Новичок
Сообщения
186
Репутация
2
uritalex сказал(а):
И еще тот Сайт что Вы указали нормально и в Internet Explorer отображается и работает, так что лучше делайте в нем т.к. больше методов и возможностей в нем для автоматизации ;)
Это один из 32х сайтов, на которые нужно автоматизировать размещение объявлений.


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

UIAutomate хорош, но не получается и не пойму где ошибка. В чем моя ошибка ? см.ниже.

Код:
; Демонстрация автоматизации Chrome версии 40

#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

; Данные регистрации

; Если Chrome не запущен - Запуск Chrome с параметром --force-renderer-accessibility
; При отсутствии этого параметра доступ к элементам страницы будет запрещён
If ProcessExists ("chrome.exe") = 0 Then Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")
$hWnd = WinWait(" - Google Chrome", "", 60) ; Ждем 60 секунд
If Not $hWnd Then Exit

$oParent = _UIA_GetElementFromHandle($hWnd) ; Создание новую вкладку с использованием дескриптора окна

; Поиск кнопки с именем "Новая вкладка" и клик по ней
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Новая вкладка")
_UIA_ElementMouseClick($oElement)

; Поиск строки адреса и клик по ней
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Адресная строка и строка поиска")
_UIA_ElementMouseClick($oElement)

; Переход по URL дать объявление
Send("buy.110km.ru/cars/add/{enter}")

; Ожидание загрузки страницы по наличию элемента "Основная информация"
_UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Основная информация")

; Поиск элемента для ввода "Выберите марку"
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_DocumentControlTypeId ", "Выберите марку")
_UIA_ElementMouseClick($oElement)
Send("ВАЗ")
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
vaf
В чем моя ошибка ?
Во-первых, вы ожидаете загрузки элемента "Основная информация" и переходите к работе с другим элементом, который может быть ещё не загружен (как в вашем случае). Обнаружение элемента, находящегося вверху страницы, ещё не означает загрузку всей страницы.
Во-вторых, элемент "Выберите марку" в Chrome имеет тип "Text". Замените тип элемента и ваш пример будет работать
Код:
; Поиск элемента для ввода "Выберите марку"
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Выберите марку")
_UIA_ElementMouseClick($oElement)
Send("ВАЗ")

В-третьих, когда вы захотите кликнуть в элемент, находящийся за пределами видимости (например, "Тип двигателя"), то у вас ничего не получится, т.к. Chrome не возвращает координаты для элементов за пределами текущей видимости. Даже если этот элемент прокрутить в видимую зону.
 

uritalex

Новичок
Сообщения
197
Репутация
3
Пробовал запустить на стандартном Хроме и чего то оно не пошло :( такое чувство что он не хочет работать с --force-renderer-accessibility по этому использовал портативную сборку №31.0.1650.63 и все нормально прошло вод таким кодом:
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

$hnd = WinWaitActive(" - Google Chrome", "", 60) ; Ждем 60 секунд
If Not $hnd Then Exit

$oParent = _UIA_GetElementFromHandle($hnd)
Sleep (1000)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Новая вкладка")
_UIA_ElementMouseClick($oElement)
Sleep (1000)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Адресная строка и строка поиска")
_UIA_ElementMouseClick($oElement)
Send("buy.110km.ru/cars/add/{enter}")

Sleep (10000)

$oElement =  _UIA_WaitControlTypeElement($oParent, "UIA_EditControlTypeId", "Выберите марку")
_UIA_ElementMouseClick($oElement)
ControlSend($hnd, "", "Chrome_RenderWidgetHostHWND1", "ВАЗ")
ControlSend($hnd, "", "Chrome_RenderWidgetHostHWND1", "{TAB}");
Sleep (1000)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
не хочет работать с --force-renderer-accessibility
Проверил на последней 47.0.2526.106 m - нормально работает.

использовал портативную сборку №31.0.1650.63
А на версии 47 элемент "Выберите марку" имеет тип "Text", а не "Edit". И ControlSend при открытом списке на этой версии не проходит.
 

uritalex

Новичок
Сообщения
197
Репутация
3
Странно у меня та же версия и Inspect при включении отображении рамки при попытке выделить нужное поле выделяет всю область страницы :(
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
Проверьте, чтобы пробел был перед параметром, а сам параметр начинался с двух минусов.
Попробуйте перейти по "внутреннему" адресу chrome://accessibility и вручную включить.
 

uritalex

Новичок
Сообщения
197
Репутация
3
Самое интересно что получилось только в ручную :( но тем не менее работает даже через ControlSend:
Код:
#include "UIAutomate.au3"

Opt("WinTitleMatchMode", 2)

$hnd = WinWaitActive(" - Google Chrome", "", 60) ; Ждем 60 секунд
If Not $hnd Then Exit

$oParent = _UIA_GetElementFromHandle($hnd)
Sleep (1000)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_ButtonControlTypeId", "Новая вкладка")
_UIA_ElementMouseClick($oElement)
Sleep (1000)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "Адресная строка и строка поиска")
_UIA_ElementMouseClick($oElement)
Send("buy.110km.ru/cars/add/{enter}")


For $i = 0 To 20
   $oElement =  _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Выберите марку")
    If IsObj($oElement) Then
	   _UIA_ElementMouseClick($oElement)
 	   Sleep (500)
	   ExitLoop
	Else
	   Sleep (1000)
    EndIf
Next

ControlSend($hnd, "", "Chrome_RenderWidgetHostHWND1", "ВАЗ")
ControlSend($hnd, "", "Chrome_RenderWidgetHostHWND1", "{TAB}")

For $i = 0 To 20
   $oElement =  _UIA_WaitControlTypeElement($oParent, "UIA_TextControlTypeId", "Выберите модель")
    If IsObj($oElement) Then
	   _UIA_ElementMouseClick($oElement)
 	   Sleep (500)
	   ExitLoop
	Else
	   Sleep (1000)
    EndIf
 Next
 
ControlSend($hnd, "", "Chrome_RenderWidgetHostHWND1", "2101")
ControlSend($hnd, "", "Chrome_RenderWidgetHostHWND1", "{TAB}")
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
uritalex
А циклов-то, циклов... :smile:

Функция _UIA_WaitControlTypeElement() для того и сделана, чтобы ждать. Вы только последним параметром укажите время и она сама всё сделает. Ещё можно изменить время ожидания через глобальную переменную $UIA_DefaultWaitTime (по умолчанию 5 секунд).
 
Верх