1

Тема: AHK: Поиск текста кнопки на сайте и нажатие на нее лкм

Добрый день. Сразу извиняюсь, если такой вопрос уже подымался. Но конкретно найти именно в моем случае я не нашел. В Autohotkey понимаю слабо. Помогите написать код пжта. Итак задача: Необходимо найти на сайте кнопку с текстом (кнопка иногда находится в другом положении) и нажать на нее ЛКМ.
Допустим я могу средствами ahk найти этот текст кнопки через ctrl+F а как нажать на нее?

2

Re: AHK: Поиск текста кнопки на сайте и нажатие на нее лкм

Зависит от браузера.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3

Re: AHK: Поиск текста кнопки на сайте и нажатие на нее лкм

В основном пользуюсь google chrome. Но если вам легче будет мне помочь написать код для firefox, ничего страшного. Мне главное результат.

4

Re: AHK: Поиск текста кнопки на сайте и нажатие на нее лкм

Для обоих сложно, AHK нативно не поддерживает ни тот, ни другой, прямой доступ к странице есть только для Internet Explorer. Однако иногда можно воспользоваться некоторыми косвенными способами взаимодействия, нужно видеть страницу, чтобы сказать наверняка.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5

Re: AHK: Поиск текста кнопки на сайте и нажатие на нее лкм

Ventura_sv пишет:

Для этой страницы https://www.pathofexile.com/trade/searc … QLrPmWpCw. Страница сайта игры Path of exile. Справа цена за вещь, а снизу кнопка "whisper" она интересует. Результат поиска будет 1, т.е. первый.

В личку не надо писать, если только не хотите оплатить работу.
У меня так сработало:

SetBatchLines, -1
Return

$F1::
   SendMessage, WM_GETOBJECT := 0x003D, 0, 1, Chrome_RenderWidgetHostHWND1, ahk_class Chrome_WidgetWin_1
   if !accChrome := AccObjectFromWindow( WinExist("ahk_class Chrome_WidgetWin_1") ) {
      MsgBox, Не удалось получить accessible-object
      ExitApp
   }
   if !AccElem := SearchElement(accChrome, {Role: ROLE_SYSTEM_PUSHBUTTON := 0x2B, Name: "Whisper"}) {
      MsgBox, Кнопка "Whisper" не найдена
      ExitApp
   }
   AccElem.accDoDefaultAction(0)
Return

SearchElement(parentElement, params)
{
   found := true
   for k, v in params {
      try (parentElement["acc" . k](0) != v && found := false)
      catch 
         found := false
   } until !found
   if found
      Return parentElement
   
   for k, v in AccChildren(parentElement)
      if obj := SearchElement(v, params)
         Return obj
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF
   DllCall("ole32\CLSIDFromString", Str, idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, Ptr, &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", Ptr, hWnd, UInt, idObject, Ptr, &IID, PtrP, pAcc) = 0
      Return ComObject(VT_DISPATCH, pAcc, F_OWNVALUE)
}

AccChildren(Acc) {
   static VT_DISPATCH := 9
   Loop 1  {
      if ComObjType(Acc, "Name") != "IAccessible"  {
         error := "Invalid IAccessible Object"
         break
      }
      cChildren := Acc.accChildCount, Children := []
      VarSetCapacity(varChildren, cChildren*(8 + A_PtrSize*2), 0)
      res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
                                                , "Int", cChildren, "Ptr", &varChildren, "IntP", cChildren)
      if (res != 0) {
         error := "AccessibleChildren DllCall Failed"
         break
      }
      Loop % cChildren  {
         i := (A_Index - 1)*(A_PtrSize*2 + 8)
         child := NumGet(varChildren, i + 8)
         Children.Push( (b := NumGet(varChildren, i) = VT_DISPATCH) ? AccQuery(child) : child )
         ( b && ObjRelease(child) )
      }
   }
   if error
      ErrorLevel := error
   else
      Return Children.MaxIndex() ? Children : ""
}

AccQuery(Acc)  {
   static IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}", VT_DISPATCH := 9, F_OWNVALUE := 1
   try Return ComObject(VT_DISPATCH, ComObjQuery(Acc, IAccessible), F_OWNVALUE)
}

По нажатию F1 ищет, если нашлась — нажимает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

6

Re: AHK: Поиск текста кнопки на сайте и нажатие на нее лкм

Ого столько кода из-за одного клика на нужную кнопку... Большое спасибо и низкий вам поклон. Все работает. Я сам такой код точно не написал бы. Теперь я знаю куда можно обратиться с вопросами по скрипткодингу.