Перейти к содержимому

Фотография

проблема с динамическим контекстным меню


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 ESeregina

ESeregina

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Серегина Екатерина
  • Город:Москва

Отправлено 24 апреля 2012 - 08:34

Добрый день уважаемые форумчане!

Я с Selenium IDE работать только начинаю...не судите строго.... Прочитала все, что могла и по форуму и по справке и где только не читала уже, а проблему решить никак не могу... Помогите пожалуйста!

У меня на работе есть система CitoRus и её функционал нужно тестить. Грубо говоря это огромное веб-приложение с возможностями сравнимыми с PHP или тем же Си, работает на JS, а начинка Cache (что-то типа MUMPS, планируем переход).

И вот в этой системе у меня есть дерево объектов, типов и категорий. И необходимо проводить тест на создание всего этого и редактирование.
Щелчок правой кнопки у меня сделать получилось и даже отрабатывает клик внутри первого уровня меню, а вот дальше то оно раскрывается по наведении курсора...и обратиться к тем дивам я не могу... то есть при Записи теста он там что-то пишет, но потом обратиться к этому не реально...

Вот эти команды у меня отрабатывают нормально:
[info] Executing: |contextMenuAt | id=TR100_A346955-4044-62322-34289-42153 | |                   //открытие менюшки на элементе
[info] Executing: |click | //div[7]/span | |                                                     //клик на пункте Просмотр, например, все отрабатывает, справа на панели открываестя просмотр документа   

[info] Executing: |contextMenuAt | id=TR100_A346955-4044-62322-34289-42153 | |                   //открытие менюшки на элементе
[info] Executing: |click | //div[13]/div[3]/span | |                                             //копируем элемент например
[info] Executing: |contextMenuAt | id=TR100_A346955-4044-62322-34289-42153 | |                   //открытие менюшки на элементе
[info] Executing: |click | xpath=(//div[@onclick='$.cmenu.exec(this);'])[6] | |                  //еще один вариант выбора элемента, уже пункт Вставить
[info] Executing: |click | //div[@id='YesNoBt3']/input | |                                       //при вставке вылетает окно, так нажимается кнопка нет


А вот дальше проблемы. Как пройти во второй уровень меню? Напримет Создать -> Папку
Грубо говоря вот лог:
[info] Executing: |contextMenuAt | id=TR100_A346955-4044-62322-34289-42153 | |                   //открытие менюшки на элементе
[info] Executing: |focus | xpath=(//div[@onclick='$.cmenu.exec(this);'])[1] | |
[info] Executing: |mouseDown | xpath=(//div[@onclick='$.cmenu.exec(this);'])[1] | |
[info] Executing: |mouseMoveAt | xpath=(//div[@onclick='$.cmenu.exec(this);'])[1] | "10,10" |
[info] Executing: |mouseUp | xpath=(//div[@onclick='$.cmenu.exec(this);'])[1] | |
[info] Executing: |click | //div[15]/div/span | |                                                //вот этот клик никак не хочет работать
Мне же нужно подвести курсор к элементу Создать... чтоб раскрылось подменю и там уже выбрать элемент Папку. Как это можно организовать? Подскажите если сможете...


Никаких айдишников у дивов в системе нет и не будет никогда....все приходся делать примерно...
  • 0

#2 psihozik

psihozik

    Новый участник

  • Members
  • Pip
  • 39 сообщений

Отправлено 24 апреля 2012 - 11:58

Если я ничего не путаю, то вам наводить мышью вообще не нужно, селениум и так увидит этот элемент. Другое дело что если ваш /div[15]/div/span находится во фрейме(как контекстное меню в гугл доках), то перед кликом на этот элемент нужно прописать команду: selectFrame | <локатор фрейма>. Если не поможет, скинте кусок кода, так будет удобнее.
  • 0

#3 ESeregina

ESeregina

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Серегина Екатерина
  • Город:Москва

Отправлено 25 апреля 2012 - 05:36

Спасибо за ответ, но нет. Во фрейме он не лежит.

Какой код? Менюшки? А как это поможет? Написано на Cache же...

Непосредственно формирование меню:
cmenuOnTree ;кликнули правой кнопкой на дереве
 d var^bscito()
 n %zt s %zt=$zt s $zt="ErrcmenuOnTree^bsu2menu"
 n cmenu,nameObj,fm,flag,isRoot,Block,PrParent,a,idO,isRef,Acc,w1,w2,w3,isSuper,i,json,NORM,lev1,lev2,lev3,lev4,lev5
 s idO=$P(elid,"_",2),isRef=$p($P(elid,"_",1),"-",2),NORM="9000"  ;TR101-44526_A341005-3676-62367-47814-442797
 i idO="" d cm("","['!', '', function() {} ]"),cm("Notf","['! Это элемент навигации по страницам', '', function() {} ]"),cm("","['!', '', function() {} ]"),cm("","'-'") g cmEnd
 i $e(idO,$l(idO))="f",$e(idO,$l(idO)-1)?1n d cm("","['!', '', function() {} ]"),cm("Notf","['! это элемент файловой системы', '', function() {} ]"),cm("","['!', '', function() {} ]"),cm("","'-'") g cmEnd
 i $e(idO,$l(idO))="x",$e(idO,$l(idO)-1)?1n d cm("","['!', '', function() {} ]"),cm("Notx","['! стандартное контекстное меню отключено', '', function() {} ]"),cm("","['!', '', function() {} ]"),cm("","'-'") g cmEnd
 s type=$$GetAttr^bsu2obj(idO,"type") ;тип объекта
 i isRef'="" s PrParent=$$getParent4Ref^bsu2tree2(idO,isRef) ;в связи его родитель, а не он сам
 
 ;проверка выделенных объектов
 i mark'="",$$PreMarkCheck(.json) d  g cmEnd
 .d cm("","['!', '', function() {} ]"),cm("","['!"_json_"', '', function() {} ]"),cm("","['!', '', function() {} ]"),cm("","'-'") 
 .;d Mark 
 
 ;права доступа
 i $$isSuper^bsu2util() s Acc="acdrwkt",AccCr="acdrwkt,acdrwkt",isSuper=1 ;ему всё можно
 e  s Acc=$$AccesPermUserObl^bsu2pool($g(BSLOGIN),idO,"Node"),AccCr=$$AccesPermUserObl^bsu2pool($g(BSLOGIN),idO,"ContChild")_","_$$AccesPermUserObl^bsu2pool($g(BSLOGIN),idO,"ObjChild")
 s Block=$$IsBlock^bsu2obj(idO) 
 
 ;i $e(Block,1)=1,Acc["c" s Acc="cr" ;системная блокировка - разрешено создавать объекты для КК
 ;e  i $e(Block,1)>1 s Acc="r" ;другие блокировки
 s fm=$$GetAttr^bsu2obj(idO,"fm") ;функциональный маркер
 s nameObj=$$GetAttr^bsu2obj(idO,"name")
 d vesind^bsu2trees(idO,$g(isFolder),$g(@bs(0)@(idO,"stat")),nameObj)
 s nameObj=$$Clean4Html^bsu2trees(nameObj)
 ;-------------------
 i idO="Obj"!(idO=$g(@bs(22)@(BSSES,"KK"))) d  g cmEnd  ;это рут объектов 
 .s isRoot=1
 .d CreatO(idO,elid),Acc ;DevMenuTree,Acc
 .d cm("","'-'") d Mark,Ins(idO,elid),Prop
 ;------------------- 
 i idO="ObjDel" d  g cmEnd  ;это рут корзины
 .d isRecycle
 .i isRef="" d Ref
 .e  d DelRef("")
 ;------------------- 
 i idO["ObjDel" d  g cmEnd  ;это узел корзины
 .d isRecycle
 ;-------------------
 i $$IsDelete^bsu2obj(idO) d  g cmEnd  ;мы в помойке
 .d isRecycle
 .d Rest,CutCopy,Mark,Kill("P")
 ;------------------- 
 i $$IsRecycle^bsu2obj(idO) d  g cmEnd  ;мы глубже в помойке
 .d isRecycle
 .d CutCopy,Mark
 ;-------------------
 if $g(isFolder) d  i 1 ;мы на контейнере
 .d CreatO(idO,elid),Marsh d cm("","'-'")
 .d CutCopy
 .d Ins(idO,elid) d cm("","'-'") d Edit d cm("","'-'")
 .d Mark
 .d Kill("")
 .d Prop
 else  d  ;это объект
 .s paridO=$$GetParent^bsu2obj(idO) ;берём родителя
 .i isRef'="" s paridO=PrParent ;если связь, то берём приёмного родителя
 .i paridO'="" d  
 ..s el="TR"
 ..s el=el_$e($p(elid,"_",1),3,9)_"_"_paridO ;подстановка элемента родителя
 ..d CreatO(paridO,el)
 .d Marsh d cm("","'-'")
 .d CutCopy
 .i paridO'="" d Ins(paridO,$g(el)) 
 .d cm("","'-'") d Edit d cm("","'-'")
 .d Mark
 .d Kill("")
 .d Prop
 g cmEnd 
 

Пример JSON ответа сервера из чего дерево формируется (не полный, просто пример):

[ 
['Создать...','colNew',false,[
[ 'Выбрать из списка...','colNew',function(){m.m.RunCMenu('CreatObj','TR100_-AutoTest',1);}]
,'-'
,['<font color=Chocolate>AutoTest</font>','',function(){m.m.RunCMenu('CreatO','TR100_-AutoTest',1,'-AutoTestType');}]
,['Последние...','',false,[
['<font color=Chocolate>AutoTest</font> ','',function(){m.m.RunCMenu('CreatO','TR100_-AutoTest',1,'-AutoTestType');}]
,['<font color=Chocolate>RestService</font> ','',function(){m.m.RunCMenu('CreatO','TR100_-AutoTest',1,'-RestService');}]
,['<font color=Chocolate>-Route</font> Описание типа утилит','',function(){m.m.RunCMenu('CreatO608','TR100_-AutoTest',1,'-Route');}]
]]
,'-'
,['Папку','container',function(){m.m.RunCMenu('CreatO1','TR100_-AutoTest',1,'-Container');}]
,['Группу пользователей','group',function(){m.m.RunCMenu('CreatO2','TR100_-AutoTest',1,'-Group');}]

,['Пользователя','user',function(){m.m.RunCMenu('CreatO3','TR100_-AutoTest',1,'-UserAdv');}]
,['Типы','rt',function(){m.m.RunCMenu('CreatO4','TR100_-AutoTest',1,'-Type');}]
,['Категории','ro',function(){m.m.RunCMenu('CreatO5','TR100_-AutoTest',1,'-Cate');}]
,[ 'Утилиты','util', false,[
['Утилита','util',function(){m.m.RunCMenu('CreatO609','TR100_-AutoTest',1,'-Utility');}]
,['Утилита URL','util_url',function(){m.m.RunCMenu('CreatO601','TR100_-AutoTest',1,'-UtilityUrl');}]
,['Мастер','util_wizard',function(){m.m.RunCMenu('CreatO602','TR100_-AutoTest',1,'-UtilityWiz');}]
,['Таблица','util_tabl',function(){m.m.RunCMenu('CreatO603','TR100_-AutoTest',1,'-Tables');}]
,['Отчет','util_report',function(){m.m.RunCMenu('CreatO604','TR100_-AutoTest',1,'-Report');}]
,['Экспорт','util_export',function(){m.m.RunCMenu('CreatO606','TR100_-AutoTest',1,'-UtilExport');}]

,['Импорт','util_import',function(){m.m.RunCMenu('CreatO607','TR100_-AutoTest',1,'-UtilImport');}]
,['Маршруты','util_marshrut',function(){m.m.RunCMenu('CreatO608','TR100_-AutoTest',1,'-Route');}]
,['Actions','action',function(){m.m.RunCMenu('CreatO611','TR100_-AutoTest',1,'-UtilityAct');}]
,['Events','event',function(){m.m.RunCMenu('CreatO610','TR100_-AutoTest',1,'-UtilityEve');}]
,['Вкладка','util',function(){m.m.RunCMenu('CreatO612','TR100_-AutoTest',1,'-UtilityTab');}]
,['Кнопка для вкладки','util',function(){m.m.RunCMenu('CreatO613','TR100_-AutoTest',1,'-UtilityBat');}]
]]
,['Форму','form',function(){m.m.RunCMenu('CreatO7','TR100_-AutoTest',1,'-Form');}]
,'-'
,['Заявку~создать заявку','tree_red',function(){try{ var par_id='TR100_-AutoTest'; m.m.RunCMenu('CreatO',elemid,1,'-MenuItem');}catch(e){}}]
]]
,['Маршрут..', 'util_marshrut', false,[
['Отправить', '', function() {y.f.RouteForRanger('TR100_-AutoTest');}]
]]
,'-'
,['Копировать~Копировать в буфер обмена', 'colClone', function() {var res=m.a.getsyn('PostMarkCheck^bsu2tree2','elid='+elid+'&Act=&mark='+mark+'&mark2='+mark2); if (res!=' ') {y.m.AbortAction('Отменено копирование',m.$P(res,'~',1),m.$P(res,'~',2));} else { m.m.RunCMenu('Copy',elid,isFolder);}}]
,['Перенести~Копировать в буфер обмена с последующим переносом', 'cut', function() { var res=m.a.getsyn('PostMarkCheck^bsu2tree2','elid='+elid+'&Act=d&mark='+mark+'&mark2='+mark2); if (res!=' ') {y.m.AbortAction('Отменено перенос',m.$P(res,'~',1),m.$P(res,'~',2));} else { m.m.RunCMenu('Move',elid,isFolder);}}]
,[ 'Вставить копированием <font color=Red>1</font>~Вставить из буфера обмена','ins',function(){m.m.RunCMenu('Ins','TR100_-AutoTest',1);}]
,[ 'Вставить связь. <font color=Red>1</font>','link',function(){m.m.RunCMenu('InsRef','TR100_-AutoTest',1);}]
,'-'
,['Просмотр / Запуск~Просмотр объектов / Запуск утилит', '', function() {m.m.RunCMenu('View',elid,isFolder);}]


Селениум не может найти элемент по тому локатору, который оп прописывает в цели если через запись пример сделать. То есть если я запишу как кликаю открываю меню и делаю свой выбор он повротить этот тест не сможет...Хотя там всего две строчки:
[info] Executing: |contextMenuAt | id=TR100_A346955-4044-62322-34289-42153 | |
[error] locator not found: //div[15]/div/span 

Я не понимаю откуда берется цифра 15 вообще....а xpath я посмотреть не могу...ибо это меню и оно в код попадает лишь на момент когда оно там есть...
А как закроешь снова исчезает, я даже не могу до него путь от body просчитать...

Я знаю, что первый пункт меню первого уровня ("Создать...") можно задать и как xpath=(//div[@onclick='$.cmenu.exec(this);'])[1] а можно и как //div[11]/div/span. И я не понимаю, почему там уже 11? С чего это? Почему 1 пункт 1 уровня [11], а 1 пункт 2 уровня уже [15] хотя в 1 уровне отнюдь не 4 пункта, там около 10... Откуда такие странные цифры могут быть? Нумерация дивов вообще вычислению не поддается... и локатор который селениум сам написал при записи им же не воспримимается. Как такое может быть? Странно...

Можно ли надать кнопку меню по названию например? Какой правильный локатор выбрать я даже и придумать не могу уже...

Вот так он тоже не распознает:
[info] Executing: |click | xpath=//div[contains(text(),'Выбрать из списка...')] | |
[error] Element xpath=//div[contains(text(),'Выбрать из списка...')] not found




Вытащила код менюшки все таки :) Может поможет чем, вот:
<div class="cmenu_base_style" iuid="301" style="left: 52px; top: 2px; display: block;">
<div class="cmenuItem_base_style" onmouseout="clearTimeout($.cmenu.to);$.cmenu.onOutItem($(this));" onmouseover="$.cmenu.onHoverItem($(this));var t=this;$.cmenu.to=setTimeout(function(){$.cmenu.show(302,t);},50);" onclick="$.cmenu.exec(this);" item_id="0" title="">
<img width="16" title=" " alt=" " src="mjs/cmenu/imgs/base_style/colNew.png">
<span class="cmenuSpan_base_style">Создать...</span>
<img width="16" style="position:absolute;right:0px;vertical-align:middle;" title=" " alt=" " src="mjs/cmenu/imgs/base_style/page-next.gif">
</div>
<div class="cmenuItem_base_style" onmouseout="clearTimeout($.cmenu.to);$.cmenu.onOutItem($(this));" onmouseover="$.cmenu.onHoverItem($(this));var t=this;$.cmenu.to=setTimeout(function(){$.cmenu.show(303,t);},50);" onclick="$.cmenu.exec(this);" item_id="1" title="">
<img width="16" title=" " alt=" " src="mjs/cmenu/imgs/base_style/util_marshrut.png">
<span class="cmenuSpan_base_style">Маршрут..</span>
<img width="16" style="position:absolute;right:0px;vertical-align:middle;" title=" " alt=" " src="mjs/cmenu/imgs/base_style/page-next.gif">
</div>
<hr size="1" noshade="" color="#fedf8f">
<div class="cmenuItem_base_style" onmouseout="clearTimeout($.cmenu.to);$.cmenu.onOutItem($(this));" onmouseover="$.cmenu.onHoverItem($(this));$.cmenu.to=setTimeout(function(){var m = $.cmenu.getMenu(301);m && m.sub && $.cmenu.hideMenu(m.sub);},50);" onclick="$.cmenu.exec(this);" item_id="3" title="Копировать в буфер обмена">
<img width="16" title=" " alt=" " src="mjs/cmenu/imgs/base_style/colClone.png">
<span class="cmenuSpan_base_style">Копировать</span>
</div>

  • 0

#4 ESeregina

ESeregina

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Серегина Екатерина
  • Город:Москва

Отправлено 25 апреля 2012 - 06:14

Всем спасибо! Проблема решена и тема закрыта!
Если у кого-то возникнет такая же ситуация вот решение...

Лог:
[info] Executing: |contextMenuAt | id=TR100_A346955-4044-62322-34289-42153 | |
[info] Executing: |mouseOverAndWait | xpath=//span[contains(text(),'Создать...')] | |
[info] Executing: |click | xpath=//span[contains(text(),'Выбрать из списка...')] | |

Код:
<tr>
	<td>contextMenuAt</td>
	<td>id=TR100_A346955-4044-62322-34289-42153</td>
	<td></td>
</tr>
<tr>
	<td>mouseOverAndWait</td>
	<td>xpath=//span[contains(text(),'Создать...')]</td>
	<td></td>
</tr>
<tr>
	<td>click</td>
	<td>xpath=//span[contains(text(),'Выбрать из списка...')]</td>
	<td></td>
</tr>

  • 0

#5 psihozik

psihozik

    Новый участник

  • Members
  • Pip
  • 39 сообщений

Отправлено 25 апреля 2012 - 07:30

Вытащила код менюшки все таки :) Может поможет чем, вот:

<div class="cmenu_base_style" iuid="301" style="left: 52px; top: 2px; display: block;">
<div class="cmenuItem_base_style" onmouseout="clearTimeout($.cmenu.to);$.cmenu.onOutItem($(this));" onmouseover="$.cmenu.onHoverItem($(this));var t=this;$.cmenu.to=setTimeout(function(){$.cmenu.show(302,t);},50);" onclick="$.cmenu.exec(this);" item_id="0" title="">
<img width="16" title=" " alt=" " src="mjs/cmenu/imgs/base_style/colNew.png">
<span class="cmenuSpan_base_style">Создать...</span>
<img width="16" style="position:absolute;right:0px;vertical-align:middle;" title=" " alt=" " src="mjs/cmenu/imgs/base_style/page-next.gif">
</div>
<div class="cmenuItem_base_style" onmouseout="clearTimeout($.cmenu.to);$.cmenu.onOutItem($(this));" onmouseover="$.cmenu.onHoverItem($(this));var t=this;$.cmenu.to=setTimeout(function(){$.cmenu.show(303,t);},50);" onclick="$.cmenu.exec(this);" item_id="1" title="">
<img width="16" title=" " alt=" " src="mjs/cmenu/imgs/base_style/util_marshrut.png">
<span class="cmenuSpan_base_style">Маршрут..</span>
<img width="16" style="position:absolute;right:0px;vertical-align:middle;" title=" " alt=" " src="mjs/cmenu/imgs/base_style/page-next.gif">
</div>
<hr size="1" noshade="" color="#fedf8f">
<div class="cmenuItem_base_style" onmouseout="clearTimeout($.cmenu.to);$.cmenu.onOutItem($(this));" onmouseover="$.cmenu.onHoverItem($(this));$.cmenu.to=setTimeout(function(){var m = $.cmenu.getMenu(301);m && m.sub && $.cmenu.hideMenu(m.sub);},50);" onclick="$.cmenu.exec(this);" item_id="3" title="Копировать в буфер обмена">
<img width="16" title=" " alt=" " src="mjs/cmenu/imgs/base_style/colClone.png">
<span class="cmenuSpan_base_style">Копировать</span>
</div>


Именно этот код и был нужен, тут видно что кликать надо не на div, а на span, кстати попробуйте без mouseovera, может сработать. По поводу div[15]-число 15 означает что это 15 div на странице в целом, а не только в меню.
  • 0

#6 ESeregina

ESeregina

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Серегина Екатерина
  • Город:Москва

Отправлено 27 апреля 2012 - 05:15

Без mouseOverAndWait не отработает. Только так он раскрывает пункт меню и дает доступ к его подпунктам...иначе их пока просто не существует...
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных