Что нового

[Автоматизация] Подать объявление на avito

Xion

Новичок
Сообщения
11
Репутация
2
Хочу попробовать автоматизировать подачу объявлений на авито
Постепенно, кнопка за кнопкой, костыль за костылем дошел до этого куска кода:
avito ru/additem

Код:
<label class="packages__tab-nav__inner" for="pack3"> <input id="pack3" class="packages__tab-nav__radio" type="radio" name="service_code" value="free" tabindex="0"> <span class="packages__tab-nav__name">Обычная продажа</span>
  </label>

Вижу радио баттон, пытаюсь на него нажать:
Код:
_IEFormElementRadioSelect($oForm, "free", "pack3", 1, "byValue")


Но нифига не происходит
Смысл в том что я хочу выбрать пункт "Обычная продажа"
 
Автор
X

Xion

Новичок
Сообщения
11
Репутация
2
Нашел костыль в виде того чтобы сразу нажимать на кнопку быстрой продажи, без выбора этого таба
Но все же, хотелось бы понять как нажимать на такие типы кнопок (радио баттонов), я не особо понял что это вообще
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Попробуйте так:
Код:
_IEFormElementRadioSelect($oForm, "free", "service_code", 1, "byValue")

P.S. name и id разные вещи.


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

Код:
$oIE.document.getElementById("pack3").checked = true
или так.
Код:
_IEGetObjById($oIE, "pack3")
_IEAction($oIE, "click")
 
Автор
X

Xion

Новичок
Сообщения
11
Репутация
2
alex33 сказал(а):
Попробуйте так:
Код:
_IEFormElementRadioSelect($oForm, "free", "service_code", 1, "byValue")

P.S. name и id разные вещи.
В хелпе по этой команде сказано:
Код:
$s_name	Name or Id of Radio Group
То есть тут без разницы ID или Name, насколько я понимаю

$oIE.document.getElementById("pack3").checked = true
Я бы не хотел мешать команды autoit и методы IE, хотел бы сначала разобраться именно в autoit
 
Автор
X

Xion

Новичок
Сообщения
11
Репутация
2
alex33 сказал(а):
А консоль что пишет?
Пусто, по вашему совету:
$oCheckBox = _IEGetObjById($oIE, "pack3")
_IEAction($oCheckBox, "click")
Не работает

$oIE.document.getElementById("pack3").checked = true 1 раз отработал, затем перестал

Не пойму что такое происходит что скрипт то работает то нет


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

Поправка: все отрабатывается оказывается
Просто не отображается что этот пункт выбран, в общем я всеравно запутался :stars:


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

Пожалуй кину код целиком:

Код:
#include <IE.au3>

$oIE = _IECreate("https://www.avito.ru/additem")
WinSetState("[CLASS:IEFrame]", "", @SW_MAXIMIZE)
$oForm = _IEFormGetCollection($oIE, 0)
_IELoadWait($oForm)

_IETagValueClick($oIE, "input", 5)
_IETagValueClick($oIE, "input", 27)
_IETagValueClick($oIE, "input", 748)

$oSelect = _IEFormElementGetObjByName ($oForm, "params[83]")
_IEAction($oSelect,"focus")
Sleep(500)
Send("{DOWN 2}")
$oSelect = _IEFormElementGetObjByName ($oForm, "params[86]")
_IEAction($oSelect,"focus")
Sleep(500)
Send("{DOWN 3}")

$oInput = _IEFormElementGetObjByName($oForm, "title")
_IEFormElementSetValue($oInput, "Продаю вещь")
$oInput = _IEFormElementGetObjByName($oForm, "description")
_IEFormElementSetValue($oInput, "Хорошая вещь")
$oInput = _IEFormElementGetObjByName($oForm, "price")
_IEFormElementSetValue($oInput, "99999")

#_IEUploadImage("d:\картинка.жпг")
#_IEUploadImage("d:\картинка2.жпг")
#_IEUploadImage("d:\картинка3.жпг")

$oCheckBox = _IEGetObjById($oIE, "pack3")
_IEAction($oCheckBox, "click")

_IETagClassClick($oIE, "button", "button button-origin button-origin_large ")

Sleep(2000)
_IEFormElementCheckBoxSelect($oForm, "4", "service-premium", 0, "byValue")
_IEFormElementCheckBoxSelect($oForm, "1", "service-vip", 0, "byValue")
_IEFormElementCheckBoxSelect($oForm, "2", "service-highlight", 0, "byValue")

Func _IETagValueClick($Obj, $sTagName, $sValue)
    Local $oTags
    $oTags = _IETagNameGetCollection($Obj, $sTagName)
    For $oTag In $oTags
        If $oTag.value = $sValue Then
            _IEAction($oTag, 'click')
            ExitLoop
        EndIf
    Next
    _IELoadWait($Obj)
 EndFunc

Func _IETagClassClick($Obj, $sTagName, $sClassName)
    Local $oTags
    $oTags = _IETagNameGetCollection($Obj, $sTagName)
    For $oTag In $oTags
        If $oTag.className = $sClassName Then
            _IEAction($oTag, 'click')
            ExitLoop
        EndIf
    Next
    _IELoadWait($Obj)
 EndFunc

Func _IEUploadImage($path)
$oImageUp = _IEFormElementGetObjByName($oForm, 'image')
_IEAction ($oImageUp, "focus")
Sleep(250)
Send(" ")
Sleep(250)
Send($path)
Send("{Enter}")
Sleep(5000)
EndFunc
#ce

Может есть у кого идеи почему он так тупо работает?
PS запускать нужно имя кукисы, чтобы заход на сайт сразу был
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Возможно поможет установить
Код:
_IELoadWaitTimeout(10000)



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

Или ещё к переключениям элементов добавить FireEvent к событиям (например onchange, onfocus, onblur, oninput и т.д)...
 

uritalex

Новичок
Сообщения
197
Репутация
3
Добрый день ! Я сталкивался с такими моментами что скрипт то отрабатывает то нет :( и есть пару рекомендаций как это свести к минимуму (подсмотрел на форуме :smile: ):
1. в функции добавить дополнительную проверку в таком виде Для примера взята Ваша функция по аналогии сделать и остальные в таком виде:
Код:
Func _IETagValueClick($Obj, $sTagName, $sValue)
    Local $oTags
     While 1
		$oTags = _IETagNameGetCollection($Obj, $sTagName)
		If Not @error Then
			ExitLoop
		Else
			Sleep(1000)
		EndIf
	WEnd
        For $oTag In $oTags
           If $oTag.value = $sValue Then
             _IEAction($oTag, 'click')
             ExitLoop
           EndIf
        Next
    _IELoadWait($Obj)
 EndFunc

2. Ну и по возможности вместо Send использовать ControlSend
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
uritalex сказал(а):
2. Ну и по возможности вместо Send использовать ControlSend
3. А по возможности не использовать Send / ControlSend, а делать всё на уровне HTML / JS и событий (events), если это возможно. Это куда более надёжно, да и я уже так привык делать, хотя это бывает иногда немного сложнее, чем просто enter через Send нажать...
 

uritalex

Новичок
Сообщения
197
Репутация
3
То же верно :smile: но для начала стоит все перевести на ControlSend тем более что человек сказал: "Я бы не хотел мешать команды autoit и методы IE, хотел бы сначала разобраться именно в autoit" :whistle:
П.С. А первая моя рекомендация, добавить цикл проверки, вроде Ваше творение, если не ошибаюсь :whistle:
 
Верх