Что нового

[Автоматизация] Эмуляция нажатия на кнопку

Yago2015

Новичок
Сообщения
8
Репутация
0
Здравствуйте,
Имеется кнопка вида

Код:
<td style="-moz-user-select: none;" tabindex="0" aria-haspopup="true" role="button" id="btnTaskActions_arrow" class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton" dojoattachpoint="_popupStateNode,focusNode,_buttonNode" dojoattachevent="onmouseenter:_onMouse,onmouseleave:_onMouse,onkeypress:_onArrowKeyPress" statemodifier="DownArrow" title="" wairole="button" waistate="haspopup-true"><div role="presentation" class="dijitReset dijitArrowButtonInner" wairole="presentation"> </div><div role="presentation" class="dijitReset dijitArrowButtonChar" wairole="presentation">▼</div></td>
Как на нее нажать? Вернее как ее найти?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yago2015,
Так не работает?
Код:
;~ ...
$oBtn = _IEGetObjById($oIE, 'btnTaskActions_arrow')
If Not @error Then _IEAction($oBtn, 'click')
;~ ...
 
Автор
Y

Yago2015

Новичок
Сообщения
8
Репутация
0
Что-то не работает...
Привожу часть программы, которой требуется отладка

Код:
#region --- Au3Recorder generated code Start (v3.3.9.5 KeyboardLayout=00000409)  ---

#region --- Internal functions Au3Recorder Start ---
Func _Au3RecordSetup()
Opt('WinWaitDelay',100)
Opt('WinDetectHiddenText',1)
Opt('MouseCoordMode',0)
Local $aResult = DllCall('User32.dll', 'int', 'GetKeyboardLayoutNameW', 'wstr', '')

EndFunc

Func _WinWaitActivate($title,$text,$timeout=0)
	WinWait($title,$text,$timeout)
	If Not WinActive($title,$text) Then WinActivate($title,$text)
	WinWaitActive($title,$text,$timeout)
 EndFunc

 Local $oIE
_WinWaitActivate("РЕГ. КАРТА ДОКУМЕНТА #В","") ; активировать окно документа
#include <IE.au3>
$oBtn = _IEGetObjById($oIE, 'btnTaskActions_arrow')
If Not @error Then _IEAction($oBtn, 'click')
 

ivanius

Знающий
Сообщения
74
Репутация
5
В Лисе (Mozilla FireFox) Можно записать все клики для селениума и использовать
вот информация с примерами
https://code.google.com/p/selenium-vba/
тема
http://autoit-script.ru/index.php?topic=18687.msg112705#msg112705
там просто проклацаешь - и все у тебя будет готовый код.
 
Автор
Y

Yago2015

Новичок
Сообщения
8
Репутация
0
madmasles Пробую присваивать $oIE = _IECreate("", 1, 1, 0) но что-то безрезультатно...
ivanius Спасибо, попробую.
 
Автор
Y

Yago2015

Новичок
Сообщения
8
Репутация
0
madmasles в локальной сети он. доступ через web интерфейс.
 
Автор
Y

Yago2015

Новичок
Сообщения
8
Репутация
0
madmasles, ну весь код не могу - вот его часть, которая относится к выполнению задания.
Код:
 <!--#docAttrs-->
</TD>
</TR>
<TR>
<TD>
<TABLE cellspacing="0" cellpadding="0" wairole="presentation" class="dijit dijitReset dijitInline dijitLeft dijitComboButton" role="presentation" id="btnTaskActions" widgetid="btnTaskActions" >
<TBODY wairole="presentation" role="presentation" >
<TR wairole="presentation" role="presentation" >
<TD class="dijitReset dijitStretch dijitButtonNode" >
<BUTTON waistate="labelledby-btnTaskActions_label" wairole="button" dojoattachpoint="titleNode" dojoattachevent="onclick:_onButtonClick,onmouseenter:_onMouse,onmouseleave:_onMouse,onmousedown:_onMouse,onkeypress:_onButtonKeyPress" class="dijitReset dijitButtonContents" id="btnTaskActions_button" role="button" aria-labelledby="btnTaskActions_label" tabindex="0" >
<DIV wairole="presentation" dojoattachpoint="iconNode" class="dijitReset dijitInline" role="presentation" ></DIV>
<DIV wairole="presentation" dojoattachpoint="containerNode" id="btnTaskActions_label" class="dijitReset dijitInline dijitButtonText" role="presentation" >
<H3>Задание</H3>
</DIV>
</BUTTON>
</TD>
<TD waistate="haspopup-true" wairole="button" statemodifier="DownArrow" dojoattachevent="onmouseenter:_onMouse,onmouseleave:_onMouse,onkeypress:_onArrowKeyPress" dojoattachpoint="_popupStateNode,focusNode,_buttonNode" class="dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton" id="btnTaskActions_arrow" role="button" aria-haspopup="true" tabindex="0" style="-moz-user-select: none;" >
<DIV wairole="presentation" class="dijitReset dijitArrowButtonInner" role="presentation" > </DIV>
<DIV wairole="presentation" class="dijitReset dijitArrowButtonChar" role="presentation" >▼</DIV>
</TD>
</TR>
</TBODY>
</TABLE>
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yago2015
У меня с Вашим HTML-кодом это работает:
Код:
#include <IE.au3>

$oIE = _IECreate(@ScriptDir & '\1.html');поменяйте на Вашу ссылку
$oBtn = _IEGetObjById($oIE, 'btnTaskActions_button')
If Not @error Then _IEAction($oBtn, 'click')
 
Автор
Y

Yago2015

Новичок
Сообщения
8
Репутация
0
madmasles, не получается что-то. @ScriptDir по-моему не применимо, у окна которое является целью адрес вида.
Код:
http://192.168.70.90:8080/task.htm?that=255&id=FED6BC7A61246381E040E22E1FE371BD
Но и без макроса @ScriptDir
Код:
#include <IE.au3>

$oIE = _IECreate('\192.168.70.90:8080/task.htm?that=255&id=FED6BC7A61246381E040E22E1FE371BD', 1, 1, 1, 1);поменяйте на Вашу ссылку
$oBtn = _IEGetObjById($oIE, 'btnTaskActions_button')
If Not @error Then _IEAction($oBtn, 'click')
не работает. :(



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

ivanius, меня беспокоят вот эти ERROR: Unsupported command. С ними даже наклацанный скрипт не идет.
Код:
driver.get "/?id=3EF33AD411BFFE36E040A8C0213D4990"
driver.findElementByXPath("//div[@id='dojox_grid__View_1']/div/div/div/div[5]/table/tbody/tr[2]/td/a/span").click
' ERROR: Caught exception [ERROR: Unsupported command [waitForPopUp | Карточка | 30000]]
' ERROR: Caught exception [ERROR: Unsupported command [selectWindow | name=Карточка | ]]
driver.findElementById("btnTaskActions_arrow").click
driver.findElementById("dijit_MenuItem_0_text").click
' ERROR: Caught exception [ERROR: Unsupported command [waitForPopUp | Результат_исполнения | 30000]]

driver.stop



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

ivanius как VBS скрипт вставить в программу?
 

ivanius

Знающий
Сообщения
74
Репутация
5
я же вам в личном сообщении написал что там нужно заменить "Driver" на ВАШ ОБЬЕКТ, у меня в примере это $Selenium
ivanius сказал(а):
да нет там генерируется уже готовый код, где просто заменить нужно будет переменную driver на вашу к примеру у меня $selenium и все,
для вашего кода :
Код:
$Selenium = ObjCreate("SeleniumWrapper.WebDriver")
  $Selenium.Start("Chrome", "");Или мозилла
 $selenium.open ("http://autoit-script.ru/");тут ваш сайт то что идет до /?id или вся ссылка
$Selenium.get "/?id=3EF33AD411BFFE36E040A8C0213D4990"
$Selenium.findElementByXPath("//div[@id='dojox_grid__View_1']/div/div/div/div[5]/table/tbody/tr[2]/td/a/span").click
$Selenium.findElementById("btnTaskActions_arrow").click
$Selenium.findElementById("dijit_MenuItem_0_text").click
 
Автор
Y

Yago2015

Новичок
Сообщения
8
Репутация
0
ivanius, да я понял, что вы мне тогда написали. Там, видимо защита какая-то стоит, не удается найти элемент по id. Решение, то в принципе существует - сделать запись через Au3recorder, (через координаты кликов мыши :smile:) но проблема, что кнопки иногда смещаются по вертикали и общий алгоритм в них не может попасть.
Selenium с этим справляется.
Вот скрипт VBS который он генерирует при этом

Код:
Public Sub Untitled()
  Dim selenium As New SeleniumWrapper.WebDriver
  selenium.start "firefox", "http://192.168.70.90:8080/"
  selenium.setImplicitWait 5000

  selenium.open "/?id=3EF33AD411BFFE36E040A8C0213D4990"
  selenium.click "link=В-1787от22.01.15"
  selenium.waitForPopUp "Карточка", 30000
  selenium.selectWindow "name=Карточка"
  selenium.click "css=div.dijitReset.dijitArrowButtonInner"
  selenium.click "id=dijit_MenuItem_0_text"
  selenium.waitForPopUp "Результат_исполнения", 30000
  selenium.selectWindow "name=Результат_исполнения"
  selenium.type "id=edRegDt", 22.01.2015
  selenium.click "id=btnOk"

  selenium.stop
End Sub

Вопрос, как этот скрипт (а я думаю это возможно сделав его внешним скриптом) VBS привязать к программе AutoIt?
P.S. предложенный способ через переменную $selenium не работает.
 

ivanius

Знающий
Сообщения
74
Репутация
5
ВОПРОС ЗАЧЕМ?
Ты этот же код в автиоте использовать можешь зайди в тему и посмотри я тебе код АВТОИТА НАПИСАЛ
просто создай обьект и добавь к переменным $!!!!
почему не работает, если у меня работает? я к тому что есть какие-то ошибки?


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

Код:
$Selenium = ObjCreate("SeleniumWrapper.WebDriver")
  $selenium.start ("firefox", "http://192.168.70.90:8080/")
  $selenium.setImplicitWait (5000)

  $selenium.open ("/?id=3EF33AD411BFFE36E040A8C0213D4990")
  $selenium.click ("link=В-1787от22.01.15")
  $selenium.waitForPopUp ("Карточка", 30000)
  $selenium.selectWindow ("name=Карточка")
  $selenium.click ("css=div.dijitReset.dijitArrowButtonInner")
  $selenium.click ("id=dijit_MenuItem_0_text")
  $selenium.waitForPopUp ("Результат_исполнения", 30000)
  $selenium.selectWindow ("name=Результат_исполнения")
  $selenium.type ("id=edRegDt", 22.01.2015)
  $selenium.click ("id=btnOk")

  $selenium.stop
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ivanius,
ИМХО, все строковые данные надо в скобках писать.
 

ivanius

Знающий
Сообщения
74
Репутация
5
Да конечно, исправил, давно уже не спал(20ч) - видимо пора...
 
Автор
Y

Yago2015

Новичок
Сообщения
8
Репутация
0
madmasles, ivanius, все верно. Написание в скобках помогло программе запустить новое окно ff.
для теста я ее несколько подсократил. Вот
Код:
$Selenium = ObjCreate("SeleniumWrapper.WebDriver")
  $selenium.start ("firefox", "http://192.168.70.90:8080/")
  $selenium.setImplicitWait (5000)

  $selenium.open ("/task.htm?that=255&id=FEC665D77DC81E05E040E22E1FE344DC")
  $selenium.click ("css=div.dijitReset.dijitArrowButtonInner")
  $selenium.click ("id=dijit_MenuItem_0_text")
  $selenium.waitForPopUp ("Результат_исполнения", 30000)

  $selenium.stop

НО! при этом открывается новое окно ff, c нужным адресом надписью "время сессиии истекло"
http://i67.fastpic.ru/big/2015/0128/9e/a32dd3b4a3c858702a341790e1022e9e.jpg
Сессия соответственно связана с авторизацией. Она в другом окне ff и не завершена.
Вопрос - как присоединится к тому процессу ff где авторизация уже есть и там ввести эти данные?



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

Не пониманию, для Selenium важно что ли соблюсти всю последовательность команд selenium.open - selenium.click?
Код:
Func _WinWaitActivate($title,$text,$timeout=0)
	WinWait($title,$text,$timeout)
	If Not WinActive($title,$text) Then WinActivate($title,$text)
	WinWaitActive($title,$text,$timeout)
EndFunc

#endregion --- Internal functions Au3Recorder End ---
_WinWaitActivate("ДЭС: - Mozilla Firefox",""); активировать окно 

_WinWaitActivate(" РЕГИСТРАЦИОННАЯ КАРТА ДОКУМЕНТА #В","") ; активировать окно документа

 $selenium = ObjCreate("SeleniumWrapper.WebDriver")
   $selenium.click ("css=div.dijitReset.dijitArrowButtonInner")
  $selenium.click ("id=dijit_MenuItem_0_text")
  $selenium.waitForPopUp ("Результат_исполнения", 30000)

  $selenium.stop

Открывает нужное окно с авторизованным процессом, но ничего не работает.
P/S/ Там еще были клики мыши по координатам - я их пока убрал - делаю руками. Но все равно при открытии второго окна (документа) ничего не происходит. What's wrong?


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

Т.е. все сводится к тому, с чего и началось - нужно кликнуть в открытом окне на кнопки вида
Код:
  $selenium.click ("css=div.dijitReset.dijitArrowButtonInner")
  $selenium.click ("id=dijit_MenuItem_0_text")
сначала на одну, а затем в выпадающем списке на другую. Вот и всё.))
 
Верх