Автор Тема: Нажать кнопку в таблице на сайте  (Прочитано 813 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Discrim [?]

  • Новичок
  • *
  • Сообщений: 2
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Доброго времени суток.

Уже 4 часа бьюсь над проблемой нажатия кнопки, перечитал всю справку, облазил весь форум - никакого результата. Решил обратиться за помощью к вам.

Есть сайт, на нем 10 строк с таким кодом:
<tr data-id="*1" class="mgmtres mgmtdemand pointer" onclick="return lol.Mgmt.showResourceInfo(this,event)">
<td class="icon">
<img class="round" src="/img/res/fish.png">
</td><td class="name">Fish</td>
<td class="count">26</td>
<td class="quant">26&thinsp;kg</td>
<td class="value gold monospace">24.44</td>
<td class="submit">
      <button class="submit green" onclick="return lol.Mgmt.purchase(this,event)">Buy</button></td>
</tr>
Где *1 порядок строки в таблице, name - название строки, справа кнопка "Купить"

Я захожу на сайт, проверяю по своим фильтрам Fish это или нет, после чего должен нажать на кнопку купить.
Код: AutoIt [Выделить]
_IENavigate($oIE, $sUrlDemands1)
_IELoadWait($oIE)
 

(фильтр опускаю, его пока не реализовал)
Далее я пытаюсь нажать на кнопку.
Пробовал все. И поиск по ID :
Код: AutoIt [Выделить]
$oForm=_IEGetObjById($oIE, '*1')

И по имени :
Код: AutoIt [Выделить]
$oForm=_IEGetObjByName($oIE, 'mgmtres mgmtdemand pointer')

Или так :
Код: AutoIt [Выделить]
$oForm=_IEGetObjByName($oIE, 'Name')


Затем пытался вытащить name из формы (Fish) и сравнить с заданной строкой, но даже найти нужную форму не получалось, не говоря и нажатии этой кнопки, которую тоже всеми способами пытался нажать. При компиляции всегда выскакивает подобное

--> IE.au3 T3.0-2 Warning from function _IEGetObjByName, $_IESTATUS_NoMatch (Name: Fish, Index: 0)
или
--> IE.au3 T3.0-2 Warning from function _IEGetObjById, $_IESTATUS_NoMatch (*1)

Прошу вашей помощи.
Как мне вытащить имя "Fish" из кода, а затем нажать кнопку?
Заранее спасибо.

Русское сообщество AutoIt

Нажать кнопку в таблице на сайте
« Отправлен: Декабрь 23, 2017, 02:59:27 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3754
  • Репутация: 991
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажать кнопку в таблице на сайте
« Ответ #1, Отправлен: Декабрь 23, 2017, 16:09:39 »
Discrim  [?]
Цитировать
нажать на кнопку купить
Код: AutoIt [Выделить]
$oButtons = _IETagNameGetCollection($oIE, "button")
For $oButton In $oButtons
  If $oButton.ClassName = "submit green" Then
    _IEAction($oButton, "click")
    ExitLoop
  EndIf
Next


Оффлайн Discrim [?]

  • Новичок
  • *
  • Сообщений: 2

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажать кнопку в таблице на сайте
« Ответ #2, Отправлен: Декабрь 23, 2017, 19:47:31 »
Спасибо, InnI.
Кнопка нажимается.
А можно как-то перед ее нажатием вытащить name? Там их 10 штук и покупать все не надо. Хочу идти по порядку и сравнивать с черным списком, если покупать можно, то купить, если нельзя, то идти дальше.

Пробую так :
Код: AutoIt [Выделить]
$oButtons = _IETagNameGetCollection($oIE, "button")
$oNames=_IETableGetCollection($oIE,'class="name"'); Или name, или class='name', или td/td
For $oName In $oNames
    If $oName.ClassName = "name" Then
        For $oButton In $oButtons
            If $oButton.ClassName = "submit green" Then
                _IEAction($oButton, "click")
                ExitLoop
            EndIf
        Next
        ExitLoop
    EndIf
Next
 

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



Добавлено: Декабрь 24, 2017, 01:47:26
Попробовал иначе, все равно не работает.
Логика такая.
Я беру все строки таблицы по имени класса  class="mgmtres mgmtdemand pointer"
Затем по каждой из них иду в цикле For и просто пытаюсь найти в строке таблицы элемент с названием класса class='name'. Если я нахожу его, я кликаю по кнопке. Я даже не пытаюсь вытащить значение в этом элементе. Просто пытаюсь его найти. Если нахожу, кликаю по кнопке.

Код: AutoIt [Выделить]
$oStrings = _IETagNameGetCollection($oIE, "tr")
For $oString In $oStrings
  If $oString.ClassName = "mgmtres mgmtdemand pointer" Then
    $oNames = _IETagNameGetCollection($oString, "class")
    For $oName In $oNames
        If $oName.ClassName = "name" Then
            $oButtons = _IETagNameGetCollection($oString, "button")
            For $oButton In $oButtons
                If $oButton.ClassName = "submit green" Then
                    _IEAction($oButton, "click")
                    ExitLoop
                EndIf
            Next
            ExitLoop
        EndIf
    Next
    ExitLoop
  EndIf
Next
 

Основная идея затем вытащить из class='name' значение >Fish<, но даже просто имя не находит. Дебаг месседж строки $oNames = _IETagNameGetCollection($oString, "class") дает 0.

Что делать? Как мне не сразу кликнуть по кнопке, а узнать перед этим текст в строке таблицы?


Добавлено: Декабрь 24, 2017, 02:17:42
Добавил фильтр. Если фильтра нет, то все работает. Если фильтр включен(строчка If String($oName.value) = "Beer" Then), то выдает ошибку
If String($oName.value) = "Beer" Then
If String($oName^ ERROR
Код: AutoIt [Выделить]
$oStrings = _IETagNameGetCollection($oIE, "tr")
For $oString In $oStrings
  If $oString.ClassName = "mgmtres mgmtdemand pointer" Then
    $oNames = _IETagNameGetCollection($oString, "td")
    For $oName In $oNames
        If $oName.ClassName = "name" Then
            If String($oName.value) = "Beer" Then
                $oButtons = _IETagNameGetCollection($oString, "button")
                For $oButton In $oButtons
                    If $oButton.ClassName = "submit green" Then
                        _IEAction($oButton, "click")
                        ExitLoop
                    EndIf

                Next
                ExitLoop
            EndIf
            ExitLoop
        EndIf
    Next
    ExitLoop
  EndIf
Next



Добавлено: Декабрь 24, 2017, 03:03:53
Поменял на innertext и заработало, но правда только если Beer стоит в первой строчке таблицы. Вторую не ищет.
Правильно ли я понимаю, что мой код идет по всем строкам
Код: AutoIt [Выделить]
$oStrings = _IETagNameGetCollection($oIE, "tr")
For $oString In $oStrings

Строка задается тегом /tr, я ищу все эти строки и по очереди проверяю каждую, верно?
Я пробовал менять на _IETagNameAllGetCollection, но тогда вообще ничего не находит.

Код: AutoIt [Выделить]
$oStrings = _IETagNameGetCollection($oIE, "tr")
For $oString In $oStrings
  If $oString.ClassName = "mgmtres mgmtdemand pointer" Then
    $oNames = _IETagNameGetCollection($oString, "td")
    For $oName In $oNames
        If $oName.ClassName = "name" Then
            If String($oName.innerText) = "Beer" Then
                $oButtons = _IETagNameGetCollection($oString, "button")
                For $oButton In $oButtons
                    If $oButton.ClassName = "submit green" Then
                        _IEAction($oButton, "click")
                        ExitLoop
                    EndIf

                Next
                ExitLoop
            EndIf
            ExitLoop
        EndIf
    Next
    ExitLoop
  EndIf
Next
 

Как мне найти во второй строке Fish и кликнуть по соответствующей кнопке?
« Последнее редактирование: Декабрь 24, 2017, 03:03:54 от Discrim, Причина: Объединение сообщений »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3754
  • Репутация: 991
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажать кнопку в таблице на сайте
« Ответ #3, Отправлен: Декабрь 26, 2017, 13:59:56 »
Код: AutoIt [Выделить]
$oStrings = _IETagNameGetCollection($oIE, "tr")
For $oString In $oStrings
  $oNames = _IETagNameGetCollection($oString, "td")
  For $oName In $oNames
    If $oName.ClassName = "name" And $oName.innerText = "Fish" Then
      $oButton = _IETagNameGetCollection($oString, "button", 0)
      _IEAction($oButton, "click")
      ExitLoop 2
    EndIf
  Next
Next


Русское сообщество AutoIt

Re: Нажать кнопку в таблице на сайте
« Ответ #3 Отправлен: Декабрь 26, 2017, 13:59:56 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
8185 Просмотров
Последний ответ Март 29, 2011, 06:53:41
от Meridi
3 Ответов
3210 Просмотров
Последний ответ Ноябрь 02, 2011, 05:46:10
от eropov
3 Ответов
2589 Просмотров
Последний ответ Май 14, 2012, 20:03:02
от Garrett
3 Ответов
1581 Просмотров
Последний ответ Февраль 15, 2014, 14:38:51
от MnM
1 Ответов
1467 Просмотров
Последний ответ Май 24, 2014, 16:10:04
от alex33
4 Ответов
1290 Просмотров
Последний ответ Декабрь 13, 2014, 23:41:50
от alex33
17 Ответов
5481 Просмотров
Последний ответ Февраль 07, 2015, 13:32:11
от Vovsla
7 Ответов
1915 Просмотров
Последний ответ Март 09, 2015, 15:49:50
от CreatoR
2 Ответов
1251 Просмотров
Последний ответ Октябрь 28, 2015, 11:35:58
от a.i.ivanov
7 Ответов
1239 Просмотров
Последний ответ Декабрь 21, 2017, 11:13:38
от IP_rat