1

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

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

2

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

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

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

3

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

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

4

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

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

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

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
Telegram jollycoder

6

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

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

7

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

Этот пример работает без отладочного режима браузера - есть ли возможность адаптировать его для получения содержимого страницы для работы с html-элементами?

8

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

Без режима, не предназначен для получения всего содержимого страницы, но можно получать отдельные элементы.

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

9

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

Жалко конечно. А видео ютуба на паузу так ставить и снимать с нее можно?

10

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

Скорее всего можно.

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

11

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

А есть какой-нибудь смотрельщик, чтобы показывало все элементы на текушей странице? Тогда бы легко можно было находить то что нужно.
Хм, может можно обертку к этим элементам сделать, чтобы они отображались в более привычном html-виде, пусть даже без возможности изменения, есть что-нибудь на эту тему?

12

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

Если задача находить DOM-элементы на странице и взаимодействовать с ними, то наилучший подход здесь — это какое-либо расширение для браузера, которое может по какому-нибудь событию (например, по горячей клавише) запускать на странице пользовательский джаваскрипт, который будет выполнять нужные действия и выводить наружу результаты. К примеру, есть расширение AutoControl, которое может такое делать. А AutoHotkey сам по себе имеет очень ограниченные возможности для решения подобных задач, так как браузеры не предоставляют для этого никакого интерфейса.

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

13

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

teadrinker пишет:

так как браузеры не предоставляют для этого никакого интерфейса

Ну, не то, чтобы никакого, есть Chrome DevTools Protocol, которым можно воспользоваться через Chrome.ahk. Для его использования браузер должен быть запущен с определёнными ключами.

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

14

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

Спасибо. Про DevTools Protocol знаю, но для запуска браузера по умолчанию не очень подходит - тот запускается сам и без ключей.