Что нового

Не получается автоматически заформить форму оплаты магазина

astanid

Новичок
Сообщения
38
Репутация
0
Использую UIAutomate
http://autoit-script.ru/index.php?topic=16780.165
форма заказа https://www.supremenewyork.com/checkout
предварительно нужно на сайте выбрать что нибудь для покупки, например
http://www.supremenewyork.com/shop/shirts/s98ua6r1x

Код:
#include <UIAutomate.au3> ; Смотри: http://autoit-script.ru/index.php?topic=16780.0
Opt("WinTitleMatchMode", 2)

; Запуск Chrome с параметром --force-renderer-accessibility
; При отсутствии этого параметра доступ к элементам страницы будет запрещён

$hWnd = GetPage()



If Not $hWnd Then Exit
$searchString="Supreme"

;only open new 'Supreme' tab if there's no active one
If StringInStr(WinGetTitle("[ACTIVE]"), $searchString) = 0 Then
; Создание элемента с использованием дескриптора окна
$oParent = _UIA_GetElementFromHandle($hWnd)

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

sleep(100)
; Переход на сайт
Send("https://www.supremenewyork.com/checkout",1)
Send("{ENTER}")

$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "order_billing_name")
_UIA_ElementMouseClick($oElement)

endif
sleep(100)



	Func GetPage()
		$title='[TITLE:Supreme - Google Chrome]'
		if WinExists($title) then
			WinActivate($title)
		Else

		Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")
		endif

		$hWnd = WinWait(" - Google Chrome", "", 3)
		Return  $hWnd

	EndFunc

Не получается кликнуть на поле Full name
Информация из Inspect
Код:
<div class="input string required"><label class="string required control-label" for="order_billing_name">full name</label><input class="string required" first_and_last="true" id="order_billing_name" name="order[billing_name]" required="required" size="50" type="text"></div>
ошибок никаких не получаю - но курсор не перемещается
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
astanid
Информация из Inspect
Inspect - это утилита, находящаяся в архиве с UDF (Inspect_W7.exe или Inspect_W10.exe). А вы предоставили код из инструментов разработчика браузера.

ошибок никаких не получаю
А мне пишет
Код:
!> _UIA_GetControlTypeElement : значение указанного свойства найденных элементов не соответствует заданному
!> _UIA_ElementMouseClick : первый параметр не является объектом

кликнуть на поле Full name
Код:
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", "full name")
_UIA_ElementMouseClick($oElement)
 
Автор
A

astanid

Новичок
Сообщения
38
Репутация
0
хм ( один раз сработало -и снова стало глючить :( уж думаю может показалось

Код:
#include <UIAutomate.au3> ; Смотри: http://autoit-script.ru/index.php?topic=16780.0
Opt("WinTitleMatchMode", 2)

; Запуск Chrome с параметром --force-renderer-accessibility
; При отсутствии этого параметра доступ к элементам страницы будет запрещён

Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")
$hWnd = WinWait(" - Google Chrome", "", 3)
If Not $hWnd Then Exit

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

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


даже на этом этапе я получаю ошибку
Код:
!> _UIA_GetControlTypeElement : значение указанного свойства найденных элементов не соответствует заданному
!> _UIA_ElementMouseClick : первый параметр не является объектом
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
astanid
Попробуйте заменить функцию _UIA_GetControlTypeElement() на _UIA_WaitControlTypeElement().
Или дождитесь полной загрузки окна через
Код:
WinWaitActive()
 
Автор
A

astanid

Новичок
Сообщения
38
Репутация
0
все равно не работает. ок зайдем с другой стороны
Код:
; Поиск строки адреса и клик по ней
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_EditControlTypeId", "Адресная строка и строка поиска")
_UIA_ElementMouseClick($oElement)

Вот откуда берется параметр "Адресная строка и строка поиска" ?
я не вижу в Inspect для окна Chrome ничего подобного.
 

Вложения

  • Clipboard01.jpg
    Clipboard01.jpg
    117.6 КБ · Просмотры: 7

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
astanid
Если в Inspect включена опция поиска по фокусу ввода (меню "Options - Watch Focus" или "пунктирная рамка" на панели кнопок), то достаточно просто кликнуть в строку адреса. Если включена опция отслеживания мыши (меню "Options - Watch Cursor" или "курсор мыши" на панели кнопок), то нужно навести курсор мыши на строку адреса и секунду не двигать. Опции могут работать вместе. Для удобства можно включить подсветку текущего элемента ("жёлтая рамка" на панели кнопок).

Теперь смотрим в окно Inspect. В дереве будет выделен найденный элемент, а в правой панели отобразятся его свойства (левая колонка) и значения этих свойств (правая колонка). В данном случае вам нужно значение свойства "Name:". В русской версии это "Адресная строка и строка поиска". У вас в английской "Address and search bar".

Ещё можно искать элементы просто выделяя их в дереве Inspect. Но тут лучше включить подсветку элементов, иначе сложно понять какой выбран.
 
Автор
A

astanid

Новичок
Сообщения
38
Репутация
0
Отлично. Переход на строку адреса заработал.
Но устойчиво нажать в поле full name не получается. Inspect это поле не показывает (он подсвечивает всю страницу, но не отдельные элементы)
WaitControl GetControl не работают. пробовал задержки в 3-5 секунд чтобы страница уж точно загрузилась
Код:
sleep(1000)
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_EditControlTypeId", "full name")
_UIA_ElementMouseClick($oElement)
так как убедится что full name именно нужный мне параметр ?
Код:
!> _UIA_GetControlTypeElement : значение указанного свойства найденных элементов не соответствует заданному
!> _UIA_ElementMouseClick : первый параметр не является объектом
В Inspect браузера уже лезть исследовать код страницы ? уже лазил (см. первое сообщение) там full name
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
astanid
Inspect это поле не показывает (он подсвечивает всю страницу, но не отдельные элементы)
Потому что Chrome должен быть запущен с параметром "--force-renderer-accessibility".
 
Автор
A

astanid

Новичок
Сообщения
38
Репутация
0
ок. похоже в этом дело действительно. но что делать если есть у меня уже есть вкладка хрома работающая, которую я не хочу трогать ?
Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")
запускает новое окно хрома и новый процесс, но почему то не работает. т.е перезапуск хрома полный перед запуском скрипта обязателен ? А можно ли как то принудительно в настройких установить запуск хрома всегда с таким параметром ?

код все равно сбоит через раз :( вроде значение вбивается в окно - но пропадает после конца работы скрипта :(
Код:
#include <UIAutomate.au3> ; Смотри: http://autoit-script.ru/index.php?topic=16780.0
Opt("WinTitleMatchMode", 2)

; Запуск Chrome с параметром --force-renderer-accessibility
; При отсутствии этого параметра доступ к элементам страницы будет запрещён

$hWnd= GetPage()
If Not $hWnd Then Exit

; Создание элемента с использованием дескриптора окна
$oParent = _UIA_GetElementFromHandle($hWnd)
; Поиск строки адреса и клик по ней
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_EditControlTypeId", "Address and search bar")
_UIA_ElementMouseClick($oElement)

sleep(500)

; Переход на сайт
Send("{DELETE}") ;трем адрес если он там есть
Send("https://www.supremenewyork.com/checkout",1)
Send("{ENTER}")

sleep(1000)
;ждем загрузки страницы
$oElement = _UIA_WaitControlTypeElement($oParent, "UIA_EditControlTypeId", "full name")

;Вбиваем построчно значения
SetField($oParent,"full name","Ivan Rusoff")
SetField($oParent,"email","[email protected]")



Func SetField($oParent,$field_name,$value)
$oElement = _UIA_GetControlTypeElement($oParent, "UIA_EditControlTypeId", $field_name)
_UIA_ElementMouseClick($oElement)
_UIA_ElementSetFocus($oElement)
Send($value)
EndFunc

Func GetPage()
	$title='[TITLE:Supreme - Google Chrome]'
	if WinExists($title) then
		WinActivate($title)
	Else

	Run(@ProgramFilesDir & "\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")
	endif

	$hWnd = WinWaitActive(" - Google Chrome", "", 3)
	Return  $hWnd

EndFunc

номер кредитки вообще ввести не удается :( там поле чтоли принципиально другой модели ?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
astanid
запускает новое окно хрома и новый процесс
Все следующие окна будут "наследовать" настройки самого первого. Т.е. вы можете первое окно запустить с этим параметром, а остальные без параметра, но они тоже будут обладать доступом.

как то принудительно в настройких установить
Этого я не знаю. Но можно в ярлыке прописать. Ещё можно перейти на "внутреннюю" страницу chrome://accessibility и там управлять настройками доступа (даже по каждой странице отдельно).

пропадает после конца работы скрипта
Даже не знаю... У меня ваш код отработал десять из десяти. И с перезапусками и без.
Попробуйте небольшие паузы вставлять, т.к. то, что вы дождались элемента, ещё не означает, что он готов принимать данные.

поле чтоли принципиально другой модели
Обычное поле. Просто его найти сложно - у него имени нет.

А так не проще?
Код:
Run("D:\Portable\GoogleChrome\GoogleChromePortable.exe https://www.supremenewyork.com/checkout")
Sleep(3000)
Send("{TAB 5}")
Send("Ivan Rusoff{TAB}")
Send("[email protected]")
 
Автор
A

astanid

Новичок
Сообщения
38
Репутация
0
Спасибо. TAB 5 использовать для первого действия мне в голову не пришло :smile: да и вообще разобраться хотелось с поиском полей на странице

глюки все равно преследуют меня... например адрес страницы в адресной строке вводится в переключенной на русский раскладке (т.е реезыЖ..цццюыгзкуьутуцнщклюсщь.сруслщге). что это такое и как побороть ?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
astanid
что это такое и как побороть ?
OffTopic:
Это одна из известных проблем особенностей AutoIt. Дело в том, что у скрипта и у принимающей программы разные раскладки клавиатуры. Поэтому нужно либо принудительно устанавливать английскую, либо синхронизировать.
Как посылать команды в консоль CMD независимо от раскладки клавиатуры?
Обход проблемы с кодировкой при использовании Send
Обход проблемы с HotKeySet/Accelerators при разных раскладках клавиатуры

Когда уже поиск заработает?! :mad:
 
Верх